以前从来没有使用过windows7,现在突然发现和xp差别太大了。
我有个应用,需要拦截指定进程某个api调用
我首先在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT \CurrentVersion\Windows
设置AppInit_DLLs为c:\test\Test.dll,并且设置了LoadAppInit_DLLs为1
然后在Test.dll里面首先本进程名字是不是目标进程,如果不是,就返回,如果是,就LoadLibraryA("ApiHook.dll")
ApiHook.dll进行拦截目标函数。
现在的问题是,我发现在windows7下似乎还是不行。
ApiHook已经被DLL_PROCESS_ATTACH了,而且也替换了api,我直接GetProcAddress后拿过来修改的,没有去修改IATEntry。
但后来进程真正调用这个api的时候,发现并没有被hook到,而且我的Test.dll和ApiHook.dll似乎都被FreeLibrary了,我用vmmap完全看不到了这两个dll了
现在还不想用detours,毕竟可能要用到商业用途,也不想完全把目标PE给暴力修改。
请教下各位,谢谢阿!
Win7对系统DLL做了重构,举例来说,kernel32中的大部分代码都转移到了kernelbase中,kernel32中只保留一个长跳转。具体要看你hook的是哪个API了...
谢谢张老师,虽然我的问题不是这样,不过你的提示,让我bp api的时候少犯错误。
我最初bp CreateFileA,发现始终拦截不到,开始没有注意,后来才发现到是被windbg弄成了kernelbase上去了。
我的问题,也有些眉目了,大致可能与windows7没有关系。
大致如此,不晓得哪个时候开始,微软也弄起了双进程模式,比如ie8,比如mstsc。
我在xp下安装的是老版本的,而windows7下安装的新版本,所以最初以为是windows7的问题。
我这里想拦截的就是mstsc,我的AppInit_DLLs装载第一个dll的时候是看参数有没有rdp文件,如果有才装载我的apihook。
而现在mstsc改成了双进程模式,第一个进程有参数rdp文件,而它发送消息给svchost,后者再启动一个mstsc,没有带参数rdp,所以我就实质上没有拦截到。
不晓得微软这样做,是否为了安全考虑,不过的确不好调试。
我用windbg启动mstsc,但它却不是真正干活的mstsc,而第2个进程windbg去attach的时候却可能已经跑过了我想拦截的函数了。
只有通过AppInit_DLLs,在这个dll里面sleep,或者人为int 3来拦截,这样的确麻烦些。
"我用windbg启动mstsc,但它却不是真正干活的mstsc,而第2个进程windbg去attach的时候却可能已经跑过了我想拦截的函数了。"
对于这个问题,可以使用Image File Execute Options “创建进程时自动启动调试器”...
啊,是的哈,我把这个给忘记了,谢谢哈!