2016-03-14 131 views
-6

我要实现的是这样的:将C++ Linux二进制文件转换为伪C++代码。逆向工程

C++ riped code

基本上它已经从一个Linux二进制这原是C++ code.I并从别人莫名其妙地做了转换二进制到采取这种图像拍摄C++可读代码。

谢谢。

ps:示例中的大部分变量名都由人类重写。

+0

我已经尝试了几个C++反编译器,但他们只是没有工作(很多没有意义的代码)。 –

+0

那么,就我所知(我自己实际上并没有真正使用反编译器),通常无法获得比“没有任何意义的许多代码”更好的东西,而无需人工干预。如果你对某个具体问题有疑问,试图修改反编译器或以编程方式尝试实现你想要的内容,那么应该将其作为一个问题发布。 –

+0

我期待着看看有人在这里试过反编译任何C++ linux二进制文件并分享他们的经验。感谢你的回答。 –

回答

1

由于现代编译器生成的机器码,尤其是用-O1或更高版本编译的代码与原始代码几乎没有相似之处,所以编写一个工具甚至在这方面做出合理的工作真的很不容易。

我已经使用LLVM编写了我自己的编译器,并且从LLVM-IR(它是“高级汇编程序”)到机器代码都会对代码做很多更改,特别是一旦启用某些优化。变量消失,属于不同块的代码混合在一起。作业从原来的地方转移到更晚的地方[或更早的地方]。

所有环路成为“同” [存在实际上是LLVM特别通行证做的正是这一点,所以后来通行证就可以知道“什么循环样子”,而不必分析四种不同的方式,使循环[forwhile,do-whilegoto] - 他们都看起来非常相似,通过后。

当然,编译器会在可能的情况下内联函数,并且合适的意思是类内部的好函数不再能与其他代码区分开来。

交换机和if-else链变得难以区分。实际上,在你的例子中,你可以看到一些在C++中跳转到L239的goto,实际上它几乎可以肯定是一个switch语句,缺省的错误。它不太可读,几乎不可能以有意义的方式进行改变。这还是很不错的。

循环展开。类和结构停止成为对象,并在某些情况下成为一组独特的变量。

Casts和转换消失并重新映射到别处。

这真的很难跟随由编译器生成的机器代码,并且很好地理解它 - 甚至更难以以任何有意义的方式重建原始代码。

我期望有一些经验,阅读汇编代码并理解它的实际操作更容易,并从中重新创建代码,而不是使用生成“C++”的工具(在某些术语的松散意义上) 。