我想找到一种方法来“隐藏”我在代码中使用的 WinAPI 调用,以使逆向变得更加困难。我意识到这对于熟练的逆向者来说不是什么挑战,但是我的应用程序的安全性严重依赖于线程,因此,例如,干扰 IAT 来摆脱 CreateThread 将是相当灾难性的,考虑到这并不很难做到。因此,我正在寻找一种以不太明显的方式调用这些函数的方法(或者一般来说,通过我的调用重现它们的功能);我能想到的就是GetProcAddress(GetModuleHandle("ntdll.dll"), "NtCreateThreadEx");
这几乎没有帮助。是否有其他更高级的方法可以做到这一点,或者可能有一些资源可以为我指明正确的方向?
最佳答案
我建议您在 Win32 调用周围编写薄包装器。包装器不应该是静态的,它们应该在程序启动时生成。
您编写了一组 stub ,例如仅包含 ret 指令的 NtCreateThreadEx
。之后,将您的应用程序与这些 stub 链接起来。
在启动时,您生成的代码应该与您在问题中提供的代码非常相似。您分配一个堆页,将生成的代码放在那里,设置执行位并启动它。此代码应该使用真实地址修补您的 stub 。
这里没有单一的固定配方。您可以将 stub 绕道直接到 NT,或者到将跳转到 NT 或类似内容的包装器。
重点是,一旦涉及到动态生成的代码,就很难理解眼前的代码并不是真正会用到的代码,这个代码是谁、什么时候生成的,如何生成的代码最终看起来像这样,等等。您还可以使代码生成本身变得棘手。
关于c++ - "Hiding"WinAPI调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27636639/