Самоудаление файла с помощью .bat

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by winsock, 5 Sep 2010.

  1. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Написал функцию,программа и батник самоудается, но не всегда.

    Например с рабочего стола XP не получается,новерное путь к удаляемой программе слишком длинный ?как исправить ?и проверте Бат код ,пишу на нем первый раз...
    Code:
    void selfDel(char* moduleName)
    {
    	char batFile[MAX_PATH]="C:\\delself.bat";
    	char batLines[MAX_PATH*4];
    
    	strcpy(batLines,":Return");
    	strcat(batLines,"\r\ndel \"");
    	strcat(batLines,moduleName);
    	
    	strcat(batLines,"\"\r\nif exist \"");
    	strcat(batLines,moduleName);
    	
    	strcat(batLines,"\" goto Return \r\ndel \"");
    	strcat(batLines,batFile);
    	strcat(batLines,"\"");
    
    	DWORD byte;
    
    	HANDLE file = CreateFile(batFile, GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
    	if(file==INVALID_HANDLE_VALUE)
    		return;
    
    	WriteFile(file,batLines,strlen(batLines),&byte, NULL);
    
    	CloseHandle(file);
    
    	STARTUPINFO si;
    	ZeroMemory( &si, sizeof(si) );
    	PROCESS_INFORMATION pi;
    
    	CreateProcess(batFile,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&si,&pi);
    }
    
    
    
    
    
    
    
     
  2. Voland-791

    Voland-791 Member

    Joined:
    1 May 2009
    Messages:
    163
    Likes Received:
    13
    Reputations:
    5
    - самоудаление
     
  3. totenkopf

    totenkopf Elder - Старейшина

    Joined:
    19 Jul 2010
    Messages:
    91
    Likes Received:
    63
    Reputations:
    19
    Все дело в кодовых страницах и пробелах в пути к файлу. Более правильно было бы изпользовать WSH. Скрипты .vbs .js
     
  4. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    однозначно ;)
     
  5. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Чего проверять ?Вы имеете в виду ,что код элементарен и его проверять не нужно ? или именно бат код показать ?


    2totenkopf Можете написать скрипт ?мне честно говоря лень гуглить и разбираться в синтаксисе... Ведь там наверняка 2-4 строчки?
     
    #5 winsock, 5 Sep 2010
    Last edited by a moderator: 5 Sep 2010
  6. xmadstyle

    xmadstyle Member

    Joined:
    29 Aug 2008
    Messages:
    91
    Likes Received:
    53
    Reputations:
    24
    Держи то, что тебе нужно:
    Code:
    procedure RemoveServer();
    var
    DeleteBat: TextFile;
    begin
      try
        begin
          AssignFile(DeleteBat, ExtractFileDir(ParamStr(0)) + '\Uninstall.bat');
          Rewrite(DeleteBat);
          WriteLn(DeleteBat, '@Echo OFF');
          WriteLn(DeleteBat, ':Loop');
          WriteLn(DeleteBat, 'del %1');
          WriteLn(DeleteBat, 'if exist %1 goto Loop');
          WriteLn(DeleteBat, 'del %0');
          WriteLn(DeleteBat, 'exit');
          CloseFile(DeleteBat);
          ShellExecute(GetForegroundWindow(), 'open', PChar(ExtractFileDir(ParamStr(0)) + '\Uninstall.bat'), PChar(ParamStr(0)), PChar(ExtractFileDir(ParamStr(0))), SW_HiDE);
        end;
      except
      end;
      Halt;
    end;
     
  7. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Ваш батник почти токой же. В общем с раб. стола все ровно не удаляет под XP
    В конце по другому , но это не важно , батник самоудаляется...
    Генерируемый батник :
     
  8. totenkopf

    totenkopf Elder - Старейшина

    Joined:
    19 Jul 2010
    Messages:
    91
    Likes Received:
    63
    Reputations:
    19
    Не .bat конечно но тоже неплохой способ. :)

    Code:
    .386
    .model flat,stdcall
    option casemap:none
    
       include windows.inc
       include user32.inc
       include kernel32.inc
       
       includelib user32.lib
       includelib kernel32.lib
    
    .data
    	comspec db "COMSPEC",0
      	format db '/c del %s',0
    .data?
    	cmdpath db 260 dup(?)
       	cmdline dd ?
       	cmdparam db 260 dup(?)
       	sinf STARTUPINFO <>
       	pinf PROCESS_INFORMATION <>
    .code
    start:
    	invoke GetEnvironmentVariable,addr comspec,addr cmdpath,260
    	invoke GetCommandLine
    	mov cmdline,eax
    	invoke wsprintf,addr cmdparam,addr format,cmdline
    	invoke RtlZeroMemory,addr sinf,sizeof sinf
    	mov sinf.cb,sizeof sinf
    	invoke CreateProcess,addr cmdpath,addr cmdparam,NULL,NULL,FALSE,CREATE_SUSPENDED or CREATE_NO_WINDOW,NULL,NULL,addr sinf,addr pinf
    	invoke SetPriorityClass,pinf.hProcess,IDLE_PRIORITY_CLASS
    	invoke SetThreadPriority,pinf.hThread,THREAD_PRIORITY_IDLE
    	invoke GetCurrentProcess
    	push eax
    	invoke SetPriorityClass,eax,HIGH_PRIORITY_CLASS
    	invoke GetCurrentThread
    	invoke SetThreadPriority,eax,THREAD_PRIORITY_HIGHEST
    	invoke ResumeThread,pinf.hThread
    	pop eax
    	invoke TerminateProcess,eax,0
    end start
    
     
    #8 totenkopf, 25 Sep 2010
    Last edited: 25 Sep 2010
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ну удаление удаление. а кто будет кодировку из ANSI в OEM переводить? или устанавливать для консоли ANSI кодировку.
     
  10. totenkopf

    totenkopf Elder - Старейшина

    Joined:
    19 Jul 2010
    Messages:
    91
    Likes Received:
    63
    Reputations:
    19
    Согласен не досмотрел. Допускаю, что можно использовать чтото вроде
    Code:
    cmd.exe /c chcp 1251 &&  del "блабла"
    
     
  11. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,582
    Likes Received:
    1,310
    Reputations:
    1,557
    CharToOem для этого есть