亦正亦邪反编译

时间:2022-06-21 08:50:38

编者按:新的一年,“高手论技”继续伴随大家前行,身处一线的你,就那些技术上最常遇到的故障、最需要解决的难题、最成熟的应用……都可以在此畅所欲言,各抒己见。是继续围观还是现身说法,新浪微群http://.cn/264976,期待您的共同参与。

“可逆”是要考量条件和智慧的,勇往直前时勇气是必不可少的,追根溯源却更需要耐心。生活如此,反编译亦如此,但如果有好工具相助,必会轻松清除很多障碍。平日里,将图片中的文字提取出来、将“借用”的.swf文件稍作修改……想必很多老师都不可避免会遇到这种情况。在此,主持人和嘉宾将用两期来探讨反编译的技巧,当然技术的探讨终归是要落实到行动上的,反编译须遵循道德约束,仅为便利我们的学习、教学或工作开展,请勿作他用。

在软件技术的学习过程中,逆向工程(Reverse Engineering)似乎是一个有些敏感的词语。一方面,通过逆向工程,我们可以分析和学习别人程序的设计思想、软件架构等,提高自己的技术水平;另一方面,也可通过逆向工程,分析和察看别人程序的核心算法、加密手段等,甚至对程序进行修改和移植。

反编译是逆向工程的一种,同样处于亦正亦邪的边缘。对学习者而言,需要利用反编译来学习、分析和借用别人的源程序;对开发者而言,却忌讳别人通过反编译来偷窥、修改和剽窃自己的劳动成果。

雾里看花:亦正亦邪反编译

由于编译(Compile)过程是利用编译程序从高级语言编写的源程序来产生目标程序,因而凡是从编译后的目标程序(可执行文件或专用格式的文件)来得到源程序的过程,都被认为是反编译(Decompile)。

从编译原理上看,编译程序把一个源程序翻译成目标程序要经过五个阶段:词法分析、语法分析、语义检查和中间代码生成、代码优化、目标代码生成。而反编译要逆向进行这个过程,难度显然要大很多,即使是编译程序,一般也没有反编译能力。

然而对反编译的需求,却大有市场,不仅仅是开发者,一些应用人员,由于某些特殊需要,也对反编译情有独钟。这些特殊的需要中,也包括不便明说的原因,道德的与不道德的,合法的与非法的,一起构成了反编译的动机和来源。

工具与用途的关系,总是可以进行辩证和辩论的。反编译不仅是工具,也是技术,正也好,邪也罢,蕴含在其中的智慧和智力结晶,仍值得热爱技术的人们去钻研。

借用一句话:“逆向工程可能会被误认为是对知识产权的严重侵害,但是在实际应用上,反而可能会保护知识产权所有者。例如,在集成电路领域,如果怀疑某公司侵犯知识产权,可以用逆向工程技术来寻找证据。”

它山之石:程序语言的反编译

在高级语言出现之前,程序都是使用汇编语言来编写的,为了得到汇编程序的源代码,出现了反汇编技术。高级语言出现后,有了编译过程,相应的也就有了反编译技术。但是不管哪种语言编写的程序,最终都是翻译成机器语言来执行,因而反汇编技术是可以通用于各种语言所编写的程序的。反汇编的工具软件有W32DASM、IDA Pro等。

但是,由于对机器语言进行反汇编的结果,可读性较差,因而人们转而根据目标可执行程序的开发语言针对性地进行反编译,得到相应的高级语言源代码。

1.VB程序的反编译

VBExplorer、VB反编译精灵和VBRezQ等都能对VB编写的程序进行反编译,但是不要对它们企求太高,大多时候并不能完全反编译出原来的代码,只能作为辅工具来用,协助你重建窗体和项目文件,还原部分源代码。即便是效果较好的VBRezQ,对于稍微复杂一些的VB程序,要想反编译得到完整的源码也是勉为其难。

2.Dephi程序的反编译

DeDe被认为是非常好用的Delphi反编译软件。它可得到所有的目标dfm文件,甚至可以创建一个带有所有的dfm、pas、dpr文件的Delphi工程的文件夹。

MRipper可以反编译任何Delphi可执行文件,并可从Delphi应用程序中提取cursors、icons、dfm文件、pas文件和其他资源。得到的pas文件不包含事件过程执行,还不能算是原味的源程序。

此外,还有DfmExplorer、Revendepro等Delphi的反编译工具。

3.C++程序的反编译

在传统C++语言的开发环境中,是直接将其编译为机器指令的,因此对C++的反编译就很困难,最多是反汇编到汇编代码。

但是使用微软为.net平台扩展的C++/CLI语言,编译之后的是.net平台的IL语言,通过简单的反汇编就可以得到几乎原样的源代码,如在VS2008下开发的Windows桌面程序,就可以用Reflector反编译出源代码。

此外,在.net 1.1时期,还有一种所谓的托管C++语言,它是在.net的虚拟机里运行的,可以反编译出托管代码。

