Собственно задача состоит в том, чтобы exe файл самоуничтожился. Как можно реализовать на с++?
void DelSelf(void)
{
char modulename[MAX_PATH];
char batfile[MAX_PATH];
char batlines[MAX_PATH*4];
LPSTR tempdir;
char Buf[MAX_PATH];
GetModuleFileName(NULL,modulename,MAX_PATH);
tempdir = ((GetEnvironmentVariable(TEXT("TEMP"),
Buf, MAX_PATH) > 0) ? Buf : NULL);
strcpy(batfile,tempdir);
strcat(batfile,"\\");
strcat(batfile,"delself.bat");
strcpy(batlines,"@echo off\n:try\ndel ");
strcat(batlines,modulename);
strcat(batlines,"\nif exist ");
strcat(batlines,modulename);
strcat(batlines," goto try\n");
strcat(batlines,"del ");
strcat(batlines,batfile);
DWORD NOfBytes;
HANDLE hbf= CreateFile(batfile, GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hbf,batlines,strlen(batlines),&NOfBytes, NULL);
CloseHandle(hbf);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.wShowWindow = SW_SPOILER;
si.dwFlags = STARTF_USESHOWWINDOW;
CreateProcess(
NULL,
batfile,
NULL,
NULL,
FALSE,
IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
NULL,
NULL,
&si,
&pi);
}
BOOL SelfDelete()
{
TCHAR szFile[MAX_PATH], szCmd[MAX_PATH];
if((GetModuleFileName(0,szFile,MAX_PATH)!=0) &&
(GetShortPathName(szFile,szFile,MAX_PATH)!=0))
{
lstrcpy(szCmd,"/c del ");
lstrcat(szCmd,szFile);
lstrcat(szCmd," >> NUL");
if((GetEnvironmentVariable("ComSpec",szFile,MAX_PATH)!=0) &&
((INT)ShellExecute(0,0,szFile,szCmd,0,SW_SPOILER)>32))
return TRUE;
}
return FALSE;
}
__asm
{
lea eax, hModule
push 0
push 0
push eax
push ExitProcess
push szModuleName
push DeleteFile
push FreeLibrary
ret
}
// SelfDelete.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <windows.h>
#include <psapi.h>
#include <stdio.h>
#define MsgBox(lpMsg)MessageBox(0,lpMsg,"Msg",0)
typedef BOOL (WINAPI *mytype_DeleteFile)(LPCTSTR);
#pragma comment (lib, "psapi.lib")
DWORD GetProcessIdByName (char* lpProcessName);
void GetError ()
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
// Free the buffer.
LocalFree(lpMsgBuf);
}
DWORD GetProcessIdByName (char* lpProcessName)
{
// Get the list of process identifiers.
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if (!EnumProcesses (aProcesses, sizeof(aProcesses), &cbNeeded ))
return 0;
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
char szProcessName[MAX_PATH] = "unknown";
for (i = 0; i < cProcesses; i++)
{
HANDLE hProcess = OpenProcess (PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, aProcesses[i]);
// Get the process name.
if ( hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules (hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName (hProcess, hMod, szProcessName,
sizeof(szProcessName));
}
}
// Print the process name and identifier.
if(!lstrcmpi (szProcessName, lpProcessName))
{
CloseHandle (hProcess);
return aProcesses[i];
}
CloseHandle (hProcess);
}
return NULL;
}
typedef struct _addr_data
{
LPVOID deletefile;
char szFileName [0xFF];
} addr_data, *paddr_data;
static void WINAPI my_injected (void* address)
{
paddr_data my_addr_data;
my_addr_data = (paddr_data)address;
mytype_DeleteFile deletefile;
deletefile = (mytype_DeleteFile)(my_addr_data->deletefile);
deletefile (my_addr_data->szFileName);
}
static void WINAPI my_injected_end (void* address)
{
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
addr_data my_data;
HINSTANCE hKernel = LoadLibrary ("kernel32.dll");
my_data.deletefile = GetProcAddress (hKernel, "DeleteFileA");
char szBuffer [MAX_PATH];
GetModuleFileName (GetModuleHandle (NULL), szBuffer, sizeof(szBuffer));
strcpy(my_data.szFileName, szBuffer);
DWORD dwExplorerID = GetProcessIdByName("explorer.exe");
HANDLE hExplorer = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwExplorerID);
if(hExplorer==INVALID_HANDLE_VALUE)
{
MsgBox ("Can\'t open process");
return 0;
}
LPVOID lpDataMem = VirtualAllocEx(hExplorer, 0, sizeof (addr_data), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (lpDataMem == NULL)
{
MsgBox("Can\'t allocate memory for data in process space");
GetError ();
return 0;
}
DWORD dwThreadLength = (PBYTE)&my_injected_end-(PBYTE)&my_injected;
LPVOID lpMem = VirtualAllocEx(hExplorer, 0, dwThreadLength, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (lpMem == NULL)
{
MsgBox("Can\'t allocate memory for thread in process space");
GetError ();
return 0;
}
PVOID pIntruderAddress = &my_injected;
ULONG ulBytesWritten = 0;
BOOL res = WriteProcessMemory (hExplorer, lpMem, pIntruderAddress, dwThreadLength, &ulBytesWritten);
if(res == NULL)
{
MsgBox("Can\'t write thread in process space");
return 0;
}
res = WriteProcessMemory (hExplorer, lpDataMem, &my_data, sizeof(addr_data),&ulBytesWritten);
if(res == NULL)
{
MsgBox("Can\'t write data in process space");
return 0;
}
DWORD dwThreadId = 0;
HANDLE hRemote = CreateRemoteThread(hExplorer, NULL, dwThreadLength, (unsigned long (__stdcall *)(void *))lpMem, lpDataMem, 0, &dwThreadId);
return 0;
}
:delcycle
del "prog.exe"
if exist "prog.exe" goto delcycle
del "selfdel.bat"
@echo off
taskkill /f /im prog.exe>nul
del prog.exe>nul
del selfdel.bat>nul
taskkill /PID xxxx /F
void MyDelSelf_lowCPUusage() // задержка перед каждой попыткой удаления 1 сек
{
char batlines[512];char temp[256];
strcpy(batlines, "@echo off\r\n:label1\r\nping -n 1 -w 1 127.0.0.1 > nul\r\ndel \"");//после -n - задержка в сек, 1 - 1 сек
GetModuleFileName(0,temp,sizeof(temp));
strcat(batlines,temp);strcat(batlines,"\"\r\nif EXIST \""); strcat(batlines,temp);
strcat(batlines,"\" goto label1\r\ndel \"");
ZeroMemory(temp, sizeof(temp));
GetEnvironmentVariable("TEMP",temp,sizeof(temp)); strcat(temp,"\\del.bat");
strcat(batlines,temp); strcat(batlines,"\"");
HANDLE delbat= CreateFile(temp, GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
DWORD NOfBytes;
WriteFile(delbat,batlines,strlen(batlines),&NOfBytes, NULL);
CloseHandle(delbat);
ShellExecute(0,"open",temp,0,0,SW_SPOILER);
}
туплю =))taskkill /PID xxxx /F
а вместо xxxx писала свой пид)
я ж и говорил что если не подходит по имени - фигачим по пиду
DelSelf();
ExitProcess(0);
taskkill /f /im prog.exe>nul
del prog.exe>nul
del selfdel.bat>nul