执行完createremotethread后explorer报错。不知道错在哪里。如何改?
#include "stdafx.h"#include <tlhelp32.h>
#pragma comment (lib,"Advapi32.lib")const DWORD THREADSIZE=1024*4;DWORD WINAPI MyTest( LPVOID lpParameter )
{
::MessageBox(0,"hi",0,0);
return 0;
}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
DWORD pid=0;
HANDLE hSnapshot = NULL;

hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);

PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);

Process32First(hSnapshot,&pe);

do
{
if(_strnicmp(pe.szExeFile,"explorer.exe",strlen("explorer.exe"))==0)
{
pid = pe.th32ProcessID;
break;
}
}
while(Process32Next(hSnapshot,&pe)==TRUE);

CloseHandle (hSnapshot);
if(!pid) return 0; HANDLE hRemoteProcess = NULL,hRemoteThread = NULL;

hRemoteProcess = OpenProcess(
PROCESS_QUERY_INFORMATION | // Required by Alpha
PROCESS_CREATE_THREAD | // For CreateRemoteThread
PROCESS_VM_OPERATION | // For VirtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE, // For WriteProcessMemory
FALSE, pid);
void * pRemoteThread = VirtualAllocEx(hRemoteProcess, 0, THREADSIZE, MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if(!WriteProcessMemory(hRemoteProcess, pRemoteThread, &MyTest, THREADSIZE,0))
return 0;
hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0, (DWORD (WINAPI *)(LPVOID))pRemoteThread, 0, 0, NULL);

return 0;
}

解决方案 »

  1.   

    嘿嘿,这个嘛,
    你可以找找《windows核心编程》看看,它附带的程序也很不错。
    www.vckbase.com上也有一些讨论。
      

  2.   

    现在的问题是:我找到的例子是在远程线程中loadlibrary的,我需要注入我自己的线程函数。所以有了上面帖的代码,但是它不好使。看起来好像没什么问题 :(
      

  3.   

    if(!WriteProcessMemory(hRemoteProcess, pRemoteThread, &MyTest, THREADSIZE,0))
    这一句是不是应该把 &MyTest 改成 MyTest? 函数名本身就是函数所在的在址了,
      

  4.   

    如果涉及到在远程线程变量的运用时,只能用win32asm做到,这涉及到重定位问题
    用高级语言创建远程线程的步骤:
    1。先写自己的一个dll
    2。获取Kernel32.dll中LoadLibraryA的地址
    3。找出要寄生的进程
    4。将自己dll的路径字符串用WriteProcessMemory copy到寄生进程就CreateRemoteThread
    5。the end.
      

  5.   

    千万不要使用Debug版本,必须使用Release版本!你的代码应该是正确的,但是有一点很不好,就是const DWORD THREADSIZE=1024*4;