虽然不能直接反编译得到C++程序的源码,却还是有工具可能帮助查看和分析C++程序。PE Explorer就是一款功能强大的可视化Delphi、C++、VB程序解析器,并且是一种集成化环境,捆绑了UPX的脱壳插件、扫描器和反汇编器,具备反汇编能力和PE文件头编辑功能,可以更容易地分析源代码,查看、替换和修复损坏了的资源。

4.JAVA程序的反编译

对Java的反编译比较常见,也比较完全,将.class文件反编译成.java文件也是有可能的。常用的Java反编译工具有JAD(Joint Application Development)、Java Decompiler、JDEC、Java204等。

5.其他程序的反编译

例如,C#程序的反编译器Reflector,易语言程序的反编译器E-Code Explorer,C语言程序的反编译器Exe2C、ExeToC,.net程序的反编译器.net Reflector等。

为了防止被反编译,有些软件的可执行文件在编译完成后会使用加壳工具进行加壳,甚至使用多个工具进行多重加壳。这些程序需要正确脱壳之后才能正常反编译。

要脱壳就需要先查壳。著名的查壳工具PEiD几乎可以侦测出所有的壳,数量已超过470种,还可识别出EXE文件是用什么语言编写的(如图1)。

需要说明的是,由于反编译工具的不同,以及对编译环境判断的失误,甚至脱壳过程的错误,对高级语言的反编译,得到的源代码可能与原作者的代码差别极大,可读性很差,虽然可能它们的执行结果是一样的。

摆脱束缚:电子文档的反编译

电子文档的传播,极大地方便了数字阅读和学习。然而美中不足的是,排版美观的电子文档,有时候却无法让我们再利用。一方面,是文档所有者对自己版权的保护;另一方面,一些电子文档格式本身的特点也决定了它不能够进行再编辑。

大多数情况下,电子文档中的文字等资源是允许被复制使用的,但有时也会设定为不允许复制,更不用说连内容和形式一起重新利用了。然而在很多时候,我们却需要还原这些文档的原有格式,以便重新编辑或者按自己的需要进行打印,这时候,就需要对这些电子文档进行反编译。

常用的电子文档的传播格式有DOC、PDF、CHM以及一些专用的电子杂志的格式。这些格式的电子文档(或电子图书)以PDF格式最为常见。由于PDF是一种大众化的文件格式,生成PDF格式文件的软件非常多,无法确定原始的源文件格式,因而对PDF文件的反编译,其实就是对它进行格式转换,如将它转换成Word的DOC格式。针对PDF的格式转换软件很多,效果较好的有AnyBizSoft PDF Converter等。

另外有些文档被制作成了CHM的帮助文件的格式,这些格式中的文本和图像等对象本身是可以复制的,但由于CHM通常是由HTML文件来制作生成的,在HTML代码中可能禁止了复制功能,所以有时也需要对CHM文件进行反编译。这类软件有ChmDecompiler、CHM电子书反编译精灵等。HTML Help WorkShop、CHM制作精灵则兼有编译和反编译的功能。

其实Windows中自带的CHM文件浏览工具hh.exe也具有反编译CHM文件的功能,需要在命令提示符下带参数运行。为了方便,可以把反编译的命令和参数写在一个批处理文件中,利用拖放来实现反编译过程:

@echo off

set filePath=%1%

