返回信息流查了很多资料,可都不能很好解决问题……
我希望能够支持XP和WIN7两种系统,功能是在程序运行前先获取程序的路径。
但在进行APIHook (用改变函数地址的方式Hook) 的过程中一直有问题无法解决……
API HOOK的代码参考这里弄的:http://blog.csdn.net/jacklam200/article/detail/4302652
据说是《WINDOWS内核编程》里提供的APIHook类代码,但无奈学校图书馆居然没这本书……[ema1]
资料显示:
XP下进程创建过程的函数调用顺序是
CreateProcessW->CreateProcessInternalW->NtCreateProcessEx
WIN7下进程创建过程的函数调用顺序是
未知的函数(不是CreateProcessW)->CreateProcessInternalW->NtCreateUserProcess
我的Hook结果:拦截成功指的是进入自己写的处理函数,失败就是没有进入。
在XP下
CreatePrcoessW 拦截成功
CreateProcessInternalW 拦截失败 (经调试确认Hook加载成功,函数地址更改成功)
在WIN7下
CreatePrcoessW 拦截失败 (这是必然的,WIN7不默认调用它了)
CreateProcessInternalW 拦截失败 (经调试确认Hook加载成功,函数地址更改成功)
NtCreateUserProcess 拦截成功
另:拦截OpenProcess和TerminalProcess在两个系统中是成功的。[ema12]
疑问1:
按理说拦截CreateProcessInternalW应该在两个系统中都成功才对,网上看别人大多也都是拦截CreateProcessInternalW成功,就连360和QQ管家也是的……
这个问题怎么样都没法解决。
疑问2:
退一步说,其实在两个系统都能Hook到一个进程创建的函数,在XP算是解决了,因为CreateProcessW的参数1就代表了程序路径。
可是WIN7下只能拦截到内核(ntdll.dll中)的NtCreateUserProcess函数,微软没有公开其函数体,经网上牛人逆推,函数体大致如下(没人知道到底长什么样……):
DWORD NtCreateUserProcess(
PHANDLE ProcessHandle,
PHANDLE ThreadHandle,
PVOID Parameter2,
PVOID Parameter3,
PVOID ProcessSecurityDescriptor,
PVOID ThreadSecurityDescriptor,
PVOID Parameter6,
PVOID Parameter7,
PVOID ProcessParameters,
PVOID Parameter9,
PVOID pProcessUnKnow);
但是其中没有固定存储路径的参数。
(据说是参数2和参数11,但大家的实验结果都是有的时候存路径,有的时候没存路径)。
所以请大牛解惑啊……
为什么不能Hook到CreateProcessInternalW呢?
(针对不同API的Hook过程几乎一模一样,其余API都可以成功,所以应该不是代码的问题)
或者怎么从NtCreateUserProcess的参数里获得程序路径呢?
或者WIN7到底到底是怎么调用进程创建的呢?
真的查了很多资料……无结果……在此先跪谢…………[ema1]
这是一条镜像帖。来源:北邮人论坛 / security / #34334同步于 2012/5/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
[求助]关于HOOK拦截进程的问题……
cslei54
2012/5/19镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
有人说WIN7是先调用了CreateProcessAsUser,但加了进去仍然hook不能……
最后还是用NtCreateUserProcess里面取出路径。。。暂时还没发现不稳定