一下反编译技术原理与实现(二):如何成为一名真正意义的黑客

“反编译技术”是黑客从初级到高级的学习过程中必学的技术。前期我们熟悉基础知识,熟悉脚本或工具的使用。这只是学习的初级阶段,也是从初学者到入门的过程,但要想成为真正的黑客,就必须学习“反编译技术”!为什么这么说?

因为黑客攻击是发现计算机系统和网络中的缺陷和漏洞,以及攻击这些缺陷的技术。这里所说的缺陷包括软件缺陷、硬件缺陷、网络协议缺陷、管理缺陷和人为错误。这里的软件缺陷分析或漏洞发现需要用到“反编译技术”和逆向分析技术。目前黑客从事网络协议缺陷的研究,对硬件缺陷的研究比较成熟。软件不同,种类很多,系统架构也不同。该软件与业务应用程序直接相关。所以软件的缺陷、漏洞、优化、破解等需求都需要用到“反编译”技术。所以如果你想成为真正的黑客,这个技术一定要学会!

今天就结合本文内容详细讲解“反编译技术原理及实现”!

一、什么是“反编译”?

反编译,又称逆向编译技术,是指将可执行文件转化为高级语言源程序的过程。反编译技术依赖于编译技术,是编译过程的逆过程。

什么是编译技术?

编译技术是将高级语言转换为可执行文件的过程。其主要流程如下:

编译器将源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。

词法分析的任务是处理由字符组成的词,从左到右逐个字符地扫描源程序,逐个生成词符号,将源程序作为字符串转换为词符号串。中级课程。

语法分析以单词符号为输入,分析单词符号串是否形成符合语法规则的语法单元,如表达式、赋值、循环等,最后看是否构成符合要求的程序。

语义分析是检查源程序的语义错误并为代码生成阶段收集类型信息。中间代码是源程序或中间语言的内部表示。

中间代码的作用是使编译后的程序结构在逻辑上更简单清晰,尤其是使目标代码的优化更容易实现。代码优化是指对程序进行多次等价变换,从而从变换后的程序开始,生成更高效的目标代码。

目标代码生成是编译的最后阶段。目标代码生成器将解析或优化的中间代码转换为目标代码。

对于反编译技术,正如我们上面提到的汇编语言转机器码工具,它是编译的逆过程。那是不是把上面的六个步骤反过来,变成了反编译的过程呢?显然不对。对于反编译过程,我们可以这样理解:我们的源程序现在是二进制可执行文件或者汇编指令,而我们的目标程序是特定的高级语言。那么现在应该如何改造这个流程呢?中间代码的生成和编译过程一样吗?

基于以上原理及其疑惑,我们很容易采用这样的思路:先把具体的机器码,也就是我们的“源程序”,翻译成低级的中间代码,然后再根据特定的高级语言。代码被翻译成高级程序。没错,反编译的主要思想正是:反编译器也有前端和后端之分。前端是一个依赖机器的模块,它对二进制程序进行语法分析,分析其指令的语义,并为每个子程序生成程序的低级中间表示和控制流图。通用反编译器是一个独立于语言和机器的模块,它分析低级中间代码,将其转换为任何高级语言可接受的高级表示,并分析控制流图的结构,将其转换为高级 控制结构性能的图表。最后,后端是生成目标语言代码的目标语言相关模块。在反编译过程中使用了一些工具:将二进制程序加载到内存中,对程序进行语法分析或反汇编,对程序进行反编译或分析以生成高级语言程序。此过程使用编译器和库签名来识别特定的编译器和库子例程。只要在二进制程序中识别出编译器签名,这些编译器启动代码(start-up)和库子程序就不会被反编译:对于前者,那些从最终目标程序中去掉启动代码的程序,反编译器分析从主(main)程序入口点开始;对于后者,这些子例程将替换为其库函数名称。

所以我们可以用下图来表示反编译过程:

上图是我们对反编译过程的初步构想(据我们了解),实际更详细的过程如下:

让我们对上面的每个过程进行更详细的介绍:

1 解析:解析器或解析器将源程序的字节组织成源机器语言中的语法短语(或语句)。这些短语由解析树表示。解析器的主要问题是判断什么是数据,什么是指令。

