Android 反编译 学习记录

admin 2024年11月24日13:57:53评论11 views字数 5630阅读18分46秒阅读模式

Android 反编译  学习记录

关于 APK

安卓应用程序使用JAVA语言编写。安卓的SDK工具负责将你编写的代码,用到的数据和资源文件编译进APK文件中,APK:android package(应用程序安装包)。apk文件包含了一个安卓应用程序的所有内容,并且被安卓设备用来安装应用程序。而 apk 文件本质上其实是一个 zip 包,修改后缀名,进行解压就可以看到内部结构。每个文件夹都有各自不同的作用 ,如下:

Android 反编译  学习记录

Android 反编译  学习记录

主要注意红色标注部分,这一些文件和文件夹是一个 Android 应用基本都具备的。而其他的一些文件和文件夹则是一些第三方库,或者是其他一些代码生成的。接下来,依次大概介绍一下这些文件和文件夹的作用。 

1、AndroidManifest.xml( 应用的全局配置文件  )

这是 Android 应用的全局配置文件,它包含了这个应用的很多配置信息,例如包名、版本号、所需权限、注册的服务等。可以根据这个文件在相当程度上了解这个应用的一些信息。该文件目前状态是被编译为二进制的 XML 文件,可以通过一些工具(如 apktool)反编译后进行查看。  

Android 反编译  学习记录

2、assets文件夹(原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的网页、音频等等  )

assets 文件夹用于保存需要保持原始文件的资源文件夹,开发过程中拖了什么到里面,打包完之后里面还是什么。一般用于存放音频,网页,字体等文件, 如游戏的声音文件,字体文件等等,在代码中可以用AssetManager获取assets文件夹的资源。主要需要知道的点是,它与 res 文件夹的区分以及如何在应用中访问该文件夹的资源,如它可以有多级目录而 res 则只有两级。 

Android 反编译  学习记录

3、classes.dex 文件( 源代码编译成class后,转成jar,再压缩成dex文件,dex是可以直接在Android虚拟机上运行的文件。)

classes.dex 文件是 Android 系统运行于 Dalvik Virtual Machine 上的可执行文件,也是Android 应用程序的核心所在。项目工程中的 Java 源码通过 javac 生成 class 文件,再通过 dx 工具转换为 classes.dex,注意到我们这里有 classes2.dex 和 classes3.dex。这是方法数超过一个 dex 的上限,分 dex 的结果。分 dex 在 Android 5.0 之前需要开发者自行完成,5.0 后 dx 自带支持。

传统 Class 文件是由一个 Java 源码文件生成的 .Class 文件,而 Android 是把所有 Class 文件进行合并优化,然后生成一个最终的 class.dex 文件。它包含 APK 的可执行代码,是分析 Android 软件时最常见的目标。由于dex文件很难看懂,可通过apktool反编译得到.smali文件,smali文件是对Dalvik虚拟机字节码的一种解释(也可以说是翻译),并非一种官方标准语言。通过对smali文件的解读可以获取源码的信息。 

4、lib 文件夹(  引用的第三方sdk的so文件 )

该目录存放着应用需要的 native 库文件。比如一些底层实现的图片处理、音视频处理、数据加密的库以 so 库的形式在该文件夹中。而该文件夹下有时会多一个层级,这是根据不同CPU 型号而划分的,如 ARM,ARM-v7a,x86等,如下图: 

Android 反编译  学习记录

5、META-INF 文件夹( Apk签名文件  )

该目录的主要作用是用于保证 APK 的完整性以及安全性。  MANIFEST.MF,这个文件保存了整个 apk 文件中所有文件的文件名 + SHA-1后的 base64 编码值。这也就意味着,MANIFEST.MF 象征着 apk 包的完整性。再说 CERT.RSA,这个文件保存了公钥和加密方式的信息。最后说 CERT.SF,这个文件与 MANIFEST.MF 的结构一样,只是其编码会被被私钥加密。这样一来每次安装时,通过该文件夹中的文件,就可以完成验证的过程。如果 apk 包被改变了,而篡改者没有私钥生成 CERT.SF,则无法完成校验。 Android 反编译  学习记录

6、res 文件夹( 资源文件,包括了布局、图片等等。)

