在Windows核心编程的第22章22.4节,使用远程线程注入DLL中,获取Kernel32中LoadlibraryW的地址时,书上说到:根据经验,系统在每个进程中会将Kernel32.dll映射到同一个地址。因此要向下面这样调用CreateRemoteThread:
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
HANDLE hThread = CreateRemoteHandle(hProcessHandle, NULL, 0, pfnThreadRtn, pszLibFileRemote, 0, NULL);我按照书上的样子写了个Demo,做了个类似的Hook,注入到所有进程中,结果只有我自己的这个进程中是正确加载了我的HookDLL,其余进程都没有加载HookDll。。
所以感觉书上说的不对,pfnThreadRtn应该只能获取到本进程中Kernel32中的LoadLibraryW的地址,而其他进程中Kernel32中的LoadLibraryW地址并非一样。。

解决方案 »

  1.   

    系统在每个进程中会将Kernel32.dll映射到同一个地址并没有说能获取其他进程中的地址吧?
      

  2.   

    CreateRemoteHandle这个是你自己定义的函数,还是你打错了,是CreateRemoteThread函数,
    hProcessHandle这个是要注入的进程句柄,还是你自己的句柄。
    让所有进程加载一个DLL,好像是设置钩子吧。
    这个CreateRemoteProcess只是针对某一个进程你那个方法只会让指定的进程加载DLL。
    不知道,回答的是不是你所问的
      

  3.   

    楼主没有仔细看<<Windows核心编程>>,或者至少是没有完全看懂。上面这一节描述了如何向特定进程注入dll,并没有说可以向系统中“所有的进程”注入dll.--在vista之后的系统,这是不可能完全的。
      

  4.   

    可能我孤陋寡闻了,没见过CreateRemoteHandle(汗颜,没有认真读过Windows核心编程,正在翻……)我尝试过CreateRemoteThread,在XP下没问题,在Vista上要用CreateRemoteThreadEx,在Win7下这个函数ms失效了,一直没成功过。lz注意一下,虽然Kernel.dll一般映射的地址在各进程中一样,但是用CreateRemoteThread来远程调用LoadLibrary时,要传递一个dll文件名的参数(LPCTSTR或LPCWSTR),这个地址并不一样,OpenProcess等来创建远程变量如果不行的话,lz要不要试试别的方法注入dll,比如全局消息钩子
      

  5.   

    Vista之后的系统kernel32.dll等的加载地址被随机化,成功的概率不到1/256……
      

  6.   

    感谢各位的见解以及纠正。。
    CreateRemoteHandle确实是手误。。应该是CreateRemoteThread
    应该是我理解有误吧,书上确实说到:根据经验,系统在每个进程中会将Kernel32.dll映射到同一个地址。
    所以我实验了吧,枚举了所有进程,然后调用CreateRemoteThread注入每个进程,结果只有我自己测试的进程被注入成功了。
    所以才有此疑问。