Android 4.4 以前,采用 dalvik /dvm虚拟机,代表:libdvm.so
Android 4.4,里面有 dvm和art虚拟机,可以切换 libdvm.so libart.so
Android 5.0及以后,使用art虚拟机,Android系统也开始分32位和64位 nexus5 32 6.0 --> 32位 nexus6p 64 6.0 -> 64位
详细了解,请移步:https://blog.csdn.net/u011033906/article/details/117806349
https://juejin.cn/post/7089376647576551461
Android 应用是用 Java 编写的,利用 Android SDK 编译代码,并且把所有的数据和资源文件打包成一个 APK(Android Package)文件,这是一个后缀名为 .apk 的压缩文件,apk 文件中包含了一个 Android 应用程序的所有内容,是 Android 平台用于安装应用程序的文件。apk 就是一个压缩包,解开这个 apk 包我们可以看到以下的结构:
作用介绍如下:
.R
文件中生成与其对应的资源ID,assets 不会自动生成对应的id,访问的时候需要 AssetManager 类.R
文件中,生成对应的ID,访问的时候直接使用资源 ID 即 R.id.filename
,res 文件夹下可以包含多个文件夹,其中 anim 存放动画文件;drawable 目录存放图像资源;layout目录存放布局文件;values 目录存放一些特征值,colors.xml 存放 color 颜色值,dimens.xml 定义尺寸值,string.xml 定义字符串的值,styles.xml 定义样式对象;xml 文件夹存放任意xml文件,在运行时可以通过 Resources.getXML() 读取;raw 是可以直接复制到设备中的任意文件,他们无需编译。整体资讯
的设定文件,简单来说,相当于 Android 应用向 Android 系统 自我介绍
的配置文件,Android 系统可以根据这个 自我介绍
完整地了解 apk 应用程序的资讯,每个 Android 应用程序都必须包含一个 AndroidManifest.xml 文件,且它的名字是固定的,不能修改。在开发 Android 应用程序的时候,一般都把代码中的每一个 Activity,Service,Provider 和 Receiver 在 AndroidManifest.xml 中注册,只有这样系统才能启动对应的组件,另外这个文件还包含一些权限声明以及使用的SDK版本信息等等。程序打包时,会把 AndroidManifest.xml 进行简单的编译,便于 Android 系统识别,编译之后的格式是AXML格式,如下图所示:.R
文件,我们调用这个 ID
就可以,但是只有这个 ID
还不够,.R
文件只是保证编译程序不报错,实际上在程序运行时,系统要根据 ID 去寻找对应的资源路径,而 resources.arsc
文件就是用来记录这些 ID 和资源文件位置对应关系的文件。更详细的Android系统目录介绍请参考文章:https://blog.csdn.net/abc6368765/article/details/125403212
逆向中关键的一步就是反编译 apk 文件,将其还原成可读性高的 Java 代码,在多数情况下,我们是通过观察并分析这个 Java 代码就能找到想要的核心逻辑。工欲善其事,必先利其器。用来反编译 apk 文件的工具有很多,例如:jadx、JEB、Apktool、jda 等,不同工具的用法和定位也有所不同。
jadx 是一款使用广泛的反编译工具,可以一键把 apk 文件还原成 Java 代码,使用起来很简单,功能强大,还具有一些附加功能可以辅助代码追查。GitHub 地址为:https://github.com/skylot/jadx。主要具有如下几个功能:
jadx 本身是一个命令行工具,仅仅通过 jadx 这个命令就可以反编译一个 apk 文件。除此之外,它也有配套的图形化界面工具(jadx-gui),这个使用起来更加方便,能直接以图形界面的方式打开一个 apk 文件。同时,jadx-gui 对反编译后得到的 java 代码和其他资源文件增加了高亮支持(就像在IDE中打开这些内容一样),还具有快速定位、引用搜索、全文搜索等功能。所以,我们往往直接使用 jadx-gui 完成一些反编译操作。
Windows 下直接到点击 此处 下载对应的 Release 包即可,如下图所示:
单击,下载中,如下图所示:
如果 Github 链接打不开的,可以直接从我的百度网盘中进行下载,下载链接如下:
链接:https://pan.baidu.com/s/1grSPLrlqEIUqbftVFvYbNw
提取码:tm9h
--来自百度网盘超级会员V8的分享
下载之后直接解压到自己常用的目录即可,解压之后会得到一个 bin 目录,进入 bin 目录直接运行 jdax 和 jadx-gui 即可,Windows 可以直接双击 jadx.bat 或 jadx-gui.bat 即可运行。如下图所示:
使用 jadx 的命令执行文件的反编译操作,主要是指定一些输入参数和输出参数,这些参数的设置细节直接参考参数说明即可。运行 jadx -h 命令 (以管理员身份运行cmd窗口,并且进入到jadx解压的目录),查看 jadx 命令的用法,如下图所示:
可以看到,参数 就是输入文件的路径,其他参数如 -d 可以指定反编译后输出文件的路径, -r 可以指定不解析资源文件(能够提升整体反编译的速度)。使用下面的命令对已经下载好的
scrape-app5.apk
文件进行反编译:
jadx scrape-app5.apk -d scrape-app5
运行完毕后,本地会生成一个 scrape-app5 文件夹,还原效果还是比较理想的,就这样,我们只需要一条简单的命令就完成了对 apk 文件的反编译,其中 Java 代码的逻辑一览无遗。
jadx-gui 是一个图形界面工具,它就像一个 IDE,支持很多方便快捷的交互式操作(例如把一个 apk 文件拖到 jadx-gui 后,它会直接打开这个软件,之后高亮显示反编译后的代码),以及代码搜索、定位等。
在 Windows 下直接双击 jadx-gui.bat
,jadx-gui 便启动了,这是我们可以看到下图所示的界面:
可以通过文件路径打开 apk,也可以直接将 apk 文件拖到 jadx-gui 的窗口中,还可以从菜单栏中的 文件-->打开文件
调出资源管理器来打开 apk 文件。文件打开之后,稍等片刻,反编译就完成了,这是看到的界面 如下图所示:
从界面的左侧可以发现,反编译后的 Java 源代码以一个个包的形式组织在一起,另外还有资源文件,其中包括图片文件、布局文件和 AndroidManifest.xml 文件(内含 apk 文件的基本信息)等。在左侧展开想要查看的包,右侧就会出现对应的 Java 源代码,如下图所示:
可以看出,Java 源代码的还原度还是很高的。
我们也可以把反编译后的文件另存为 Gradle 项目,Gradle 项目就是开发版本的 Andriod 项目,如下图所示:
导出后的项目目录结构和我们在 jadx-gui 界面里看到的结构基本一致,这个项目是可以被 Android Studio 工具打开的,打开的界面如下图所示:
打开之后的代码一般没办法直接运行,因为毕竟整个项目是反编译出来的,不太可能完全还原出开发版本的 Andriod 项目。如果你对 Andriod 开发比较了解,可以尝试修改一下源码和 Gradle 配置,是可以使项目正常运行的,即使不能运行也没有太大关系,我们的目的并不是运行这个代码,而是分析其中的逻辑,所以要把目光聚焦在查找和定位目标方法与逻辑定义上,Android Studio 能够帮我们更方便地完成这些操作,当然 jadx-gui 也提供了查找和定位的相关功能,现在我们回到 jadx-gui,了解一下它的其他常见用法。
在源代码中搜索 /api/movie
字符串,可以使用 jadx-gui 提供的搜索功能,打开菜单栏里的 导航-->搜索文本
,如下图所示:
这时 jadx-gui 会显示一个搜索框,如下图所示,在 搜索文本:
下方填入 /api/movie
,同时可以从类名、方法名、变量名和代码中选择搜索位置,自行勾选即可,下方会显示搜索结果。
可以看到,搜索到了一处包含 /api/movie
字符串的位置,可以依次看一下这两处的内容,先选中搜索结果,然后点击 转到
按钮,即可跳转到对应的代码处,如下图所示:
鼠标右键单击任意方法名,会打开一个菜单,选择 跳到声明
,如下图所示:
这时候就会跳转到声明方法的位置。
右击声明处的 initCrash 方法名,在打开的菜单中可以看到一个 查找用例
的选项,如下图所示:
点击之后,查找到的结果如下图所示:
搜索结果有一处,直接双击结果或者先选中结果再点击 转到按钮
,都可以跳转到对应的代码处。
jadx-gui 还有一个强大的功能,就是反混淆。有时候从一些单个字母变量等并不好推测究竟是什么意思,这是 App 在编译和打包阶段做了一些混淆操作导致的结果,和 JavaScript 中的变量混淆非常相似。针对这个问题,jadx-gui 具有反混淆功能。我们可以打开反混淆开关,点击菜单栏中的 工具-->反混淆
,如下图所示:
反混淆能够进一步提升代码的还原度,从而让我们更方便地推敲代码中的逻辑。
jadx-gui 还提供了很多功能设置,可以点击工具栏中的 首选项
按钮,如下图所示:
然后会打开一个设置页面,如下图所示:
这其实是一个总的设置页面,我们可以在这里配置 jadx-gui 的各个选项,如是否启用反混淆、反编译过程中允许的并行线程数、系统是否区分大小写、是否反编译资源文件等,这些和 jadx 的一些命令功能是一致的。
在 jadx-gui 允许的过程中,还可以查看运行日志,点击工具栏中的 日志
按钮即可打开日志查看器,如下图所示:
日志查看器如下图所示,可以通过上方的选择框选择日志等级,例如这里选择了 ERROR 级别,即显示错误日志。
如果反编译过程出现了错误,就可以来这里查看错误细节。
如果有些 apk 文件比较大,jadx-gui 反编译所需的时间和消耗的资源会更多,所以有时候在反编译过程中会提示如下错误:
java.lang.OutOfMemoryError: GC overhead limit exceeded
....
这里报了一个 OutOfMemoryError 错误,代表内存溢出,对于一些比较大的 apk 文件,是会出现这种问题的,可以尝试用以下两种方式解决:
在第2天,我们学习了 Android的一些基础知识以及 jadx、jadx-gui 的基本使用方法,利用这两个工具,我们可以非常方便地反编译 apk 文件,还原出原始的 Java 代码,从而找到我们想要的核心逻辑。今天学习的内容比较基础,需要好好掌握,之后会经常使用 jadx 来反编译 apk 文件。