由于黑客技能便是对打算机系统和网络的毛病和漏洞的创造,以及针对这些毛病履行攻击的技能。
这里说的毛病,包括软件毛病、硬件毛病、网络协议毛病、管理毛病和人为的失落误。
而这里的软件毛病剖析,或者漏洞的发掘就须要用到\公众编译技能\"大众和逆向剖析技能,而目前黑客从事网络协议毛病,硬件毛病的研究相对成熟。
而软件则不同,种类繁多,依托的系统架构又各不相同,软件又是直接与业务运用息息相关,以是软件的毛病、漏洞、优化、破解等需求,都须要用到\公众反编译技能。
以是如果你想成为一名真正意义的黑客,这个技能一定要学习!

本日就以本篇文章的内容详细给大家阐述一下\"大众反编译技能事理与实现\"大众!

一、什么是\"大众反编译\"大众?

反编译,又称为逆向编译技能,是指将可实行文件变成高等措辞源程序的过程。
反编译技能依赖于编译技能,是编译过程的逆过程。

delphiforphp破解手把手教你若何应用反编译技巧破解一个法式 AJAX

那什么是编译技能?

编译技能便是把高等措辞变成可实行文件的过程。
它的紧张过程如下所示:

编译程序把一个源程序翻译成目标程序的事情过程分为五个阶段:词法剖析;语法剖析;语义检讨和中间代码天生;代码优化;目标代码天生。

词法剖析的任务是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。

语法剖析以单词符号作为输入,剖析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,末了看是否构成一个符合哀求的程序。

语义剖析是审查源程序有无语义缺点,为代码天生阶段网络类型信息。
中间代码是源程序的一种内部表示,或称中间措辞。

中间代码的浸染是可使编译程序的构造在逻辑上更为大略明确,特殊是可使目标代码的优化比较随意马虎实现。
代码优化是指对程序进行多种等价变换,使得从变换后的程序出发,能天生更有效的目标代码。

目标代码天生是编译的末了一个阶段。
目标代码天生器把语法剖析后或优化后的中间代码变换成目标代码。

对付反编译技能,我们上文提到,它是编译的逆过程。
那是不是把上述的六个步骤颠倒,就变成了反编译的过程了呢?显然是不对的。
对付反编译过程,我们可以这么去理解:我们的源程序现在是二进制可实行文件或者汇编指令,我们的目标程序是某种特定的高等措辞。
那么现在这个过程该如何转化呢?这个中的中间代码的天生是否和编译过程中的一样呢?

基于上述事理及其疑问,我们很随意马虎便采取这种思想:将特定的机器代码,即我们的\"大众源程序\公众,先翻译为低级的中间代码,然后再根据特定的高等措辞将中间代码翻译为高等程序。
没错,反编译的紧张思想确实便是那样:反编译器也有前端和后端。
前端是一个机器依赖的模块,句法剖析二进制程序、剖析其指令的语义、并且天生该程序的低级中间表示法和每一子程序的掌握流向图。
通用的反编译机器是一个与措辞和机器无关的模块,剖析低级中间代码,将它转换成对任何高等措辞都可接管的高等表示法,并且剖析掌握流向图的构造、把它们转换成用高等掌握构造表现的图。
末了,后端是一个目标措辞依赖的模块,天生目标措辞代码。
反编译的过程中要利用一些工具:把二进制程序装入内存,对这一程序做句法剖析或反汇编,以及反编译或者剖析该程序来天生高等措辞程序。
这个过程借助编译器和库的署名来识别特定的编译器和库子程序。
只要在二进制程序中识别出编译器署名,就不去反编译这些编译器启动代码(start-up)和库子程序:对付前者,从末了的目标程序去掉启动代码的那些例程,反编译器从主(main)程序入口点开始剖析;对付后者,那些子程序用其库函数名代替。

以是我们可以采取下图来表示反编译的过程:

上图是我们对付反编译过程的低级构想(按照我们的理解),而实际的更为详细的过程则如下所示:

我们再对上述各个过程做一下更为详细的先容:

