我有一个加载到 64 位进程中的 dll,它执行两个校验和(至少)一个以保持最新(它从网络接收一个 13 个字符的长字符串,我相当肯定这是一个内部哈希因为它永远不会改变并且似乎不对应任何散列模式我能想到 11 个数字 2 个大写字母在最后)和另一个击败试图修补/分析不同执行路径行为的人,它将拒绝运行如果它的校验和与预期的不同。我通过十六进制编辑程序使用的字符串进行了测试,这导致 dll 永远不会运行,在运行时使用内存编辑器修补它确实有效。我想真正的问题是我将如何确定校验和发生的位置,我应该使用 IDA 等寻找的常见导入是什么。
使用静态分析 (IDA) 查找校验和函数
逆向工程
艾达
静态分析
dll
2021-06-16 17:45:06
1个回答
这真的取决于程序。您提到它从网络接收保存的校验和并根据计算值检查它 - 您可以这样做的一种方法是查找 recv() 调用(或它们用于处理传入数据包的任何函数)。
我会说动态而不是静态执行此操作可能要快得多。如果您在数据包处理函数上设置断点,您应该能够相对容易地找到发生检查的位置(它应该在收到 13 字节字符串后很快发生)。从那里,您可以向后工作并查看计算值的来源 - 如果它是指向该值的指针,您可以设置内存访问断点并再次运行它;如果它只是值,您可以看到它是如何被推入堆栈/访问的。
如果你一心想静态地做这件事,祝你好运。因为它不会随着运行而改变,所以它可能是程序上的某种二进制操作 - 我的猜测是 CRC 或弱哈希。
其它你可能感兴趣的问题