APK
APK(Android Package)是 Android 应用程序的安装包格式,本质上是一个 ZIP 压缩包,包含编译后的代码、资源、清单文件等
文件结构
使用解压工具打开 APK,可看到标准目录结构
1 | APK/ |
AndroidManifest.xml:声明权限、Activity、Service、Receiver、Provider 等组件classes.dex:Dalvik 字节码,包含所有 Java/Kotlin 代码编译结果lib/:armeabi-v7a, arm64-v8a, x86 等原生.so库,通过 JNI 调用META-INF/:签名文件,用于完整性校验
实战案例
简单的 APK 分析(签到)

解包 APK 得到 multiprotocol.tesla.scada 文件
反编译该文件通过对比正版软件,很容易得到 flag(为混淆前的类名)

bang(梆梆壳 + Frida 动态脱壳 + Jadx 反编译)

使用 APKiD 识别出加固过,用的是 SecShell/梆梆壳
[*] signed.apk!classes.dex*:APKiD 开始扫描 APK 包中的classes.dex文件(即 Java/Kotlin 字节码的核心文件)。末尾的*表示该文件在 APK 中处于被压缩状态,APKiD 会在内存中实时解压并扫描*|-> anti_vm : possible ro.secure check:在 DEX 字节码中检测到了反虚拟机(Anti-VM)特征,具体表现为检查系统属性ro.securero.secure:Android 系统的只读属性。在生产环境(真机)中通常为 1
*|-> compiler : dexlib 2.x:检测到 DEX 文件的编译器版本标记为dexlib 2.x[*] signed.apk!lib/arm64-v8a/libSecShell.so:libSecShell.so是百度旗下的 “SecShell” 加固壳(俗称 “百度加固”)的标志性文件名|-> anti_hook : syscalls:在该 SO 库中检测到了反 Hook 机制,具体手段为直接使用系统调用

这里我使用的是 Genymotion 模拟器,安卓版本是 8.1,其自带 adb.exe
1 | # 列出设备 |

1 | # 获取 Android 系统版本 |

将 APK 拖进去运行

然后查看对应的进程
1 | adb shell ps | findstr how |

先查壳有没有释放 dex
1 | # /data/data:Android 系统规定的所有应用程序私有数据的根目录 |

把缓存文件拉回电脑
1 | mkdir dump_cache |

结果发现都是被混淆加密的文件

使用 frida 工具,提前下载好 frida-server-17.17.0-android-x86.xz,解压后把它改名成 fs 放到附件目录中
1 | # adb push:电脑 → 手机的传输命令 |
运行后需要开另一个终端看能不能连接上
1 | # 测试列出进程 |

其中 2458 how_debug 是我们的 APK
1 | # frida-dexdump:基于 Frida 的动态脱壳工具 |
成功 dump 两个 dex,分别是 classes.dex 和 classes2.dex

使用 Jadx 反编译拿到 flag