1语法剖析:语法剖析程序或语法剖析器把源程序的字节组织成源机器措辞的语法短语(或语句)。
这些短语用一个语法剖析树表示。
语法剖析器的紧张问题是确定哪些是数据和哪些是指令。

2语义剖析:语义剖析阶段检讨源程序一组指令的语义含义,网络类型信息并且向全体子程序通报这个类型。
对付任何一个编译器天生的二进制程序,只要程序能运行,其机器措辞的语义一定是精确的。
没见过哪一个二进制程序是由于编译器天生代码的缺点而不能运行。
因此,除非语法剖析器对某一条指令做了禁绝确的剖析或者把指令当作数据剖析,否则,在源程序中是不会有语义缺点的。

3中间代码天生:反编译器剖析程序须要一个中间表示法来明晰地表现源程序。
它必须随意马虎从源程序中天生,而且还必须适宜用来表示目标措辞。

4掌握流图天生:源程序中每一个子程序的掌握流图也是为反编译器剖析程序所必需的。
这个表示法适宜用来确定在程序中的高等掌握构造。
它也被用来打消掉由于机器措辞的条件跳转有偏移量限定因而被编译器产生的中间跳转。

5数据流剖析:数据流剖析阶段试图改进中间代码,以便能够得到高等措辞表达式。
在这个剖析期间,临时寄存器的利用和条件标志被打消掉,由于在高等措辞里面没有这些观点。

6掌握流剖析器阶段试图将程序每一个子程序的掌握流图组织成一个高等措辞布局的类集(通有的)。
这个类集必须包含大多数措辞都有的掌握指令。

7代码天生:反编译器的末了阶段是在掌握流图和每一个子程序中间代码的根本上天生目标高等措辞代码。
为所有的局部栈、参数和寄存器变量标识符选择变量名称。
也为在程序中涌现的各个例程指定各自的子程序名称。

二、反编译与反汇编的差异

很多人把反编译和反汇编理解为同一意义,实在还是有所不同的!

反汇编:一样平常是只对编译器根据高等措辞天生的本机二进制可直接在芯片上实行的机器码\"大众解析\公众为人类可读的汇编形式的代码(实际上最最早期的打算机操作员具备直接阅读机器码和利用机器码编程的能力,不须要转换为汇编形式,这是打算机遍及,程序规模也爆炸性增大后,人们就有须要转换为汇编代码来读懂机器码程序),早期的反汇编目的是编译器生产商用来检讨编译器天生代码的性能。
当今紧张在得不到源代码的情形下,研究剖析其他人的程序。

反编译事理:常日,编写程序是利用高等措辞如C,pascal等高等措辞进行编程的,然后再经由编译程序天生可以被打算机系统直接实行的文件(机器措辞)。
反汇编即是指将这些实行文件反编译还原成汇编措辞或其他高等措辞。
但常日反编译出来的程序与原程序会存在些许不同,虽然实行效果相同,但程序代码会发生很大的变革,要读懂反汇编须要有踏实的高等措辞编写功底和汇编功底。

反汇编实际属于反编译,反编译就包括各种措辞从低级或中间级措辞到高等措辞的解析。
如:.NET平台的C#就可由中间措辞MSIL反编译成C#,Java平台的就可由.class中的Java字节码反编译为Java代码后有其它的dex虚拟机的字节码,自定义的虚拟机字节码等等

总言之,反汇编属于反编译的一个分支,反编译是实现逆向编程的必经步骤这些都属于IT界的\"大众逆向工程\公众范畴。

二者的差异:反汇编仅仅是利用一些反汇编软件把程序从机器码翻译成汇编语句,而反编译不仅要做完反汇编的事情,还要在此根本上彻底理解这些汇编代码是什么意思,准确的说是这些代码能够实现什么功能,然后用自己熟习的措辞写出功能相似(不可能和原作者的代码完备相同)的代码或软件。

三、用实例理解“如何利用反编译技能破解一个程序”

实例一、破解须要注册的软件

我们有时在利用一些小工具软件时,会提示购买License(注册码之类的东东)后才能正常利用。
在这里我们来考试测验直接绕过License验证直策应用软件,实现大略的软件破解。

紧张实现办法:

通过反编译工具,反编译出软件源码。

剖析源码,找到License验证位置。

