Apktool 2.9.3 + dex2jar 2.1 组合实战:Mac 环境反编译与 Smali 代码修改

Apktool 2.9.3 + dex2jar 2.1 组合实战:Mac 环境反编译与 Smali 代码修改 Mac环境下的Android逆向工程Apktool与dex2jar深度实战指南1. 逆向工程工具链概述在Mac环境下进行Android应用逆向分析需要一套完整的工具链配合使用。这套工具链主要包括三个核心组件Apktool负责反编译APK文件提取资源文件如图片、XML布局文件等并将Dalvik字节码转换为可读的Smali代码dex2jar将APK中的classes.dex文件转换为Java标准的JAR文件JD-GUI可视化查看JAR文件中的Java源代码这三个工具的组合使用可以让我们从APK文件中提取出几乎所有的原始资源并尽可能还原出可读的源代码。提示虽然这些工具能还原大部分代码但经过混淆的代码仍然难以完全恢复原始结构和命名。2. 环境准备与工具安装2.1 安装Java开发环境逆向工程工具大多依赖Java环境首先需要确保系统已安装JDKbrew install --cask adoptopenjdk验证安装java -version2.2 安装Apktool通过Homebrew安装最新版Apktoolbrew install apktool验证安装apktool -version2.3 安装dex2jar从GitHub下载最新版dex2jarwget https://github.com/pxb1988/dex2jar/releases/download/2.1/dex-tools-2.1.zip unzip dex-tools-2.1.zip -d dex2jar chmod x dex2jar/*.sh2.4 安装JD-GUI下载并安装JD-GUIbrew install --cask jd-gui3. 完整逆向流程实战3.1 反编译APK资源文件使用Apktool反编译目标APKapktool d target.apk -o output_dir关键参数说明参数说明-d反编译模式-o指定输出目录-s不反编译代码仅资源-r不反编译资源反编译成功后output_dir目录结构如下output_dir/ ├── AndroidManifest.xml ├── apktool.yml ├── original/ ├── res/ └── smali/3.2 提取并转换DEX文件从APK中提取classes.dex文件unzip target.apk classes.dex -d temp_dir使用dex2jar转换为JAR文件./dex2jar/d2j-dex2jar.sh temp_dir/classes.dex -o output.jar3.3 查看Java源代码使用JD-GUI打开生成的output.jar文件open -a JD-GUI output.jar4. Smali代码修改与重打包4.1 理解Smali语法基础Smali是Dalvik虚拟机的汇编语言基本结构示例.class public Lcom/example/Test; .super Ljava/lang/Object; .source Test.java # 实例字段 .field private count:I # 直接方法 .method public constructor init()V .registers 1 .prologue .line 3 invoke-direct {p0}, Ljava/lang/Object;-init()V return-void .end method4.2 常见修改场景绕过简单验证.method public static isPremium()Z .registers 1 const/4 v0, 0x0 # 原始值 # 修改为 const/4 v0, 0x1 # 始终返回true return v0 .end method修改API端点const-string v0, http://original.api.com # 修改为 const-string v0, http://your.proxy.com4.3 重打包APK修改完成后使用Apktool重新打包apktool b output_dir -o modified.apk4.4 签名APK生成签名密钥keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias使用jarsigner签名jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.jks modified.apk my-alias优化APKzipalign -v 4 modified.apk final.apk5. 高级技巧与问题解决5.1 处理多DEX文件现代APK通常包含多个DEX文件处理流程# 提取所有DEX unzip target.apk classes*.dex -d temp_dir # 批量转换 for dex in temp_dir/classes*.dex; do ./dex2jar/d2j-dex2jar.sh $dex -o ${dex%.*}.jar done5.2 Android 12导出属性问题针对Android 12的导出属性要求修改AndroidManifest.xmlactivity android:name.TargetActivity android:exportedtrue !-- 明确声明导出属性 -- intent-filter action android:nameandroid.intent.action.VIEW / /intent-filter /activity5.3 自动化脚本示例完整流程自动化脚本#!/bin/bash APK$1 OUTPUT_DIR${APK%.*} # 反编译资源 apktool d $APK -o $OUTPUT_DIR # 提取并转换DEX unzip $APK classes*.dex -d $OUTPUT_DIR/dex for dex in $OUTPUT_DIR/dex/classes*.dex; do ./dex2jar/d2j-dex2jar.sh $dex -o ${dex%.*}.jar done # 自动打开JD-GUI open -a JD-GUI $OUTPUT_DIR/dex/classes*.jar echo 反编译完成输出目录: $OUTPUT_DIR6. 逆向工程中的注意事项法律风险仅对拥有合法权限的应用进行逆向分析代码混淆面对Proguard混淆时需要耐心分析关键逻辑完整性检查某些应用会校验自身完整性修改后可能导致崩溃多版本适配不同Android版本的核心库可能有差异在实际项目中逆向工程往往需要结合静态分析和动态调试才能取得最佳效果。掌握这些工具的使用只是第一步真正的挑战在于理解业务逻辑和找到关键代码位置。