我想使用Deviare V2 API拦截来自测试应用程序的winapi调用。问题是钩子和系统调用是在同一个过程中,因此不会拦截调用。
如果我为每个进程打开单独的进程,那么拦截将起作用。有没有其他人有这种情况/问题?
问题是我正在尝试添加一些单元测试以实现代码的安静,而不是修改现有的生产代码来包装/模拟所有系统调用我认为我可以简单地拦截所有这些调用并按照我的意愿伪造它们。
答案 0 :(得分:2)
在你自己的进程中挂钩API实际上要容易得多(实际上当你想要挂钩另一个进程时你需要将DLL注入到该进程中,所以基本上当你在自己的进程中挂钩时,你可以跳过它步)。它可能是您正在使用的库的错误。尝试使用Microsoft Detours,或者如果你能做到这一点,自己修补内存,实际上并不是那么难,如果你是这个主题的新手,可以花上几个小时。
你需要警惕的是,某些C ++编译器在某些情况下(我认为调试版本)会使用一些跳转存根或类似的东西,这会干扰挂钩过程。在这种情况下,你必须在挂钩时多加小心 - MS Detours可能会正确地做到这一点。如果这会影响您的成功,您可以尝试调试/发布版本。 我的意思是获得API的正确地址。如果函数在DLL中,就像使用WinAPI一样,如果使用LoadLibrary和GetProcAddress,则可以确保获得正确的地址。
另一方面,我不认为API挂钩是避免模拟/存根进行测试的正确方法,尽管它应该有效。
如果您对挂钩的工作方式感兴趣,请点击此处查看我的论文:http://lkm.fri.uni-lj.si/zoranb/research/berdajs-bosnic%20SPE%202011.pdf