修正反编译代码。

重现编译天生修正后软件源码。

编写License验证demo代码:

Demo程序紧张逻辑:上岸界面(Lgoin.cs)验证License信息。
如果验证成功显示主窗体(MainWIndow.cs)功能界面,正常利用其软件功能。

破解Demo程序

根据demo程序逻辑剖析,只需把License验证代码删除或修正即可。

方法1:IL DASM

详细利用方法参考之前编写博客《C# IL DASM 利用》。
缺陷:通过ildasm.exe反编译出的代码为IL 中间措辞,想读懂和修正需对IL 中间措辞有一定根本。

方法2:Reflector

.NET Reflector 工具本身不带修正 dll 和 exe 功能,需下载插件:Reflexil (Reflexil.Reflector.AIO.dll)。

Reflexil 插件安装方法:Tools-->Add-Ins…--> + 点击\公众+\公众,选择下载好的Reflexil 插件路径。
点击\公众Close\"大众关闭窗体。

利用.NET Reflector 工具打开需反编译代码,剖析须要修正代码位置。

只需删除\"大众 if (!this.License(kay, text))\公众 判断代码。

开启 Reflexil 插件:tools -->\"大众Reflexil \公众

Reflexil 插件会将你选择的方法(Mothed) 天生IL 中间措辞。
对剖析须要删除的代码找到对应IL 中间措辞所在位置,进行删除。

末了保存修正后的EXE进行重新运行。
^-^ … 大略的破解事情已完成…^-^

从 Reflexil 插件菜单上可以看出,他还有很多功能,比如:注入类,注入接口,注入列举..等。
还是很强大的一款插件。

缺陷:Reflector 工具需收费。

方法3:ILSpy

ILSyp 工具只用四个字形容:大略,粗暴。
比较实用。
直策应用ILSyp 工具打开需反编译exe或dll,然后\"大众Save Code\"大众保存为VS能直接打开的项目。
修正代码后重新编译天生exe或dll 进走运行。

通过Save Code 保存的项目,利用VS可直接编译修正代码。

实例二、Android APK反编译

1.反编译工具

ApkTool : 将apk文件反编译成smali文件和资源文件等,天生一个文件夹,同样,也可以将这个文件夹天生apk文件。

dex2jar : 把dex文件转成jar文件

jd-gui : 将jar文件转换成java代码,可以更好的阅读代码

2.准备事情

我们准备一个反编译所须要的apk文件,这里我自己写了一个

登录功能一样平常是运用的入口,如果我们没有用户名和密码就进不去。

看到这里,大家可能想笔者肯定是想通过反编译来实现绕过登录功能。

本日重点要先容的是如何通过反编译在这个登录页面添加一个View并实现相应的功能。
附带内容:

· 反编译实现改换运用图标

· 反编译实现添加资源文件

· 反编译实现添加View并实现点击事宜

· 反编译实现修正功能

· 用ApkTool工具重新打包运用

3.反编译实现更换运用图标

1)通过apkTool工具将apk反编译天生一个文件夹。

进入cmd下切换到apktool目录下,输入apktool.bat d D:\apkTool\test.apk,会在apktool目录下天生一个test文件夹,如下是test文件夹的内容:(res:资源文件、smali:跟汇编类似的机器代码,如果须要添加四大组件,则需在AndroidManifest.xml下添加声明)

2).在天生的这个目录里找到res文件夹,进去后你会创造跟我们eclipse或as工程下的res文件夹构造一样,然后在对应目录下将运用图标换掉即可。
(把稳:图片格式一定要和原图片格式一样,不然会有莫名的缺点)

4.反编译实现添加资源文件

比如我们想在strings.xml下添加一个字符串并在代码中引用,大家可能就说这个大略呐,在strings.xml里加上一个字符串声明,然后在smali文件中引用就好了,然后编译成smali文件时候,啪,报错了,打包成apk不堪利,那么精确的做法是什么呢?

1).在res/values/strings.xml里添加一个字符串,如下:

