我正在为程序制作一种防黑客的东西,并且我希望能够创建函数字节的校验和以查看其是否已被修改。我知道如何进行校验和,但是我如何获得应该校验的字节数呢?有没有办法让我的功能的大小?

最佳答案

甚至不要尝试。您不能假定函数在内存中是连续的:它的基本块的起始地址可能比其入口点低;它可能与其他功能共享尾随基本块;它可能包含散布的数据或对齐字节,或者它可能会完全消失,具体取决于调用站点(由于编译器决定内联该函数)。

您的代码无法知道所生成函数的大小。只需考虑一下:大小完全取决于编译器发出的内容,并且取决于各种编译器设置和标志(请考虑使用优化的,高度内联的发行版与调试版,或者使用增强的指令集(如SSE而不是不使用它们) )。

而且,正如已经指出的那样,这样的校验和检查对于作为黑客来解决来说是微不足道的-只是您必须反转的另一个分支。

最后,作为一个很好的练习,并且由于潜在的恶意黑客也将使用它,我建议您通过IDA Pro反汇编程序锁定您的二进制文件。这将使您打算采取的反黑客缓解措施很多问题显而易见。

如果您确实想继续沿着这条路走,我建议您使用anti reversing resources或在您的代码上执行一个后处理步骤,
a)通过插入连接它们的跳转将所有功能链接在一起,这将永远不会被采用。将分支隐藏在不透明谓词后面。这将导致反汇编难以阅读/理解,并且由于产生的庞大函数大小,甚至会破坏一些进行静态流分析的反汇编程序。
b)通过一个大分支函数重定向所有函数调用。这将对您的代码产生性能影响,但也会使调用图完全无法使用/无法读取。

10-06 12:18