跳过内容

MASTG-TECH-0007: 探索应用包

一旦收集到目标应用程序的包名,您将希望开始收集有关它的信息。首先,检索 APK,如 获取和提取应用程序 中所述。

APK 文件实际上是可以利用标准解压实用程序(如 unzip)解压缩的 ZIP 文件。但是,我们建议使用 Apktool,它还可以解码 AndroidManifest.xml 并将应用程序二进制文件 (classes.dex) 反汇编为 smali 代码

$ apktool d UnCrackable-Level3.apk
$ tree
.
├── AndroidManifest.xml
├── apktool.yml
├── lib
├── original
│   ├── AndroidManifest.xml
│   └── META-INF
│       ├── CERT.RSA
│       ├── CERT.SF
│       └── MANIFEST.MF
├── res
...
└── smali

将解压缩以下文件

  • AndroidManifest.xml:包含应用程序包名称、目标和最低 API 级别、应用配置、应用组件、权限等的定义。
  • original/META-INF:包含应用程序的元数据
    • MANIFEST.MF:存储应用程序资源的哈希值
    • CERT.RSA:应用程序的证书
    • CERT.SF:资源列表和 MANIFEST.MF 文件中相应行的 SHA-1 摘要
  • assets:包含应用程序资源的目录(Android 应用程序中使用的文件,例如 XML 文件、JavaScript 文件和图片),AssetManager 可以检索这些资源
  • classes.dex:以 DEX 文件格式编译的类,Dalvik 虚拟机/Android 运行时可以处理。DEX 是 Dalvik 虚拟机的 Java 字节码。它针对小型设备进行了优化
  • lib:包含作为 APK 一部分的第三方库的目录
  • res:包含尚未编译到 resources.arsc 中的资源的目录
  • resources.arsc:包含预编译资源的文件,例如布局的 XML 文件

由于使用标准 unzip 实用程序进行解压缩会使某些文件(如 AndroidManifest.xml)无法读取,因此最好使用 Apktool 解压缩 APK。

$ ls -alh
total 32
drwxr-xr-x    9 sven  staff   306B Dec  5 16:29 .
drwxr-xr-x    5 sven  staff   170B Dec  5 16:29 ..
-rw-r--r--    1 sven  staff    10K Dec  5 16:29 AndroidManifest.xml
-rw-r--r--    1 sven  staff   401B Dec  5 16:29 apktool.yml
drwxr-xr-x    6 sven  staff   204B Dec  5 16:29 assets
drwxr-xr-x    3 sven  staff   102B Dec  5 16:29 lib
drwxr-xr-x    4 sven  staff   136B Dec  5 16:29 original
drwxr-xr-x  131 sven  staff   4.3K Dec  5 16:29 res
drwxr-xr-x    9 sven  staff   306B Dec  5 16:29 smali

Android Manifest 文件

Android Manifest 是主要的信息来源,它包含很多有趣的信息,例如包名、权限、应用组件等。

以下是一些信息和相应的关键字的非详尽列表,您可以仅通过检查文件或使用 grep -i <keyword> AndroidManifest.xml 轻松地在 Android Manifest 中搜索它们

请参考提到的章节以了解有关如何测试这些点的更多信息。

应用二进制文件

应用二进制文件 (classes.dex) 可以在应用包的根目录中找到。它是一个所谓的 DEX(Dalvik 可执行文件),其中包含已编译的 Java 代码。由于其性质,在应用一些转换后,您可以使用反编译器生成 Java 代码。我们还看到了在运行 apktool 后获得的文件夹 smali。它包含以一种名为 smali 的中间语言反汇编的 Dalvik 字节码,它是 Dalvik 可执行文件的人类可读表示形式。

有关如何逆向工程 DEX 文件的更多信息,请参阅 审查反编译的 Java 代码

编译后的应用二进制文件

在某些情况下,检索编译后的应用二进制文件 (.odex) 可能很有用。

首先获取应用程序的数据目录的路径

adb shell pm path com.example.myapplication
package:/data/app/~~DEMFPZh7R4qfUwwwh1czYA==/com.example.myapplication-pOslqiQkJclb_1Vk9-WAXg==/base.apk

删除 /base.apk 部分,添加 /oat/arm64/base.odex,并使用生成的路径从设备中提取 base.odex

adb root
adb pull /data/app/~~DEMFPZh7R4qfUwwwh1czYA==/com.example.myapplication-pOslqiQkJclb_1Vk9-WAXg==/oat/arm64/base.odex

请注意,确切的目录会因您的 Android 版本而异。如果找不到 /oat/arm64/base.odex 文件,请手动在 pm path 返回的目录中搜索。

原生库

您可以检查 APK 中的 lib 文件夹

$ ls -1 lib/armeabi/
libdatabase_sqlcipher.so
libnative.so
libsqlcipher_android.so
libstlport_shared.so

或使用 objection 从设备中获取

...g.vp.owasp_mobile.omtg_android on (google: 8.1.0) [usb] # ls lib
Type    ...  Name
------  ...  ------------------------
File    ...  libnative.so
File    ...  libdatabase_sqlcipher.so
File    ...  libstlport_shared.so
File    ...  libsqlcipher_android.so

目前,这是您可以获得的关于原生库的所有信息,除非您开始对其进行逆向工程,这是使用与用于逆向应用程序二进制文件不同的方法完成的,因为此代码无法反编译,只能反汇编。有关如何逆向工程这些库的更多信息,请参阅 审查反汇编的原生代码

其他应用资源

通常值得查看 APK 根文件夹中可能找到的其他资源和文件,因为有时它们包含额外的有用信息,如密钥库、加密数据库、证书等。