有一个客户声称编译的 C 比 sudo“编译的”Perl 字节码等更难逆向工程。任何人都有办法证明或反驳这一点?
最佳答案
我对 perl 了解不多,但我会举一些例子,为什么逆向编译成汇编的代码如此丑陋。
逆向工程 C 代码最丑陋的地方是编译会删除所有类型信息。这种完全缺乏名称和类型是 IMO 最糟糕的部分。
在动态类型语言中,编译器需要保留更多相关信息。特别是字段/方法/...的名称,因为这些通常是字符串,不可能找到所有用途。
还有很多其他丑陋的东西。比如整个程序优化每次都使用不同的寄存器来传递参数。函数被内联,因此一个简单的函数出现在许多地方,由于优化通常以略有不同的形式出现。
堆栈上的相同寄存器和字节被函数内的不同内容重用。堆栈上的数组变得特别难看。因为您无法知道数组的大小和结束位置。
然后是微优化,这可能会很烦人。例如,我曾经花费超过 15 分钟来反转一个曾经类似于 return x/1600
的简单函数。因为编译器认为除法很慢,并将除法重写为几个乘法加法和按位运算。
关于c - 逆向工程 "compiled"Perl vs. C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5278036/