关于hook CreateRemoteThread?? 用Detour方法,大致做法是把CreateRemoteThread函数的入口处的代码复制到自己的代码段中,然后将其入口写入一条跳转指令,使其跳转到自己的程序里,然后根据需要再调用原本的CreateRemoteThread代码。在网上搜一下HOOK API,可以找到详细说明和源代码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我有一个HookAPILib.dll用这个可以轻松搞定API Hook,提供三种Hook方法(均属于修改API头5个字节的方法)+2大种6小种注入方法,楼主需要可以和我联系,有源码,不过不太好看,写了很久了的东西 cnzdgs 和 zhaoyu_me 两位大虾不知道有没有hookCreateRemoteThread源码,请帮帮我啊!我的QQ 409206390邮箱 [email protected]谢谢啊 你在网上搜HOOK API,就可以找到源代码,稍稍改一下就可以。我从不用Detour的方法,这种方法对操作系统和硬件过于依赖,而且微软一直反对,说不定哪天微软更新一个补定这种方法就用不了了。 楼上说的有道理,不过我没想到怎么和硬件有扯上了关系呢?还有Detour好象是MS自己开发的库吧,所以我想MS应该不会轻易把这种方法禁止掉的,而且这种方法目前用的也是比较广泛的,IAT需要对PE格式有所了解,可惜我是菜鸟,有关PE的东西正在学习中 Detour需要反汇编,汇编语言与CPU有关,CPU就是上面提的硬件喽。Vista X64中PatchGuard已经禁止了对内核代码的Detour,所以哪天把系统API也禁止Detour不是不可能。 hehe如果MS愿意的话IAT式的Hook也是可以禁止的嘛,到了那时候我们岂不是要静态Path一个文件来实现Hook?万一被hook的程序还带个CRC之类的自校验那我这样的菜鸟就没得混了 cnzdgs 您好!我以前没接触过这方面知识,但这次毕业设计涉及hook create remote thread ,我这个寒假也一直是在网上找啊。也看到一些键盘钩子的源码,但看不懂, 找了那个《windows 核心编程》,也看不太懂,收获不大。现在这个时候,非常需要像您这样的热心前辈,给我带带路,让我能够迅速上手。我希望您能够指导的更详细具体一些,比如如何上手,给个具体的例子指导下。我不怕吃苦,花功夫,但我需要您的帮忙,避免劲用错了地方。感激不尽!!!! 请问楼主你是要Hook某个进程对CreateRemoteThread的调用还是Hook系统中所有进程对他的调用? 我是要hook 系统中所有进程啊!请zhaoyu_me 指导! 《windows 核心编程》里有代码,自己去看看吧,遍历所有的进程. 遍历所有进程是一种办法,但我觉得那种方法不太好,我还是倾向于用驱动, SSDT Hook,我分析了一下CreateRemoteThread的实现过程,估计在XP下用SSDT Hook挂钩NtCreateThread,在Vista下挂钩NtCreateThreadEx应该可以实现,但我没有时间去实践我在QQ上加过楼主,可是楼主没反应 核心编程里的IAT钩子容易被绕过,只要LoadLibrary/GerProcAddress就可以绕过了.如果是在RING3下做,我建议还是使用Detours,它内带一个小型反汇编引擎,很好地解决了指令碎片的问题(网上很多INLINE HOOK都有个问题),而且不用做同步,网上有个ULHook需要还原才能对原API的调用,会产生同步问题,支持多种windows,32/64位CPU(64位的版本要钱).没什么可挑剔的了..代码如下:HANDLE WINAPI MY_CreateRemoteThread( HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);//挂接CreateRemoteThreadDETOUR_TRAMPOLINE(HANDLE WINAPI DE_CreateRemoteThread( HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ), CreateRemoteThread);在DLLMain里加上DetourFunctionWithTrampoline((PBYTE)DE_CreateRemoteThread, (PBYTE)MY_CreateRemoteThread);下面是代理函数HANDLE WINAPI MY_CreateRemoteThread(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId){#ifdef KOUT_DEBUG_STRING DWORD dwCaller; __asm push dword ptr [ebp+4] __asm pop dword ptr [dwCaller] TCHAR path[1024]; ZeroMemory(path,sizeof(TCHAR)*1024); HMODULE hDll = ModuleFromAddress((PVOID)dwCaller); GetModuleFileName(hDll,path,1024*sizeof(TCHAR)); KDbgPrint(_T("CreateRemoteThread %x Call By:%s\n"),hProcess,path);#endif //判断是否是创建远程线程 if(hProcess==GetCurrentProcess()||hDll==g_hKernel32) { return DE_CreateRemoteThread(hProcess,lpThreadAttributes,dwStackSize,lpStartAddress, lpParameter,dwCreationFlags,lpThreadId); } else { *lpThreadId = 1017; return (HANDLE)719; }}注意:函数CreateThread最终还是调用CreateRemoteThread,所以要判断hProcess上面的DLL作为全局钩子注入到每个进程就行了,或者用CreateRemoteThread的方式注入..看看CreateThread的执行流程CreateThread (kernel32.dll)CreateRemoteThread (kernel32.dll)NtCreateThread (ntoskrnl.exe)PspCreateThread (ntos\ps\create.c:237)要可靠的话,挂接NtCreateThread好了.. keSummer 如采用您这种遍历所有进程,那是不是如果系统临时创建新的进程,那我又要将DLL注入这个新创建的进程?装一个核心层的全局HOOK是不是更好呢?请您指导,期待您的回答。谢谢! zhaoyu_me 您说跟我在QQ上联系过,我不经常上网,所以没有收到您的消息,您是不是可以考虑给我发邮件!谢谢 keSummer 不存在遍历,是否注入到其它进程有赖于你的代码。如果需要知道是否新开线程,HOOK NtCreateSection更多信息查看《Undocument ...》 mfc question 请教一行代码的意思 关于WINDOWS窗口的关闭按钮的两个问题! 时间写入数据库问题 Mysql问题:前台VC做的,后台是Linux环境下的Mysql服务器。连接Mysql服务器时出现Can''t connect to local MySQL server。而在后台 消息映射的初级问题!! 《Windows 2000 API超级宝典》 菜鸟问题:当函数执行完成后,其中的变量也就自动释放了吧! 求一个用VC++6.0 中MFC开发的简单计算器 系统调用的问题 怎样检测U盘插入后“新硬件已安装完成可以使用”的信息? c++连接access数据库是怎么连的?
我的QQ 409206390
邮箱 [email protected]
谢谢啊
我从不用Detour的方法,这种方法对操作系统和硬件过于依赖,而且微软一直反对,说不定哪天微软更新一个补定这种方法就用不了了。
Vista X64中PatchGuard已经禁止了对内核代码的Detour,所以哪天把系统API也禁止Detour不是不可能。
如果MS愿意的话IAT式的Hook也是可以禁止的嘛,到了那时候我们岂不是要静态Path一个文件来实现Hook?万一被hook的程序还带个CRC之类的自校验那我这样的菜鸟就没得混了
我希望您能够指导的更详细具体一些,比如如何上手,给个具体的例子指导下。我不怕吃苦,花功夫,但我需要您的帮忙,避免劲用错了地方。感激不尽!!!!
请zhaoyu_me 指导!
如果是在RING3下做,我建议还是使用Detours,它内带一个小型反汇编引擎,很好地解决了指令碎片的问题(网上很多INLINE HOOK都有个问题),而且不用做同步,网上有个ULHook需要还原才能对原API的调用,会产生同步问题,支持多种windows,32/64位CPU(64位的版本要钱).没什么可挑剔的了..
代码如下:HANDLE WINAPI MY_CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);//挂接CreateRemoteThread
DETOUR_TRAMPOLINE(HANDLE WINAPI DE_CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
), CreateRemoteThread);在DLLMain里加上
DetourFunctionWithTrampoline((PBYTE)DE_CreateRemoteThread, (PBYTE)MY_CreateRemoteThread);下面是代理函数
HANDLE WINAPI MY_CreateRemoteThread(HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId)
{
#ifdef KOUT_DEBUG_STRING
DWORD dwCaller;
__asm push dword ptr [ebp+4]
__asm pop dword ptr [dwCaller]
TCHAR path[1024];
ZeroMemory(path,sizeof(TCHAR)*1024);
HMODULE hDll = ModuleFromAddress((PVOID)dwCaller);
GetModuleFileName(hDll,path,1024*sizeof(TCHAR)); KDbgPrint(_T("CreateRemoteThread %x Call By:%s\n"),hProcess,path);
#endif //判断是否是创建远程线程
if(hProcess==GetCurrentProcess()||hDll==g_hKernel32)
{
return DE_CreateRemoteThread(hProcess,lpThreadAttributes,dwStackSize,lpStartAddress,
lpParameter,dwCreationFlags,lpThreadId);
}
else
{
*lpThreadId = 1017;
return (HANDLE)719;
}
}注意:函数CreateThread最终还是调用CreateRemoteThread,所以要判断hProcess
上面的DLL作为全局钩子注入到每个进程就行了,或者用CreateRemoteThread的方式注入..看看CreateThread的执行流程
CreateThread (kernel32.dll)
CreateRemoteThread (kernel32.dll)
NtCreateThread (ntoskrnl.exe)
PspCreateThread (ntos\ps\create.c:237)
要可靠的话,挂接NtCreateThread好了..
请您指导,期待您的回答。谢谢!