我有用 C 编写的 linux 二进制文件。在运行时我计算二进制文件的校验和,这似乎阻止了在其中设置 gdb 软件断点。从逆向工程的角度来看,这有多安全?有没有办法逐步完成这个二进制文件的组装?
编辑:
代码计算自身一部分的校验和。我曾尝试在 gdb 中设置断点,但校验和失败。
我有用 C 编写的 linux 二进制文件。在运行时我计算二进制文件的校验和,这似乎阻止了在其中设置 gdb 软件断点。从逆向工程的角度来看,这有多安全?有没有办法逐步完成这个二进制文件的组装?
编辑:
代码计算自身一部分的校验和。我曾尝试在 gdb 中设置断点,但校验和失败。
有很多方法可以破坏您的特定方案 - 正如 perror 在他的评论中所说,设置硬件断点将不会被注意到。硬件断点还允许逆向程序检查您的代码的哪一部分读取了内存,从而将攻击者指向校验和算法。因此,对进程内存进行校验和不会显着延迟有经验的逆向程序。
如果你想要一些适度的保护,你至少应该做一些ptrace技巧来检查你是否被调试,正如 perror 在他的评论中所说。为了得到更好的保护,ptrace在你的主进程中设置,fork一个子进程,让子进程在不同的地方抛出异常,在主进程中捕获这些异常,让主进程做一些工作并将结果修补回孩子的地址空间,并恢复孩子。此外,生成一些会尝试ptrace父进程的东西,如果父进程在调试器的控制下运行,它将失败。
这至少可以防止工具箱中只有 gdb 的攻击者 失败。例如,对于任何编译自己的 linux 内核并将足够数量的printk调试输出添加到ptrace系统调用的人来说,它都无济于事。
确实,有些公司专门保护软件,如果目标足够有价值/攻击者足够坚定,即使他们失败了。FlexLM 有攻击,Themida 有攻击(Themida 破解教程只能google),甚至微软也无法阻止破解版的windows 在互联网上流传。正如我在评论中所说的那样,除非您自己是一位非常有经验的逆向者,否则您自己发明的任何东西都不会阻止坚定的逆向者破解您的软件。
我认为自己经验丰富,到目前为止还不是专家,而且我知道我无法设计出任何东西来阻止任何拥有我最多几天经验的人。这个论坛的一些成员可以在一天之内将我发明的任何东西撕成碎片。
老实说,如果您的软件值得保护,请使用 flexlm 之类的商业软件。你自己花在它上面的任何努力都是浪费时间。
您的二进制文件中的任何自我保护都可以被检测到并删除,这只是您希望它对逆向程序有多难和多烦人的问题。设计上不可能避免有人绕过您的支票。
关于所有现有的反调试技术有很多资源,但这是一场无休止的军备竞赛,只需确定您想要保护谁的二进制文件,并相应地设置难度。