我想使用 Deviare V2 API 来拦截来自测试应用程序的 winapi 调用。问题是挂钩和系统调用在同一个进程中,因此不会拦截调用。
如果我为它们中的每一个打开单独的进程,那么拦截将起作用。有没有其他人遇到过这种情况/问题?
问题是我正在尝试将一些单元测试添加到代码的和平中,而不是修改现有的生产代码来包装/模拟所有系统调用,我认为我可以简单地拦截所有这些调用并按照我的意愿伪造它们。
在您自己的进程中挂钩 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