首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对用perlcc编译的Perl程序进行逆向工程?

如何对用perlcc编译的Perl程序进行逆向工程?
EN

Stack Overflow用户
提问于 2010-10-29 10:44:42
回答 3查看 10.2K关注 0票数 8

我继承了一个在Unix上具有“编译”的perl脚本的环境。是否有可能对其进行反编译、逆向工程(不管是什么术语),并从编译后的目标代码中获得源代码?

可能是不可能的,但我想我会问而不是假设。

谢谢,-Kevin。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-29 11:51:35

哦天啊!

如果是,并且只有当它是通过perlcc -B编译成可执行的字节码时,你才可以像B::Deparse那样对它进行反编译。通过这种方式,您可以找回所有未优化的源代码。它看起来可能有点滑稽,但它将是一个等效的程序。

但是,如果它被完全编译成C代码,然后再编译成汇编语言和机器语言,并通过ld运行得到一个合适的a.out文件,那么您就不能做这样的事情了。这就像试图反汇编/bin/cat一样。

所以,好吧,你可以把它拆卸掉,但是没有什么可以让joy去做的。即使你能得到原始的,生成的C代码--你做不到--它实际上也是不可用的。

我想您可能会对它运行字符串(1)来查看是否有任何有用的东西留在某个永久的地方,但我不会指望它。

抱歉的。

票数 10
EN

Stack Overflow用户

发布于 2010-10-29 12:09:09

省略了已经介绍过的字节码后端tchrist,只讨论了C后端,perlcc所做的就是将编译好的perl程序的操作树转换成C程序,然后编译。该C程序在运行时会将操作树重新构建到内存中,并基本上像perl通常那样执行它。这样做的目的实际上只是为了加快常规perl代码的编译时间。

然后,可以在PL_main_root全局变量中获得程序的操作树。我们已经有了一个名为B::Deparse的模块,它能够使用操作树,并将它们转换成与编译操作树的原始代码大致相同的源代码。它恰好有一个compile方法,该方法返回一个coderef,在执行时将打印PL_main_root的偏离结果。

还有C函数Perl,您可以使用它来计算来自C空间的Perl_eval_pv代码片段。

代码语言:javascript
运行
复制
$ echo 'print 42, "\\n"' > foo.pl
$ perl foo.pl
42
$ perlcc foo.pl
$ ./a.out
42
$ gdb a.out
...
(gdb) b perl_run
Breakpoint 1 at 0x4570e5: file perl.c, line 2213.
(gdb) r
...
Breakpoint 1, perl_run (my_perl=0xa11010) at perl.c:2213
(gdb) p Perl_eval_pv (my_perl, "use B::Deparse; B::Deparse->compile->()", 1)
print 42, "\n";
$1 = (SV *) 0xe47b10

当然,通常的B::Deparse警告也适用,但这对于反向工程肯定是很方便的。在大多数情况下,实际重建原始源代码是不可能的,即使它在上面的例子中是有效的。

要让B::Deparse为您提供一些有用的东西,您必须执行的gdb魔术在很大程度上也取决于您的perl。我使用的是perl和他的读取,因此是多重性的。这就是我传递my_perl变量的原因。其他perls可能不需要这样。此外,如果有人剥离了perlcc编译的二进制文件,事情会变得有点困难,但同样的技术仍然有效。

你也可以用它来编译任何你可以在程序执行过程中的任何时间获得的操作树。看一看B::Deparse的编译子,并做一些类似的事情,除了为您想要转储的任何操作树提供一个B对象,而不是B::main_root

同样的事情也适用于前面提到的perlcc的字节码后端。我不完全确定名为CC的优化的C后端。

票数 14
EN

Stack Overflow用户

发布于 2012-02-14 20:26:07

使用7-zip。右键单击exe文件,然后执行7zip>Open存档,然后抓取perl文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4048614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档