2).在res/values目录下找到一个public.xml文件打开,找到末了一个String类型的一条,如下图一所示,它的id为0x7f060024,这些id是系统自动天生的,那么我们添加一个字符串就须要在这里手动天生一个id并且这个要唯一,默认在末了一个string的id加1就行,如下图二所示:(把稳:name要和strings.xml声明的name同等)

图一:

图二:

3).在smali文件夹下根据包名去找到R文件,如下图一,个中R$string.smali的美元符号 表示内部类的意思。
在string.smali文件里添加一条,如图二。

图一:

图二:

5.反编译实现添加View并实现点击事宜

如我们想在登录界面添加一个注册按钮,那该怎么添加呢?

1).在res/layout/activity_main.xml里添加一个按钮,如下:

2).在res/values/ids.xml里添加声明,如下:

3).在res/values/public.xml里找到末了一条id的条款,添加一条记录,并且id要唯一,如下:

4).在smali文件夹里根据包名找到R文件,在R的id.smali文件下添加声明,如下图,到此所有的准备都做完了,下面便是修正smali文件添加这个注册按钮的点击事宜。

6.在smali文件夹里根据包名找到MainActivity.smali文件,打开它,然后搜索onCreate,如下图一,我们可以看到findViewById这个字眼,我们可以随着写,对新加的按钮设置笔墨,如下图二,在这里,一定要把稳寄存器的利用,一欠妥心就出错了,如果不懂smali语法的,可以转头看一下smali语法整理

图一:

图二:

设置完笔墨后,接着就可以开始设置注册按钮的功能了,如下图,这里点击事宜是直接跳转其余一个页面,MainActivity$1是一个内部类,onclicklistener的实现类。

7.反编译实现修正功能

如果我们想绕过登录直接进入运用,那么此时我们肯定想到去改登录逻辑,打开MainActivity.smali文件,搜索setOnclickListener,可以看到便是登录按钮设置的点击事宜,但是登录的逻辑呢?在MainActivity$1.smali文件中,找到onClick方法中关键部分,笔者加上了注释,如下图:

那么我只要把跳转的逻辑搬到cond_0那里就ok了,我们试试:

8.用ApkTool工具重新打包运用

上面都是在修正资源文件,修正smali文件,我们改完怎么看效果呢?这个时候,就须要用强大的ApkTool工具重新打包运用了,在cmd下进入ApkTool目录,输入:apktool.bat b -f D:\apkTool\test(D:\apkTool\test这个目录是之前反编译天生的目录),如果我们修正没问题的话,就会在test目录下天生一个文件夹dist,在该文件夹里便是反编译后天生的apk文件。

此时,终于反编译完成了!

但是这时天生的apk还是不能用的,由于这是裸包,还没署名,系统是不会让你装的。

那么我们开始署名吧,怎么署名呢?同样还是用ApkTool工具,在cmd下进入ApkTool目录,输入:jarsigner -verbose -keystore 署名文件路径 -signedjar 署名后apk的路径 未署名apk的路径 署名别名,如下图:

署名完成后,我们安装已署名的apk,看看运行结果,是不是达到了自己想要的效果。

到此,smali反编译方法就完成了!

四、常用的反编译工具先容

apk反编译工具:

1.apktool 利用命令行查看Java代码,需合营GUI 查看代码

缺陷:查看Java代码时,须要先把apk文件变成zip文件,获取到dex文件,运行命令行d2j-dex2jar.bat

反编译:Java -jar apktool_xx.jar d -f 编译的apk -o 反编译后的apk

回编译:Java -jar apktool_xx.jar b 反编译后的apk -o 回编译后天生的apk路径

署名:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 署名文件路径 -signedjar 署名后的apk路径 署名的apk路径 署名文件名称

天生R文件:aapt package -m -J 天生R文件的路径 -S apk中的res的路径 -I adt中android.jar路径 -M AndroidManifest.xml路径

2.APKDB

优点:反编译、回编译、署名一键操作,大略方便,缺陷:查看Java代码时,须要先把apk文件变成zip文件,获取到dex文件,双击之后即可查看代码,但是代码可读性不强,跟apktool反编译的代码差不多,都需合营Gui。
当修正Mianfest时,须要把 original文件夹删除,否则修正不生效。

3.JADX