2 语义分析:语义分析阶段检查源程序中一组指令的语义含义,收集类型信息并将该类型传递给整个子程序。对于编译器生成的任何二进制程序,只要程序能够运行,其机器语言的语义就必须是正确的。我从未见过由于编译器生成的代码错误而无法运行的二进制程序。因此,除非解析器错误地解析了一条指令或将指令解析为数据,否则源程序不会出现语义错误。

3 中间代码生成:反编译器分析程序需要一个中间表示来明确表示源程序。它必须易于从源程序生成,并且还必须适合表示目标语言。

4 控制流图生成:源程序中各个子程序的控制流图也是反编译器分析程序所必需的。这种表示法适用于确定程序中的高级控制结构。它还用于去除由于机器语言条件跳转的偏移限制而由编译器生成的中间跳转。

5 数据流分析:数据流分析阶段尝试改进中间代码,以便获得高级语言表达式。在此分析期间,临时寄存器使用和条件标志被清除,因为这些概念在高级语言中不可用。

6 控制流分析器阶段试图将程序的每个子程序的控制流图组织成一个高级语言结构的类集(通用)。这组类必须包含大多数语言中可用的控制指令。

7 代码生成:反编译器的最后阶段是根据控制流图和每个子程序的中间代码生成目标高级语言代码。为所有本地堆栈、参数和寄存器变量标识符选择变量名称。还要为程序中出现的各个例程分配各个子例程名称。

二、反编译和反汇编的区别

很多人把反编译和反汇编理解为同一个意思,但实际上是不一样的!

反汇编:一般只有编译器根据可以在芯片上直接执行的高级语言生成的机器码被“解析”成人类可读的汇编代码(实际上是最早的计算机操作)人们有能力直接阅读机器码并使用机器码进行编程,而不需要转换成汇编形式。这是因为计算机的普及和程序规模的爆炸式增长,人们需要转换成汇编形式。代码来理解机器代码程序),编译器制造商使用早期反汇编来检查编译器生成代码的性能。如今,对他人程序的研究和分析主要是在没有源代码的情况下完成的。

反编译原理:通常程序是用C、pascal等高级语言编写的,然后编译生成计算机系统可以直接执行的文件(机器语言)。反汇编是指将这些可执行文件反编译并还原为汇编语言或其他高级语言。但是,反编译的程序通常与原始程序略有不同。虽然执行效果是一样的,但是程序代码会发生很大的变化。要理解反汇编,需要扎实的高级语言编写和汇编基础。

反汇编其实属于反编译,反编译包括从低级或中级语言到高级语言的各种语言的分析。比如.NET平台上的C#可以通过中间语言MSIL反编译成C#,Java平台可以从.class中的Java字节码反编译成Java代码,然后还有其他dex虚拟机字节码,自定义虚拟机字节码等

总之,反汇编属于反编译的一个分支,反编译是实现逆向编程的必要步骤。这些都属于IT行业的“逆向工程”范畴。

两者的区别:反汇编只是使用一些反汇编软件将程序从机器码翻译成汇编语句,而反编译不仅需要完成反汇编工作,还要在此基础上彻底理解汇编代码。什么意思,准确的说这些代码能实现什么功能,然后用自己熟悉的语言写出功能相似的代码或软件(不可能和原作者的代码完全一样)。

三、用一个例子理解“如何使用反编译技术破解程序”

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

有时我们在使用一些小工具软件时,会提示我们购买许可证(注册码之类)才能正常使用。这里我们尝试绕过许可验证,直接使用软件实现简单的软件破解。

主要实现:

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

分析源码找到license验证位置。

修改反编译的代码。

重现编译生成修改后的软件源代码。

编写许可证验证演示代码:

Demo程序的主要逻辑:登录界面(Lgoin.cs)验证License信息。如果验证成功,则显示主窗口(MainWIdow.cs)功能界面,其软件功能正常使用。

破解演示程序

根据demo程序的逻辑分析,删除或修改license验证码即可。

方法一:IL DASM

