我一直在考虑如何保护我的 C/C++ 代码免受反汇编和逆向工程的影响。通常我自己不会在我的代码中宽恕这种行为。但是,为了各种人的安全,我一直在研究的当前协议不能被检查或理解。
现在这对我来说是一个新主题,互联网在 预防逆向工程方面 并没有真正的足智多谋,而是描述了大量关于 如何逆向工程 的信息
到目前为止,我想到的一些事情是:
- 代码注入(在实际函数调用之前和之后调用虚拟函数)
- 代码混淆(破坏二进制文件的反汇编)
- 编写我自己的启动例程(调试器更难绑定)
void startup();
int _start()
{
startup( );
exit (0)
}
void startup()
{
/* code here */
}
运行时检查调试器(如果检测到则强制退出)
功能蹦床
void trampoline(void (*fnptr)(), bool ping = false)
{
if(ping)
fnptr();
else
trampoline(fnptr, true);
}
无意义的分配和释放(堆栈变化很大)
毫无意义的虚拟呼叫和蹦床(反汇编输出中的大量跳跃)
吨铸件(用于混淆拆卸)
我的意思是这些是我想到的一些事情,但它们都可以在正确的时间范围内由代码分析师解决和/或弄清楚。我还有其他选择吗?
原文由 graphitemaster 发布,翻译遵循 CC BY-SA 4.0 许可协议
琥珀说的完全正确。你可以让逆向工程变得更难,但你永远无法阻止它。您永远不应该相信 依赖于防止逆向工程的“安全性” 。
也就是说,我见过的最好的反逆向工程技术并不专注于混淆代码,而是打破人们通常用来理解代码如何工作的工具。找到破解反汇编程序、调试程序等的创造性方法可能比仅仅生成大量可怕的意大利面条代码更有效,也更能满足智力。这对阻止一个坚定的攻击者没有任何帮助,但它确实增加了 J Random Cracker 走神并转而从事更容易的事情的可能性。