该文件夹是资源文件夹。它里面存放的所有文件都会被映射到 R 文件中,生成对应的资源 ID,便于代码中通过 ID 直接访问。其中的资源文件包括了动画(anim),图像(drwable),布局(layout),常量值(values),颜色值(colors),尺寸值(dimens),字符串(strings),自定义样式(styles)等。 

  • res文件夹: 存放资源文件,包括icon,xml文件

    1. res/layout/: 存放被编译为屏幕布局(或屏幕的一部分)的XML文件

    2. res/values/: 存放可以被编译成很多类型的资源文件

    • array.xml: 定义数组

    • string.xml: 定义字符串(string)值

Android 反编译  学习记录

Android 反编译  学习记录

Android 反编译  学习记录

7、resource.arsc 文件( 二进制资源文件,包括字符串等, 记录资源文件和资源id的映射关系  )

这个文件可以说是所有文件中结构最复杂的。
它记录了资源文件,资源文件位置(各个维度的路径)和资源 id 的映射关系。并且将所有的 string 都存放在了 string pool 中,节省了在查找资源时,字符串处理的开销。

8、original 文件夹

original文件夹下存放的是未经反编译过、原始的AndroidManifest.xml文件,res文件夹下存放的是反编译出来的所有资源,smali文件夹下存放的是反编译出来的所有代码,AndroidManifest.xml则是经过反编译还原后的manifest文件。这里值得一提的是smali文件夹,如果你进入到这个文件夹中你会发现它的目录结构和我们源码中src的目录结构是几乎一样的,主要的区别就是所有的java文件都变成了smali文件。smali文件其实也是真正的源代码,只不过它的语法和java完全不同,它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言。

9、smali 文件夹

smali 是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。利用apktool或者Android Killer,反编classes.dex文件,就可以得到以smali为后缀的文件,这些smali文件就是Dalvik的寄存器语言。

Android 反编译  学习记录

APK 打包流程

学习资料来自:

随梦,公众号:Tide安全团队Android逆向:基础入门

Android 反编译  学习记录

Android应用编译流程按图中的例子就是一个app应用的生成过程。在应用程序上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场。

下面给大家简单讲解下:

  • 第一步:打包资源文件,生成R.java文件
    通过利用aapt资源打包工具,将文件目录中的Resource文件(就是工程中res中的文件)、Assets文件、AndroidManifest.xml文件、Android基础类库(Android.jar文件)进行打包,生成R.java

  • 第二步:aidl生成Java文件
    AIDL是Android Interface Definition Language的简称, 是Android跨进程通讯的一种方式。检索工程里所有的aidl文件,并转换为对应的Java文件

  • 第三步:编译Java文件,生成对应的.class文件
    将R.java、aidl生成的Java文件、Java源文件通过JDK携带的Javac编译生成.class文件

  • 第四步:把.class文件转化成Davik VM支持的.dex文件
    通过dx工具将.class文件生成为classes.dex

  • 第五步:打包生成未签名的.apk文件
    利用apkbuilder工具,将resources.arsc、res目录、AndroidManifest.xml、assets目录、dex文件打包成未签名的apk

  • 第六步:对未签名.apk文件进行签名
    使用apksigner为安装包添加签名信息。

  • 第七步:对签名后的.apk文件进行对齐处理
    使用zipalign工具对签名包进行内存对齐操作, 即优化安装包的结构。

APK 反编译步骤

1、准备工具

工欲善其事,必先利其器,首先我们要下载好反编译apk时需要的相关工具  

apktool  作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看下载链接:https://bitbucket.org/iBotPeaches/apktool/downloads/dex2jar作用:将apk反编译成java源码(classes.dex转化成jar文件)下载链接:https://github.com/pxb1988/dex2jar/releasesenjarify作用:将apk反编译成java源码(apk包直接获取jar文件,classes.dex转化成jar文件)Dex2jar 是一个较旧的工具,它也尝试将 Dalvik 转换为 Java 字节码。它在大多数情况下都运行良好,但许多模糊的特性或边缘情况会导致它失败,甚至默默地产生不正确的结果。下载链接:https://github.com/Storyyeller/enjarifyjd-gui作用:查看APK中classes.dex转化成出的jar文件,即源码文件下载链接:http://java-decompiler.github.io

2、ApkTool拆包,得到AndroidManifest和res等资源文件

功能:

