2010-12-01 20 views
2

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

+3

如果你正在做一个反黑客的事情,你怎么知道你的校验和功能没有改变? – 2010-12-01 21:02:44

+0

@Anon Checksum it :) – 2010-12-01 21:03:19

回答

0

代码通常在只读存储器中,因此它不能更改。

但是,您可以嵌入一个DLL的校验和,以便在加载它后立即验证其自己的图像,并在DLL磁盘映像已被修改时中止。但是,操作系统尚未完成这项工作吗?

2

从理论上讲,您可以使用指向可执行文件中函数的符号长度(假设您可以掌握它),但实际上它并不需要是正确的 - 系统不会在意,它只是到函数的开始处运行,直到函数返回。你可以试着找到下一个函数的开始,并假设这些函数是顺序的(除了填充,但没有理由不仅仅是校验和),但是这要求你知道在你想要校验的那个函数后面有哪个函数。无论采用哪种方式,您都必须让可执行文件在内存中进行分析以找到标头的那一部分。

0

标准不允许使用函数作为sizeof运算符的参数。所以没有可移植的方式来获得函数体的大小。此外,函数不一定要放在连续的内存块中。几个函数的一部分可以在一个地方洗牌(这是VS在发布版本中做的)。

4

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

您的代码没有办法知道生成的函数的大小。试想一下:大小完全取决于编译器发出的内容,取决于各种编译器设置和标志(想象一个优化的,内嵌严格的版本构建与调试构建或使用像SSE这样的增强指令集,而不是使用它们)。另外,正如已经指出的,这样的校验和检查对于黑客来说是微不足道的 - 只需要另一个分支就可以反转。

最后,作为一个好奇的练习,因为潜在的恶意黑客也会使用它,所以我建议通过IDA Pro反汇编程序锁定您的二进制文件。这将使你的预计反黑客缓解问题很多明显...

如果你真的想继续下去这条道路,我会建议反reversing resources或对你的代码运行后处理步骤
a)通过插入连接它们的跳跃将所有的功能连接在一起,这些连接永远不会被占用。隐藏不透明谓词背后的分支。这将使反汇编难以阅读/理解,甚至会由于产生巨大的函数大小而使一些反汇编程序进行静态流分析。 b)通过一个大分支函数重定向所有函数调用。这会对代码产生性能影响,但它也会使调用图完全无法使用/不可读。