- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在为一个程序做一种反黑客的东西,我希望能够创建一个函数字节的校验和,看看它是否被修改了。我知道如何计算校验和,但我如何获得我应该校验和的字节数?有没有办法获取我的函数的大小?
最佳答案
甚至不要尝试。你不能假设一个函数在内存中是连续的:它可能有起始地址低于入口点的基本 block ;它可以与其他函数共享尾随的基本 block ;它可能包含散布的数据或对齐字节,也可能完全消失,具体取决于调用站点(由于编译器决定内联函数)。
您的代码无法知道生成函数的大小。想一想:大小完全取决于编译器发出的内容,并且取决于各种编译器设置和标志(考虑优化、大量内联的发布版本与调试版本或使用像 SSE 这样的增强指令集与不使用它们).
此外,正如已经指出的那样,这样的校验和检查对于黑客来说是微不足道的 - 只是您必须反转的另一个分支。
最后,作为好奇者的练习,因为潜在的恶意黑客也会使用它,我建议通过 IDA Pro 反汇编程序锁定您的二进制文件。这将使您预期的反黑客缓解措施中的许多问题变得显而易见......
如果您真的想继续沿着这条路走下去,我建议您使用 anti reversing resources或对您的代码运行后处理步骤
a)通过插入连接它们的跳转将您的所有功能链接在一起,这些跳转将永远不会被采用。隐藏不透明谓词后面的分支。这将使反汇编难以阅读/理解,甚至会破坏一些反汇编程序进行静态流分析,因为由此产生的巨大函数大小。
b) 通过单个大分支函数重定向所有函数调用。这会对您的代码产生性能影响,但也会使调用图完全无法使用/不可读。
关于c++ - 内存中函数的校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4329079/
如何在 PHP 中生成 CRC-8 校验和? 最佳答案 function crcnifull ($dato, $byte) { static $PolyFull=0x8c; for ($i=0
我正在编写代码来使用 32 位无符号整数计算 CRC16。当尝试打印执行 CRC 操作的 XOR 函数的返回值时,它总是打印 0。我尝试了各种调试方法,例如打印语句,但是,我似乎无法弄清楚! 这是我的
ThinkPHP3.2.3验证码显示、刷新、校验 ,具体如下: 显示验证码 首先在Home/Controller下创建一个公共控制器PublicController
我想将自定义验证绑定(bind)到 TimePicker 自定义控件,但下面的代码显示“无法将内容添加到 TimePicker 的对象类型。”。
目录 Spring 校验(validator,JSR-303)实现 什么是JSR-303规范 与Spring MVC结合 实体类添加
导包和配置 导入 JSR 303 的包、hibernate valid 的包 ?
我是一名优秀的程序员,十分优秀!