拆解Apk文件,反编译其中的资源文件,将它们反编译为可阅读的AndroidManifest.xml文件res文件。( 直接把Apk文件当做zip解压,得到的xml资源文件,都是无法直接用文本编辑器打开阅读的,因为它们在打包时经过了build-tools的处理。)  

用法:

java -jar apktool.jar d ApkFile.apk// 在这个命令后面还可以添加像`-o -s`之类的参数,例如// java -jar apktool.jar d ApkFile.apk -o 自定义文件夹 -s// 几个主要的参数设置方法及其含义: d 参数表示decode-f 如果目标文件夹已存在,强制删除现有文件夹-o 指定反编译的目标文件夹的名称(默认会将文件输出到以Apk文件名命名的文件夹中)-s 保留classes.dex文件(默认会将dex文件解码成smali文件)-r 保留resources.arsc文件(默认会将resources.arsc解码成具体的资源文件)

Android 反编译  学习记录

Android 反编译  学习记录

Apk拆包成功后我们就得到一个可阅读的AndroidManifest.xml文件、assets文件夹、res文件夹、smali文件夹等等啦。original文件夹是原始的AndroidManifest.xml文件,res文件夹是反编译出来的所有资源,smali文件夹是反编译出来的代码。注意,smali文件夹下面,结构和我们的源代码的package一模一样,只不过换成了smali语言。它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言。

这时,我们已经可以使用idea打开AndroidManifest.xml文件和assetsres下面的layout文件啦。这样,我们就可以查看到这个Apk文件的package包名、Activity组件、程序所需要的权限、xml布局、图标等等信息。Android 反编译  学习记录

3、dex2jar、enjarify反编译dex文件,得到java源代码

3.1 获取clasees.dex 文件

方法一:使用apktool 工具 加 -s 参数 拆包后,获取classes.dex 文件

java -jar apktool_2.7.0.jar d test123.apk -o test12345 -s-s 保留classes.dex文件(默认会将dex文件解码成smali文件)

Android 反编译  学习记录

Android 反编译  学习记录

方法二:将apk包后缀改名为zip 后缀(apk 本质上就是zip 文件),然后解压后获取classes.dex文件

Android 反编译  学习记录

3.2 d2j-dex2jar 反编译dex 文件

功能:

将dex格式的文件,转换成jar文件。dex文件时Android虚拟机上面可以执行的文件,jar文件大家都是知道,其实就是java的class文件。  

用法:

将上面获取的classes.dex文件复制到dex2jar下,打开下载的dex2jar-2.0文件夹,里面有shell和bat脚本,进入终端,就可以在命令行使用了。

d2j-dex2jar.bat classes.dex

Android 反编译  学习记录

3.3 enjarify 反编译dex 文件

Dex2jar 是一个较旧的工具,它也尝试将 Dalvik 转换为 Java 字节码。它在大多数情况下都运行良好,但许多模糊的特性或边缘情况会导致它失败,甚至默默地产生不正确的结果。相比之下,Enjarify 被设计为在尽可能多的情况下工作,即使对于 Dex2jar 会失败的代码也是如此。除其他外,Enjarify 正确处理 unicode 类名、用作多种类型的常量、隐式转换、跳入正常控制流的异常处理程序、引用太多常量的类、非常长的方法、catchall 处理程序之后的异常处理程序以及静态初始值类型错误。

python3 -O -m enjarify.main test123.apkpython3 -O -m enjarify.main classes.dexpython3 -O -m enjarify.main test123.apkclasses.dex -o 自定义文件名

Android 反编译  学习记录

Android 反编译  学习记录

4、jd-gui查看java源代码

功能:

JD-GUI 是一个独立的图形实用程序,可显示“.class”文件的 Java 源代码。您可以使用 JD-GUI 浏览重构的源代码,以便即时访问方法和字段。

用法:

下载后双击既可以运行这个工具,直接把上一步得到的test123-enjarify.jar拖到jd-gui程序的界面上即可打开了,效果如下图所示。

Android 反编译  学习记录

工具获取

后台回复:apk反编译

End

Android 反编译  学习记录

原文始发于微信公众号(贝雷帽SEC):Android 反编译 -- 学习记录

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月24日13:57:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Android 反编译 学习记录https://cn-sec.com/archives/1823170.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息