反编译源码修改-《黑客》深度学习之《反编译技术原理与实现》

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

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

今天我就结合本文的内容来详细探讨一下“反编译技术的原理及实现”!

1.什么是“反编译”?

反编译也称为逆向编译技术,是指将可执行文件变成中间语言源程序的过程。 反编译技术依赖于编译技术,是编译过程的逆过程。

编译技术有哪些?

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

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

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

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

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

中间代码的作用是使编译器的结构在逻辑上更加清晰,特别是使目标代码的优化更容易实现。 代码优化是指对程序进行多次等价的变换,使得从变换后的程序开始,可以生成更有效的目标代码。

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

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

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

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

上图是我们反编译过程的中间设想(根据我们的理解),实际更详细的过程如下:

我们对上述流程进行更详细的介绍:

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

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

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

4 控制流图生成:源程序中各子程序的控制流图也是反编译器分析程序所必需的。 该表示法适用于识别程序中的中层控制结构。 它还用于清理编译器进行的中间跳转,因为机器语言条件跳转有偏移量限制。

5 数据流分析:数据流分析阶段试图改进中间代码,以便得到中间语言表达。 在此剖析过程中,消除了临时寄存器和条件标志的使用,因为高级语言中没有这样的概念。

6.控制流分析器阶段尝试将程序的每个子程序的控制流图组织成由中间语言构造的类集(公共)。 该集合必须包含大多数语言通用的控制指令。

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

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

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

反汇编:一般只是将编译器根据可直接在芯片上执行的本机二进制的高级语言生成的机器代码“分析”成人类可读的汇编代码(其实最早的计算机算子具有直接读取机器码的能力,使用机器码编程不需要转换为汇编模式,这是由于计算机的普及和程序体积的爆炸性减小,人们需要转换为汇编代码才能理解机器码程式)。 汇编的目的是编译器制造商用来测试编译器生成的代码的性能。 现在我们主要是研究分析别人的程序,而不拿到源代码。

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

反汇编实际上属于反编译,反编译包括对各种语言从低级或中级语言到高级语言的分析。例如:.NET平台上的C#可以通过中间级反编译成C#语言MSIL,并且在Java平台上可以从. 虚拟机字节码等

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

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

3.通过实例了解“如何借助反编译技术破解程序”

例1.破解需要注册的软件

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

主要实现方法:

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

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

修改反编译代码。

重新编译并生成更改后的软件源代码。

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

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

破解Demo程序

根据demo程序逻辑分析,只需删除或更改License验证码即可。

方法1: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,然后“保存代码”保存为VS可以直接打开的项目。 修改代码后,重新编译生成exe或dll运行。

对于通过Save Code保存的项目,可以使用VS直接编译、更改代码。

示例2. 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:apkTooltest.apk,会在apktool目录下生成一个test文件夹,test文件夹内容如下:(res:资源文件、smali:类似汇编的机器码,如果需要添加四大组件,需要在AndroidManifest.xml下添加声明)

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

4.反编译并添加资源文件

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

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

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

图1:

图二:

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

图1:

图二:

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句型排列

图1:

图二:

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

7.反编译实现更改功能

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

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

8.使用ApkTool重新打包应用程序

以上都是更改资源文件和修改smali文件。 修改后如何看到效果呢? 这时候就需要使用强大的ApkTool工具来重新打包应用程序。 cmd下进入ApkTool目录,输入:apktool.bat b -f D:apkTooltest(D:apkTooltest这个目录是编译生成的目录),如果我们改一下没有问题的话,会出现一个文件夹test目录下会生成dist,其中就是反编译后生成的apk文件。

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

但此时生成的apk仍然无法使用,因为它是裸包,没有经过签名,所以系统不会让你安装。

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

签名完成后,我们安装签名后的apk,看看运行结果是否达到了我们想要的疗效。

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

4.常用反编译工具介绍

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的路径 - AndroidManifest.xml的路径

2.APK数据库

优点:反编译、重新编译、签名一键操作,简单方便。 缺点:查看Java代码时,需要先将apk文件制作成zip文件,得到dex文件,双击查看代码,但代码可读性不强,类似于apktool反编译的代码,全部需要和桂合作。 更改Mianfest时,需要删除原来的文件夹,否则更改不会生效。

3. 贾德克斯

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

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

ApkTool、APKDB编译代码:

JADX编译后:

1.PE浏览器

是一款极其强大的可视化中文集成工具,可以直接浏览和修改软件资源,包括菜单、对话框、字符串表等; 另外,它还具有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.资源黑客

与 eXeScope 类似的工具,但在某些方面略优于 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),专业程序员可以使用它们来本地化和编辑相应的资源文件。