MSDN原文:
1:CreateRemoteThread
HANDLE WINAPI CreateRemoteThread(
__in HANDLE hProcess,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out LPDWORD lpThreadId
);
A pointer to a variable to be passed to the thread function.(不知道是我E文太烂还是什么)
这个lpParameter 的确不咋地,它让我误解了,我的错误理解:
这个lpParameter是指向你所要传给ThreadProc的参数的指针了!!
2:ThreadProc
An application-defined function that serves as the starting address for a thread.
Specify this address when calling the CreateThread or CreateRemoteThread function
The LPTHREAD_START_ROUTINE type defines a pointer to this callback function. ThreadProc is a placeholder for the application-defined function name.
DWORD WINAPI ThreadProc(
[in] LPVOID lpParameter );
-
lpParameter
-
The thread data passed to the function using the lpParameter parameter of the CreateThread or CreateRemoteThread function.(这句解释道出了真谛,)
这两个API中的 LPVOID lpParameter 其实只是个LPVOID大小的一个参数而已,(
所以我觉得如下声明更好一些:
[in] DWORD dwParam
也就说我在调用CreateRemoteThread时传给它的参数就是ThreadProc收到的参数
当然你自己可以把它解析成一个指针!!这在需要传递更大、更多的参数时是必须的!
我的误解导致了我几个小时没有调通我的程序:
BOOL WINAPI FreeLibrary(
__in HMODULE hModule
);
我需要在远程进程的中新建线程调用FreeLibrary卸掉一个DLL
我通过LoadLibrary、GetModuleHandle成功得到该DLL的句柄之后,
我一直在尝试用VirtualAllocEx、WriteProcessMemory把这个值写到远程地址空间。。。。
其实大可不必,正确的方法:
::CreateRemoteThread( m_hProcess, 0, 0, (LPTHREAD_START_ROUTINE)..(FreeLibrary的地址), hModule, 0, 0);
就万事大吉了!!!!
而我饶了好大一圈不说,还绕错了!!!
汗死了!!!