hur.cn - 华软网

 热门搜索

有没有做过detour hook的?我有两个问题请教,100分

  作者:未知    来源:网络    更新时间:2010/10/2
目前在用detour做hook,遇到两个问题讨教。
环境以下:
我自己开发的主程序:A,我自己开发的用来注入hook的dll:B,被hook的程序:C

问题1:
B 里hook的api很多,我自己写的函数也很多,所以会遇到我自己写的函数里会调用那些已经被hook的api。假定我hook了CreateFile,我自己有个函数叫做WriteLog,那么在WriteLog里就会调用CreateFile,然则我其实不希望在WriteLog里调用被Hook的 CreateFile,我希望调用hook前的CreateFile;换个说法就是,在这个dll里的自定义函数调用的API都不是hook后的,这该怎么实现?我知道能够声明hook前函数的指针,然后调用那个指针就行。然则这有个问题:如果有两个API m和n,在m里会调用n,在B里我都对m和n都做了hook,那么如果我在writelog里调用m,我call被hook前的m,然则由于m会调用n,由于我没法让m强制调用hook前的n,所以最后照旧会调用到hook后的n,然则我想调用的是hook前的n,这又该怎么解决?


问题2:
回调问题。A把B注入到C里举行hook,B在C的进程空间里。B对C的hook函数,会有一些信息记录一下,比如简单地记录调用参数等等,然后我希望把这些信息传给A,让A打印出来。这该怎么实现?我知道有个笨一点的方法是查找窗口,然则A最小化之后这个方法就失效了。所以,只可out

以上两个,请帮助。顺祝国庆假期快乐~
---华软 网友回答---
问题1:
hook程序中应该防止这类情况发生,给你几种参照建议:
1、把有可能调用hook函数的代码放到其它未被hook的进程中执行;
2、在hook函数中加入一些判断(例如通过判断资料名称、句柄等),将不想hook的调用放过;
3、调用更下层的接口,如果你hook的是kernel32的函数,在hook函数中你能够调用ntdll的函数。
问题2:
进程间通讯的方法有很多,少许数据用消息传送是对照方便的。窗口最小化一样能够用FindWindow等函数查找到,你自己再检查一下毛病原因。(最好给自己的窗口注册一个自定义的类名,根据类名查找)
---华软网友回复---
  楼主没有看detour的samples ?
    detour做hook,通常为先声明一个函数指针pFunc,并将其值设为目标函数,再运用detour的DetourAttach将函数指针与函数联系关系起来,DetourCommit应用hook.
    调用pFunc这个函数指针就是调用原来的函数了。
---华软网友回复---
都有目标函数的指针了,B里面的m,n函数在调用api的地方,都用指向原始目标函数的指针不行吗?

至于第二个问题,用内存映照就挺方便的,映照对象能够命名,跨进程访问也容易。
---华软网友回复---
引用 2 楼 lisunlin0 的回复:
  楼主没有看detour的samples ?
    detour做hook,通常为先声明一个函数指针pFunc,并将其值设为目标函数,再运用detour的DetourAttach将函数指针与函数联系关系起来,DetourCommit应用hook.
    调用pFunc这个函数指针就是调用原来的函数了。


谢谢,请看
引用
我知道能够声明hook前函数的指针,然后调用那个指针就行。然则这有个问题:如果有两个API m和n,在m里会调用n,在B里我都对m和n都做了hook,那么如果我在writelog里调用m,我call被hook前的m,然则由于m会调用n,由于我没法让m强制调用hook前的n,所以最后照旧会调用到hook后的n,然则我想调用的是hook前的n,

---华软网友回复---
引用 3 楼 coding_hello 的回复:
都有目标函数的指针了,B里面的m,n函数在调用api的地方,都用指向原始目标函数的指针不行吗?

至于第二个问题,用内存映照就挺方便的,映照对象能够命名,跨进程访问也容易。


谢谢
不过m,n是API,如果是API的话,m里调用n,这个n我是没措施控制的

问题2,我也计划用内存映照
---华软网友回复---
引用 1 楼 cnzdgs 的回复:
问题1:
hook程序中应该防止这类情况发生,给你几种参照建议:
1、把有可能调用hook函数的代码放到其它未被hook的进程中执行;
2、在hook函数中加入一些判断(例如通过判断资料名称、句柄等),将不想hook的调用放过;
3、调用更下层的接口,如果你hook的是kernel32的函数,在hook函数中你能够调用ntdll的函数。
问题2:
进程间通讯的方法有很多,少许数据用消……


谢谢,我想我有点门路了。等我再实践一下,没问题就结贴。
---华软网友回复---
搭车学习一下.....
---华软网友回复---
问题一,楼主能够改变你程序自身要调用和目标进程需要hook的函数,
HANDLE WINAPI Mine_CreateFileA(IN LPCSTR lpFileName, IN DWORD dwDesiredAccess, IN DWORD dwShareMode, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes, IN DWORD dwCreationDisposition, IN DWORD dwFlagsAndAttributes, IN HANDLE hTemplateFile);

HANDLE (WINAPI * Real_CreateFileA)(IN LPCSTR lpFileName, IN DWORD dwDesiredAccess, IN DWORD dwShareMode, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes, IN DWORD dwCreationDisposition, IN DWORD dwFlagsAndAttributes, IN HANDLE hTemplateFile)
= CreateFileA;
接着你用的所有CreateFileA函数,都用Mine_CreateFileA取代即可,就不会被再次hook到;

问题二,楼主能够在hook住函数之后,将参数信息直接写入到资料,或用内存隐射,将信息直接打印出来。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。