反向工程“编译”Perl与C?

时间:2011-03-11 20:37:04

标签: c perl reverse-engineering code-access-security

让一个声称符合C的客户端比sudo“编译”Perl字节码等更难进行逆向工程。任何人都有办法证明或反驳这一点?

6 个答案:

答案 0 :(得分:6)

我对perl不太了解,但我会举一些例子说明为什么将编译成汇编的代码转换为如此丑陋。

逆向工程c代码最丑陋的是编译删除了所有类型信息。这种名称和类型的缺乏是IMO最糟糕的部分 在动态类型语言中,编译器需要保留更多有关该语言的信息。特别是字段/方法/ ...的名称,因为它们通常是不可能找到每次使用的字符串。

还有很多其他丑陋的东西。比如整个程序优化使用不同的寄存器来每次传递参数。函数被内联,因此在许多地方出现了一个简单的函数,由于优化,它们的形式通常略有不同。

堆栈中的相同寄存器和字节被函数内的不同内容重用。使用堆栈上的数组变得特别难看。因为你无法知道数组的大小和结束的位置。

然后有微观优化可能会令人讨厌。例如,我曾花费大约15分钟来反转曾与return x/1600类似的简单函数。因为编译器决定了分区很慢并且将一个常量的除法重写为几个乘法加法和按位运算。

答案 1 :(得分:2)

Perl非常容易reverse engineer。选择的工具是vi,vim,emacs或记事本。

答案 2 :(得分:2)

这确实引发了他们为什么担心逆向工程的问题。将机器代码转换回类似于原始源代码的东西比通常的字节代码更难,但是对于大多数无关紧要的恶意活动而言。如果有人想要复制您的秘密或破坏您的安全性,他们可以做足够的事情,而无需将其恢复为原始源代码的完美表示。

答案 3 :(得分:1)

虚拟机的反向工程代码通常更容易。虚拟机通常被设计为该语言的简单目标。这意味着它通常可以轻松直接地代表该语言的结构。

但是,如果你正在处理一个不是为那种特定语言而设计的虚拟机(例如,编译到JVM的Perl),它会使你更加接近使用为真实硬件生成的代码 - 也就是说,你必须做任何必要的事情来定位预定义的架构,而不是设计目标以适应源。

答案 4 :(得分:1)

好的,这些年来一直存在着充分的争论;而且大多数结果从来都不是决定性的......主要是因为它并不重要。

对于有动力的逆向工程师,两者都是一样的。

如果您正在使用像perl2exe这样的伪exe制造商,那么比编译C更容易“反编译”,因为perl2exe根本不编译perl,它只是有点“隐藏”(见http://www.net-security.org/vuln.php?id=2464;这真的很旧,但概念可能还是一样的(我没有研究过,所以不确定,但我希望你明白我的观点))

我建议看一下最适合这份工作的语言,这样才能合理,可持续地完成实际产品的维护和开发。

记住你_can_not_停止一个有动力的对手,你需要让它反转的成本要高于自己编写它。

这4个应该很难(但也不是不可能)......

[1]插入无意义数学和复杂数据结构交互的噪声代码(随机位置,随机代码)(如果正确完成,如果目的是反转代码而不是功能,这将是一个非常令人头痛的问题。)< / p>

[2]在源代码上链接一些(不同的)代码混淆器作为构建过程的一部分。

[3]应用软件保护加密狗,如果h / w不存在,将阻止代码执行,这意味着在进行其余的反转之前,需要物理访问加密狗的数据:http://en.wikipedia.org/wiki/Software_protection_dongle

[4]总有一些保护器(例如Themida http://www.oreans.com/themida.php)可以在构建之后保护.exe(无论它是如何编译的)。

......这应该让反向者足够头痛。

但请记住,所有这些也会花钱,所以你应该总是权衡你想要达到的目标,然后看看你的选择。

简而言之:两种方法同样不安全。除非您使用的是非编译perl-to-exe制造商,否则本机编译的EXE会胜出。

我希望这会有所帮助。

答案 5 :(得分:1)

C比字节编译的Perl代码更难反编译。任何经过字节编译的Perl代码都可以反编译。字节编译的代码不是像编译的C程序那样的机器代码。其他人建议使用代码混淆技术。这些只是使代码难以阅读的技巧,并且不会影响反编译Perl源代码的难度。反编译的源可能更难阅读,但有许多可用的Perl去混淆工具,甚至是Perl模块:

http://metacpan.org/pod/B::Deobfuscate

Par,PerlAPP或Perl2exe等Perl打包程序也不提供源代码保护。在某些时候,必须提取源,以便Perl可以执行脚本。甚至包括PerlAPP和Perl2exe在内的一些加密技术的打包器也可以通过调试器来解决:

http://www.perlmonks.org/?displaytype=print;node_id=779752;replies=1

它会阻止某人随意浏览您的Perl代码,但即使是打包器也必须在脚本运行之前解压缩脚本。任何确定的人都可以获得源代码。

反编译C是一个完全不同的野兽。一旦它被编译,它现在是机器代码。您要么最终使用汇编代码与大多数C反编译器,要么一些商业C反编译器将采用汇编代码并尝试生成等效的C代码,但除非它是一个非常简单的程序,否则很少能够重新创建原始代码。