优点:双击jadx-gui.bat ,直接导入apk,方便大略 。
如图所示:

举例解释ApkTool、APKDB与JADX编译后的代码差异:

ApkTool、APKDB编译后的代码:

JADX编译后:

1、PE Explorer

功能极为强大的可视化汉化集成工具,可直接浏览、修正软件资源,包括菜单、对话框、字符串表等; 其余,还具备有 W32DASM 软件的反编译能力和PEditor 软件的 PE 文件头编辑功能,可以更随意马虎的剖析源代码,修复破坏了的资源,可以处理 PE 格式的文件如:EXE、DLL、DRV、BPL、DPL、SYS、CPL、OCX、SCR 等 32 位可实行程序。
该软件支持插件,你可以通过增加插件加强该软件的功能, 原公司在该工具中捆绑了 UPX 的脱壳插件、扫描器和反汇编器,非常好用。

唯一遗憾的是欠缺字典功能!

2、eXeScope V6.5

小巧但功能极其强大确当地化工具,可以直接修正 VC++ 及 DELPHI 体例的 PE 格式文件的资源,包括菜单、对话框、字符串和位图等,也可与其它本地化工具合营利用。
在汉化中不推举利用 eXeScope 作为汉化工具,仅作为汉化赞助工具。
6.50 版紧张对 DELPHI 7 编译的程序支持较好,对 DELPHI 7 以前版本编译的程序,建议利用 6.30 版本,由于该程序对 Unicode 字符显示支持不好。

3、Resource Hacker

一个类似于eXeScope的但在某些方面比它还好一些的工具。

1). 查看 Win32 可实行和干系文件的资源 (.exe, .dll, .cpl, .ocx),在已编译和反编译的格式下都可以。

2). 提取 (保存) 资源到文件 (.res) 格式,作为二进制,或作为反编过的译资源脚本或图像。
图标,位图,指针,菜单,对话,字符串表,表,加速器,Borland 窗体和版本信息资源都可以被完全地反编译为他们各自的格式,不论是作为图像或 .rc 文本文件。

3). 修正 (更换) 可实行文件的资源。
图像资源 (图标,指针和位图) 可以被相应的图像文件 (.ico, .cur, .bmp),.res 文件,乃至另一个 .exe 文件所更换。
对话,菜单,字符串表,加速器和表资源脚本 (以及 Borland 窗体) 可以通过利用内部资源脚本编辑器被编辑和重新编译。
资源也可以被一个 .res 文件所更换,只要更换的资源与它是同一类型并且有相同的名称。

4). 添加新的资源到可实行文件。
许可一个程序支持多种措辞,或者添加一个自定义图标或位图 (公司的标识等) 到程序的对话中。

5). 删除资源。
大多数编译器添加了运用程序永久不会用到的资源到运用程序中。
删除这些不该用的资源可以减小一个运用程序的大小。

4、PASSOLO Passolo 是一款功能强大的软件本地化工具,它支持以 Visual C++ 、Borland C++ 及 Delphi 措辞编写的软件(.exe、.dll、.ocx)确当地化。
以往针对这两种不同措辞编写的软件,我们大多是须要分别利用 Visual Localize 和 Language Localizator 来进行软件的中文化。
而现在,Passolo 把二者的功能结合在了一起,并且性能稳定、易于利用,用户即不须要进行专门的演习,也不须要丰富的编程履历,在本地化的过程中可能发生的许多缺点也都能由 Passolo 识别或自动纠正。

作为专业性确当地化工具,Passolo 的功能紧张包括:- 支持 VC 软件新旧版本套用资源或字典的翻译中文化;- 支持 Delphi 软件利用专用 / 通用字典翻译中文化;- 利用已有的多种格式的 Passolo 字典对新建方案进行自动翻译;- 对 VC 、Delphi 软件都支持标准资源的可视化编辑(酷!
);- 利用 Passolo 自带的位图编辑器可以直接对图片资源进行修正;- 可以把目标资源导出后借用外部程序翻译后再重新导入。

Passolo 还自带了 XML 、.NET 、 VB 和 Java 等数种插件(Add-in),专业的编程职员可以借用它们对相应的资源文件进行本地化编辑。