for %%i in (%filePath%) do (

set folder=%%~di%%~pi

set fileName=%%~ni

set dir=%folder%%fileName%

md %dir%>nul 2>nul

start %windir%\hh.exe -decompile %dir% %filePath%

echo 反编译完成,文件保存在%dir%下

pause>nul

把上述内容保存在一个.bat文件中,把要反编译的CHM文件拖到这个bat文件上——见证奇迹的时刻到了!原来CHM文件所在位置多出一个同名的文件夹,里面是已经反编译出来的HTML文件。这可是系统自带的免费CHM文件反编译工具哦!

还有一些文档被编译成了专用电子杂志的格式,这些格式需要用专门的阅读器来打开,有些甚至直接就是EXE可执行文件的格式。这些电子杂志格式的文档,设计美观,操作方便,内容丰富,功能强大,其中常常包含有动画、音频等多媒体内容,要对它们进行反编译难度较大。有一款综合性电子杂志解包工具pkZine(原名unZineMaker),可用于解析各类流行电子杂志制作软件生成的EXE文件,从杂志中提取各种原始素材,如文字、SWF动画、JPG图片等。pkZine目前支持解析ZineMaker、IE Book超级精灵、Flash、Director、SWFKit、诺杰数码精灵、中国麦客、雅致打包工具等近20种软件生成的EXE文件(如图2)。

特别地,有些文档被制作成了SWF格式的Flash文件,可使用Flash Paper虚拟打印得到的SWF文档。SWF的反编译会在下面讲到。

心照不宣:Flash的反编译

对Flash文件的反编译也许是我们最熟悉的反编译工作了。由于众多的课件作品都是Flash格式的,很多教师需要把这些SWF文件反编译成FLA文件,再进行修改,重新制作成Flash运行文件,其目的不言自明。当然,Flash反编译工具的开发目的,决不仅仅是为了让人去篡改Flash作品,更多的是为了提取其中的资源,以及学习其中的代码。

最强大的Flash反编译工具应该非Action Script Viewer(简称ASV)莫属。ASV是一个商业SWF反编译工具,是同类产品中AS代码反编译效果最好、FLA工程重建成功率最高的软件。目前最新版本是ASV2013,支持AS1、AS2、AS3,可以支持Flash1.0~18(Adobe Flash CS6)所有版本的SWF文件,反编译出的代码准确性好,支持反编译各种加密SWF,支持SWF转FLA,完美重现文件结构和脚本代码(如图3)。

教师们在学校经常用的Flash反编译工具应该是硕思闪客精灵(Sothink SWF Decompiler)了,其方便而强大的SWF反编译功能在教师群体中有着极佳的口碑,不仅能解析SWF,提取其中的资源文件,也能将SWF文件还原为FLA文件,方便重新修改。只是重建FLA文件的效果要差些,会生成非常多的图层,对有些高版本的SWF甚至无法重建正确的FLA文件,AS代码的反编译能力也差一些。

实际上,如果仅仅是修改SWF文件,使用硕思闪客之锤(Sothink SWF Quicker)要更方便一些。闪客之锤是一款功能强大的SWF编辑修改工具,虽然不能反编译出FLA文件,却能够直接修改SWF文件,包括其中的AS代码都能直接修改,而且成功率很高,对教师修改Flash课件而言更具实用性(如图4)。类似的软件还有SWiX Free等。

另外,由于有些Flash文件被打包成了EXE文件,有时需要先把它们还原为SWF文件才能进一步进行反编译(闪客精灵等支持直接反编译EXE文件),这类工具软件也很多,如exe2swf等。

时尚潮流:安卓应用的反编译

Android(安卓)系统已然成为当前最流行的智能终端的操作系统,从手机、多媒体播放器、平板电脑,到网络机顶盒、智能电视,无处不见Android系统身影,其应用程序也非常丰富。

Android应用程序的扩展名是.apk,这其实是打包后的文件,我们都知道它们是用Java开发的。试着把这些.apk应用程序的扩展名改为.zip或.rar,会发现可以直接使用WinRAR之类的压缩软件打开(不改扩展名也可以打开,只是没有关联而已),里面是很多分门别类的文件(如图5)。因此,Android应用程序的反编译,就是针对.apk文件里面这些文件的反编译。

解开.apk文件后,可以看到里面有一个classes.dex和一些.xml文件,以及其他一些文件。在apk文件包中,res这个目录下是资源文件,可以直接提取出来;META-INF目录下是签名文件,用于确保压缩包的完整性;AndroidManifest.xml文件是编译后的配置文件,用于声明程序中所包含的activity、service以及程序权限;resources.arsc是编译后的资源说明文件。

.apk中的classes.dex就是主程序文件,它是.java文件编译后再通过dx工具打包生成的,用来在Android的dalvik虚拟机上运行。要得到它打包前的Java源程序,需要用到一些反编译工具,最常用的是dex2jar和jd-gui这两个工具。dex2jar用来把dex文件转换成jar文件,jd-gui则可以把转换得到的jar文件反编译成Java源文件。

为了反编译方便,使用dex2jar时,可以把classes.dex复制到dex2jar.bat所在的目录夹,并在命令提示符下转到这个目录,输入命令“dex2jar.bat classes.dex”,即生成classes.dex.dex2jar.jar文件。这个jar文件即可以用jd-gui直接打开查看,保存所有文件,即生成一个包含所有源代码文件压缩包。

如果要直接反编译.apk文件,可以使用另一个工具Apktool,这是谷歌官方提供的命令行apk编译、反编译工具。把.apk文件复制到软件所在目录下(方便起见,最好都置于C盘根目录),并在命令提示符下转到这个目录,输入命令“apktool d C:/xxx.apk C:/xxxx”,即可把xxx.apk文件释放到xxxx这个路径下。Apktool还有重编译的功能,可以重新生成.apk文件,这使它成为很受欢迎的Android反编译工具。

需要说明的是,用WinRAR等压缩软件虽然可以查看和解压缩.apk文件,但是其中的xml是经过优化的,不能直接查看,否则只会看到一堆乱码。用AXMLPrinter2.jar这个工具,可以反编译.xml文件。用baksmali.jar这个工具,也能反编译classex.dex文件。但是它们都需要用JDK来搭建Java运行环境,适合Java开发人员使用。

编译和反编译是互逆的过程,但二者并非一种对抗关系。虽然有时反编译会有悖于著作权保护,但是只要我们以正常的心态来正确使用,不突破道德和法律的底线,仍会对自己和他人有益。很多时候,文档编译的目的不再是版权的保护,而是运行的需要和规范,包括微软软件在内的很多编译软件自带了反编译功能,如Windows软件开发工具包中的Dumpbin就是一个例证。

上一篇:《图形的旋转》课件制作综述 下一篇:勇于到基层一线圆成才之梦