1、逆向工程
逆向工程 (Reverse engineering) 也称 "反向工程、还原工程"。在计算机软件中是指通过对他人软件 (比如:exe、apk 等编译后程序) 进行逆向分析研究,以推导出软件的 "设计思路、原理、结构、算法、处理过程、运行方法" 等,某些情况下还可以推导出软件的源代码。
高级语言源程序经过编译变成可执行文件,反编译就是逆过程。
2、反编译 工具
- 入门级:Apktool、dextojar 都是基于命令行
Apktool:对 Android apk 文件进行逆向工程的工具
dex2jar:将dex文件变成一个(包含class文件的)jar 文件。
jd-gui 用于显示 CLASS 文件中的 Java 源代码。
jd-gui 下载:https://github.com/java-decompiler/jd-gui - 初级:
Androidkiller 是基于 apktool 的图形化反编译工具
jadx 是另外一个 图形化的反编译工具 - 高级 :jeb 是收费工具且功能强大,可以动态调试 smali 代码。
更多 反编译工具
https://github.com/search?q=jadx
https://github.com/search?q=decompile可以 github 直接搜索 相关 关键字
关于 反编译 注意事项:
- 1、反编译的目的是分析代码,不是运行代码。
- 2、一般反编译后的代码是无法直接编译通过。
- 3、有些 app 进行了安全加固,例如:加壳、混淆,导致无法反编译或者反编译后是乱码。
AndroidKiller
Android Killer 是经典的 Android 反编译工具。工具毕竟很老了,无论是界面还是功能上都很难得到保证,还是推荐 JEB Decompiler 等仍在维护的反编译工具。
github:https://github.com/CherylVolta/android-killer
直接下载解压:https://codeload.github.com/CherylVolta/android-killer/zip/refs/heads/main
使用方法请参考此文或自行搜索:https://blog.csdn.net/yiran1919/article/details/132760445
AndroidKiller 安装、设置及使用教程:https://www.52pojie.cn/thread-726176-1-1.html
动态调试 smali:https://blog.csdn.net/zhangjianming2018/article/details/124512370
AndroidKiller 修改应用名称:https://www.cnblogs.com/zeussbook/p/11014144.html
Android 反编译美柚:https://www.jianshu.com/p/19b62aace407
smali 插桩 插件: :https://www.jianshu.com/p/a7d9c28337e5
apktool
apktool 是谷歌提供的 apk 编译工具,可以 反编译 和 回编译 (重新编译并打包,就是修改资源文件之后 rebuild 一个 apk)。APK 其实就是一个压缩包,可以把 .apk 修改为 .zip。通过这种方式来获取资源文件,但是 xml 会乱码。这时就需要使用 apktool 反编译 apk ,查看 xml 就不会乱码了。
- 下载、文档:https://apktool.org/docs/the-basics/intro
- github 地址:https://github.com/iBotPeaches/Apktool/releases
Dex、Smali、Class、Java、Jar 之间的相互转换
工具 | 作用 |
javac | java ------> class |
ddx | class ------> dex |
baksmali | dex ------> smali |
smali | smali ------> dex |
dex2jar | dex ------> jar ( class的压缩包 ) |
apktool | apk ------> smali |
官网文档:https://apktool.org/docs/install
windows 下安装
包装脚本不是必需的,但它很有帮助,可以让你不必重复输入 java -jar apktool.jar
Linux 下安装
macOS 下安装
反编译 apk ( d 参数 )
反编译命令:apktool d com.xxx.apk
decode 和 d 是等效。
apktool d bar.apk -o baz
apktool decode bar.apk -o baz执行过程中会输出主要步骤 log,反编译结束后,反编译的内容均在目录下的 相应文件夹下 -- 文件夹名字与 apk 同名。
可以使用 -o 来指定反编译的输出目录,如上命令为 反编译 bar.apk 到 baz 目录,也可以使用绝对路径,输出到任意目录。
反编译 apk 成 dex 文件:java -jar apktool_2.3.4.jar -s d crackme02.apk
重新打包成apk ( b 参数 )
修改后需要重新打包成 apk 的命令:apktool b 项目目录
项目目录 就是上一步反编译后生成的目录。build 和 b 是等效。
apktool b bar -o new_bar.apk
apktool build bar -o new_bar.apk可以使用 -o 来指定重新打包的输出目录,如上命令为 重新编译bar目录下的结构到 new_bar.apk,也可以使用绝对路径,输出到任意目录。
重新打包工程中,同样会输出主要步骤的 log。重新生成的 apk 位于目录中的 dist 目录下
注意:重新生成的 apk,是没有经过签名的,不能直接进行安装。需要重新签名
打包完成后会发现指定的目录下出现了打包好的 apk 文件。但是这个apk没有签名,需要重新签名之后,才能安装。
签名
首先需要生成 keystore 文件
命令:keytool -genkey -alias abc.keystore -keyalg RSA -validity 20000 -keystore abc.keystore
keytool 是 jdk 自带工具,在Java/bin 目录下
进行签名,命令:jarsigner -verbose -keystore abc.keystore -signedjar nopassword_signed.apk nopassword.apk abc.keystore
执行之后在当前目录下生成一个 xxx_signed.apk,代表apk已经签名了,可以安装了。
framework
每一个版本的 apktool 都自带有最新 AOSP 的 framework,能支持绝大多数的 apk 反编译。
framework 文档:https://apktool.org/docs/in-depth/frameworks
jadx (推荐)
gitHub 下载:https://github.com/skylot/jadx
Android 反编译利器,jadx 的高级技巧:https://www.jianshu.com/p/e5b021df2170使用 jadx 直接打开 apk 文件,就可以查看 反编译的源码。
jeb (推荐)
官网:https://www.pnfsoftware.com/
中文网站:https://www.jebdecompiler.com/
jeb_pro 下载:https://down.52pojie.cn/Tools/Android_Tools/
jeb_pro 下载:https://crifan.github.io/android_re_tool_jeb/website/download_run/
oracle java下载:https://www.oracle.com/cn/java/technologies/downloads/
注意:需要 Java17+ 以上环境,否则启动 jeb_demo 报错
JEB Decompiler是一款功能强大的反编译工具,主要用于代码分析和逆向工程。它能够将Android应用程序的Dalvik字节码反编译为可读的Java源代码,同时支持对ARM平台编写的程序和恶意软件进行逆向工程。相比 jadx,JEB 除了支持apk文件的反编译和Android App的动态调试,还支持 ARM、MIPS、AVR、Intel-x86、WebAssembly、Ethereum(以太坊)等程序的反编译、反汇编,动态调试等。另外,JEB能解析和处理一些PDF文件,是一个极其强大的综合性逆向和审计工具
jeb 版本概述
- 收费版本:JEB Pro (可以动态调试 smali 代码)。JEB Pro 附带了以下反编译器:
Dalvik(Android Dex 文件)
Intel x86:x86_32、x86_64、x87 (fpu)、MMX、SSE、其他 ISA 扩展(对 sse2+ 和 avx 的支持有限/WIP)
ARM:32 位、Thumb(16 位)、aarch64(64 位)、大多数 ISA 扩展
MIPS(32 位、64 位)
RISC-V(RV32、RV64)
Simatic S7 PLC (MC7),适用于 S7-300/S7-400 程序(手册)
WebAssembly 模块 (wasm)
以太坊合约(EVM代码)
Java(类文件) - 免费版本:社区版、演示版
社区版 (JEB Community Edition) = JEB Home Edition x86,不支持Android(的arm),仅支持(32位和64位的)x86。
演示版 (JEB Demo) 包含 JEB Pro 的大部分功能,附带完整版中提供的所有模块,但是使用时功能有很多限制,主要用于试用(功能演示)。
不同版本功能对比
目前,JEB 依赖于两个独立的反编译器管道:
- DEXDEC( dexdec ) 是 Dex/Dalvik(以及 Java)反编译器。此反编译器专门用于 Dalvik 输入。参考实现的主要接口是IDexDecompilerUnit。
GENDEC( gendec ) 是通用反编译管道,可以处理所有类型的代码、本机代码、托管代码或其他代码。GENDEC 比 DEXDEC 更模块化、更开放。所有本机(x86、arm 等)以及非本机(以太坊、WebAssembly)反编译器插件都是基于 GENDEC 构建的。参考实现的主要接口是INativeDecompilerUnit。
如何反编译
- 按Tab键反编译代码:汇编视图中,在想要反编译的代码区域按Tab键反编译代码。反编译的代码单元将获得焦点,并且插入符号将定位在与低级字节码或机器码最接近的代码区域上。
- 使用选项进行反编译:右键菜单中还提供使用选项进行反编译的功能。
jeb 使用教程
调试逆向分为 动态分析技术 和 静态分析技术
- 静态分析技术:是指逆向者利用反汇编工具将二进制的可执行文件翻译成汇编代码,通过对代码的分析来逆向软件;
- 动态调试:则是指逆向者利用调试器跟踪软件的运行,寻求逆向的途径。
动态调试有两种方法:
方法 1:Jeb 调试
方法 2:AndroidStudio + smalidea 插件动态调试。
菜单栏 ---> 编辑 ---> 语言 ---> 可以设置简体中文
中文教程:https://www.jebdecompiler.com/support.html
- 工作区:https://www.pnfsoftware.com/jeb/manual/workspace/
- Action:https://www.pnfsoftware.com/jeb/manual/actions/
- 视图:https://www.pnfsoftware.com/jeb/manual/views/
- 反编译:https://www.pnfsoftware.com/jeb/manual/decompiling/
- 调试:https://www.pnfsoftware.com/jeb/manual/debugging/
- 安卓分析:https://www.pnfsoftware.com/jeb/manual/android/
- 安卓调试:https://www.pnfsoftware.com/jeb/manual/android-debugging/
- Native 代码 分析:https://www.pnfsoftware.com/jeb/manual/native/
- WebAssembly 分析:https://www.pnfsoftware.com/jeb/manual/webassembly/
- ethereum 分析:https://www.pnfsoftware.com/jeb/manual/ethereum/
- 其他杂项:https://www.pnfsoftware.com/jeb/manual/misc
jeb 使用教程:https://crifan.github.io/android_re_tool_jeb/website/function_ui/
动态调试 smali:https://blog.csdn.net/freeking101/article/details/105910877
jeb 动态调试 smali:https://www.52hb.com/thread-49414-1-1.html
动态调试 其实操作很简单,首先确保 App 已经安装在了手机上,并且能在电脑上通过 adb 命令与手机连接。然后运行adb命令。
示例命令:adb shell am start -D -n com.goldze.mvvmhabit/.ui.MainActivity
这条命令的功能就是让 APP 以调试模式启动
-D 指定 APP 以调试模式启动
-n 指定启动入口,这里设置示例APP 包名和MainActivity
运行命令后,手机上会显示如下界面
这时回到 JEB 的界面,点击 工具栏 里的 Debug 按钮,之后会检测出正在运行的 Android 设备,点击下方的 Attach 按钮,Debugger 就成功挂载了手机上的 App 进程。
与此同时,手机上的 "Waiting for Debugger" 提示也消失了,示例 App 正常运行并加载出了第一页数据,这证明挂载成功了。
在 JEB 中可以选中想要调试的 Smali 代码,然后点击菜单栏中的 “Debugger” -> “Toggle Breakpoint” 来添加断点
gda (不依赖 java)
gda:https://github.com/charles2gan/GDA-android-reversing-Tool
官网:http://www.gda.wiki:9090/index.php
激活Pro版所有功能 :https://www.52pojie.cn/thread-1938478-1-1.html
蓝奏:https://www.lanzouw.com/b00mojrkva 密码:baap 解压密码:CXVUSER
拖拽操作,秒杀 Jadx,媲美 JEB,内置中文版,菜单栏 ---> Config ---> Set Chinese
轻松上手:https://zhuanlan.zhihu.com/p/28354064
GDA使用手册:https://bbs.kanxue.com/thread-266700-1.htm
GDA 不只是一款反编译器,同时也是一款轻便且功能强大的综合性逆向分析利器,不依赖 java 环境。支持 apk, dex, odex, oat, jar, class, aar文件的反编译,支持python及java脚本自动化分析。其包含多个由作者独立研究的高速分析引擎:反编译引擎、漏洞检测引擎、 恶意行为检测引擎、污点传播分析引擎、反混淆引擎、apk壳检测引擎等等
免费版、专业版 区别