在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地址并非一样。。
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地址并非一样。。
hProcessHandle这个是要注入的进程句柄,还是你自己的句柄。
让所有进程加载一个DLL,好像是设置钩子吧。
这个CreateRemoteProcess只是针对某一个进程你那个方法只会让指定的进程加载DLL。
不知道,回答的是不是你所问的
CreateRemoteHandle确实是手误。。应该是CreateRemoteThread
应该是我理解有误吧,书上确实说到:根据经验,系统在每个进程中会将Kernel32.dll映射到同一个地址。
所以我实验了吧,枚举了所有进程,然后调用CreateRemoteThread注入每个进程,结果只有我自己测试的进程被注入成功了。
所以才有此疑问。