安卓逆向之编译、反编译、打包

admin 2022年9月30日11:13:28评论61 views字数 2891阅读9分38秒阅读模式
安卓逆向之编译、反编译、打包
安卓逆向之编译、反编译、打包

公众号:易锦课堂

点击右方领取,回复1即可领取安卓逆向教学大礼包一份。


领取



安卓逆向之编译、反编译、打包

整理丨阿星

文章来源丨Smali 学习笔记

注丨侵联删



今天小编在网上整理了一下资料给大家分享一下,反编译、编译还有打包,希望能帮助到大家在学习逆向的过程中更进一步哦。


安卓逆向之编译、反编译、打包


使用工具:

apktool、smali baksmali 工具


首先我们用smali 和 baksmali 这两个工具汇编和反汇编DEX 文件的使用,我们使用 baksmali.jar 反汇编 HelloWorld.dex 只需输入以下命令。

java -jar baksmali.jar -o HelloWorldOut HelloWorld.dex

命令执行成功后会在 HelloWorldOut 目录下生成相应 smali 文件,我们在修改完 smali 代码后,使用 smali.jar 重新汇编成 HelloWorld.dex

输入命令:

java -jar smali.jar -o HelloWorld.dex HelloWoldOut

我们只需把生成的 HelloWorld.dex 通过 adb 命令 push 到手机上,并使用 dalvikvm 命令 便可以运行这个 DEX 文件,执行的命令如下:

adb push HelloWorld.dex /data/local/adb shell dalvikvm -cp /data/local/HelloWorld.dex HelloWorld

当然使用 smali 和 baksmali 工具只能用来汇编和反汇编 Android 的可执行文件,因此使用这 两个工具是无法完成 Android 安装包(APK)的反编译和打包的功能,好在一个名为 android-apktool 的 Google 开源工具可以完成这个事情

使用 apktool 

apktool 工具是在 smali 工具的基础上进行封装和改进的,除了对 DEX 文件的汇编和反 汇编功能外,还可以对 APK 中已编译成二进制的资源文件进行反编译和重新编译。同时也 支持给 smali 代码添加调试信息以支持断点调试。因此我们直接使用 apktool 工具来反编译 Android apps,而不是 smali 和 baksmali 工具。

APK 的组成 

在介绍 apktool 使用之前,我们先来看看一个 apk 包的组成。apk 文件其实是 zip 压缩包 格式,我们使用工具进行解压后可以其目录组成

以 HelloWorld.apk 为例:

|-- HelloWorld/|-- AndroidManifest.xml 被编译成二进制的配置文件|-- class.dex Android 可执行文件|-- resources.arsc 被编译成二进制的主资源文件|-- assets/ 不需编译的原始资源文件目录|-- res/ 资源文件目录|-- lib/ 库文件目录|-- META-INF/ APK 的签名信息
使用方法
使用 apktool 反编译 HelloWorld.apk 文件到 out 目录的方法:
java -jar apktool.jar d HelloWorld.apk out/
apktool d 命令执行成功会在 out 目录下产生如下所示的一级目录结构:
|-- out/|-- AndroidManifest.xml 配置文件|-- apktool.yml 反编译生成的文件,供 apktool 使用|-- assets/ 不需反编译的资源文件目录|-- lib/ 不需反编译的库文件目录|-- res/ 反编译后的资源文件目录|-- smali/ 反编译生成的 smali 源码文件目录
在浏览各个子目录的结构后,我们可以发现其结构原始 APP 工程目录结构基本一致, smali 目录结构对应着原始的 java 源码 src 目录,而 META-INF 目录已经不见了,因为反编译 会丢失签名信息。反编译后会多生成 apktool.yml 文件,这个文件记录着 apktool 版本和 Apk 文件名和是否 framework 文件等基本信息,在 apktool 重新编译时会使用到。在修改完相应的 smali 代码和资源文件后,我们可以使用以下命令进行编译打包:

java -jar apktool.jar b out/ HelloWorld.apk
有时候我们在反编译系统 app 的时候会出错,提示无法找到资源,必须先加载合适的 framework 资源文件。这是因为 apktool 编译和反编译过程会依赖到 framework 中的代码和 资源,而这个 app 中使用了 framework-res.apk 之外扩展的 framework 资源文件。因此,我 们通常反编译前会把 system/framework/目录下所有资源文件 apk 都先加载在 apktool 工具中。使用的命令如下:
java -jar apktool.jar if framework-res.apk

反编译、编译过程

我们执行 apktool d 命令可以看整个反编译过程的输出信息:

I: Baksmaling...I: Loading resource table...I: Loaded.I: Decoding AndroidManifest.xml with resources...I: Loading resource table from file: /home/wzx/apktool/framework/1.apkI: Loaded.I: Decoding file-resources...I: Decoding values*/* XMLs...I: Done.I: Copying assets and libs...

整个反编译过程可以分为四个阶段:

1) DEX 可执行文件 baksmali 反汇编过程;

2) 二进制配置文件 AndroidManifest.xml 反编译;

3) 根据 framework 资源列表反编译二进制资源文件;

4) 直接复制不需要反编译的资源和库文件。

为最大程度地还原被编译成二进制的资源文件,apktool 需要一个可读性较高的资源 的名称,而不是二进制索引,这些名称则是在 framework 的资源文件中被定义。apktool 默认内嵌了 Android 标准 framework 资源,因此大部分 APP 反编译不需要指定资源文件, 而通常厂商都会扩展自己的资源文件,并在系统 APP 中引用,这就是我们前面提到的反编 译前需要加载/system/framework 下所有资源文件的原因。


apktool b 命令编译打包过程输出的信息:

I: Checking whether sources has changed...I: Smaling...I: Checking whether resources has changed...I: Building resources...I: Copying libs...I: Building apk file...


编译打包过程也可以分为四个阶段:

1) 汇编 smali 源码目录生成 DEX 可执行文件;

2) 使用 aapt 把资源文件编译成二进制格式文件;

3) 复制不需编译的库文件到目标目录; 

4) 使用 aapt 把目标文件重新打包成 apk 文件。


以上就是小编整理的编译、反编译、打包过程了,不懂的同学可以留言问问我,当然朋友们也可以直接扫码了解一下安卓逆向技术知识。


安卓逆向之编译、反编译、打包


qq交流群:779719294



原文始发于微信公众号(映山红coin安全团队):安卓逆向之编译、反编译、打包

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月30日11:13:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安卓逆向之编译、反编译、打包https://cn-sec.com/archives/1056457.html

发表评论

匿名网友 填写信息