具体用法可以参考之前的博客《C# IL DASM用法》。缺点:ildasm.exe反编译出来的代码是IL中间语言。想要理解和修改,需要有一定的IL中间语言基础。

方法二:反射器

.NET Reflector工具本身不具备修改dll和exe的功能。需要下载插件:Reflexil(Reflexil.Reflector.AIO.dll)。

Reflexil插件安装方法:Tools–>Add-Ins…–> + 点击“+”选择下载的Reflexil插件路径。点击“关闭”关闭表单。

使用.NET Reflector工具打开需要反编译的代码,分析需要修改的代码位置。

只需删除“if (!this.License(kay, text))”代码即可。

打开 Reflexil 插件:工具 –>”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 重新打包应用程序

图片[1]-一下反编译技术原理与实现(二):如何成为一名真正意义的黑客-老王博客

3.反编译替换应用图标

1)使用apkTool工具反编译apk生成文件夹。

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

2)。在生成的目录中找到 res 文件夹。进入后你会发现和我们eclipse下的res文件夹结构或者作为项目一样,然后替换对应目录下的应用程序图标即可。能。 (注意:图片格式必须和原图格式一致,否则会出现莫名错误)

4.反编译添加资源文件

比如我们要在strings.xml下添加一个字符串并在代码中引用,你可能会说这很简单,在strings.xml中添加一个字符串声明,然后在smali文件中引用。那么编译成smali文件的时候,slap,报错,打包成apk也不成功,那么正确的做法是什么呢?

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

2)。在res/values目录下找到一个public.xml文件并打开,找到最后一个String类型,如下图1所示,它的id是0x7f060024,这些id是系统自动生成的,那么我们需要在这里手动生成一个 id 来添加一个字符串,这必须是唯一的。默认情况下,最后一个字符串的id加1,如下图2所示:(注意:名称必须与strings.xml中声明的名称一致)

图一:

图2:

3)。在smali文件夹中根据包名找到R文件,如下图1所示,其中R$string.smali的美元符号表示内部类。在 string.smali 文件中添加一个,如图 2 所示。

图一:

图2:

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,如下图1所示,我们可以看到findViewById这个词,我们可以按照它和写入新添加的按钮设置文本,如下图2所示。这里,一定要注意寄存器的使用。不了解smali语法的可以回头看看smali语法。

图一:

图2:

设置好文字后,就可以开始设置注册按钮的功能了,如下图,这里点击事件是直接跳转到另一个页面,MainActivity$1是一个内部类,的实现类onclicklistener。

7.反编译实现修改功能

如果我们想绕过登录直接进入应用,那么这时候就要想到改变登录逻辑了,打开MainActivity.smali文件,搜索setOnclickListener,可以看到是点击事件由登录按钮设置,但登录逻辑呢?在MainActivity$1.smali文件中找到onClick方法的关键部分,作者添加注释,如下图:

那我只要把跳转逻辑移到cond_0就可以了,我们试试:

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 signature file path -signedjar signed apk path unsigned apk path 签名别名,如下图:

签名完成后,我们安装签名后的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包-m -J生成R文件的路径-S apk中res的路径-I中android.jar的路径-M AndroidManifest.xml的路径

2.APKDB

优点:反编译、重编译、签名一键操作,简单方便,缺点:查看Java代码时,需要将apk文件转成zip文件,获取dex文件,双击即可查看代码,但是代码可读性不强,和apktool反编译的代码类似,需要配合gui。修改Mianfest时需要删除原文件夹,否则修改不会生效。

3.JADX

优点:双击jadx-gui.bat直接导入apk,方便简单。如图:

举例说明ApkTool、APKDB和JADX编译代码的区别:

ApkTool和APKDB编译的代码:

JADX编译后:

1、PE 资源管理器

非常强大的可视化本地化集成工具,可以直接浏览和修改软件资源,包括菜单、对话框、字符串表等。此外汇编语言转机器码工具,它还具有W32DASM软件的反编译能力和PE文件头编辑功能PEditor软件功能,可以更方便的分析源代码,修复损坏的资源,可以处理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、资源黑客

一个类似于 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),专业程序员可以借用这些插件在本地编辑对应的资源文件。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论