
user32Handle
=
::GetModuleHandle(TEXT(
"
kernel32
"
));

//
得到kernel32模块句柄

processHandle
=
::OpenProcess(PROCESS_CREATE_THREAD
|
PROCESS_QUERY_INFORMATION
|
PROCESS_VM_OPERATION
|
PROCESS_VM_WRITE
|
PROCESS_VM_READ,FALSE,getExplorerPID());

//
用explorer的PID来打开进程,并得到创建线程和写的权限。

dataAddr
=
::VirtualAllocEx(processHandle,
0
,
sizeof
(THREADDATA),MEM_COMMIT,PAGE_EXECUTE_READWRITE);

//
在explorer的内存内里申请一块内存来存所用的数据

THREADDATA data
=
{TEXT("a.exe"),(WINEXEC)GetProcAddress(user32Handle,"WinExec"),}
;

WriteProcessMemory(processHandle,dataAddr,
&
data,
sizeof
(THREADDATA),
&
byteWrited);

//
把数据写到申请的内存中

codeAddr
=
::VirtualAllocEx(processHandle,
0
,sizeOfThreadProc,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

//
申请代码的内存区

WriteProcessMemory(processHandle,codeAddr,
&
ThreadProc,sizeOfThreadProc,
&
byteWrited);

//
把代码写进去,这时我们己经把我们要用的代码和数据都准备好了。

threadHandle
=
CreateRemoteThread(processHandle,NULL,
0
, LPTHREAD_START_ROUTINE)codeAddr,dataAddr,
0
,(LPDWORD)threadID);

//
在explorer中创建一个线程,来执行启动abc.exe的代码。所需的数据都己经在explorer的内存块中,所以不会出问题。

WaitForSingleObject(threadHandle, INFINITE);

VirtualFreeEx(processHandle,dataAddr,
0
,MEM_RELEASE);

VirtualFreeEx(processHandle,codeAddr,
0
,MEM_RELEASE);

CloseHandle(threadHandle);

CloseHandle(processHandle);

//
等待执行完毕,释放内存,关闭句柄。