BugkuCTF 安卓逆向:APK反编译与JEB/JD-GUI 3.5.0实战,3步定位关键校验逻辑
📅 2026/7/8 20:19:11
👁️ 阅读次数
📝 编程学习
BugkuCTF 安卓逆向实战:APK反编译与关键校验逻辑定位指南
1. 安卓逆向基础工具链搭建
在开始逆向分析之前,需要准备以下工具链:
- Apktool:用于反编译APK文件,获取资源文件和smali代码
- dex2jar:将dex文件转换为jar文件
- JD-GUI/JEB:查看反编译后的Java代码
- Android Studio:用于调试和查看AndroidManifest.xml
工具安装与配置:
# 安装apktool wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool chmod +x apktool sudo mv apktool /usr/local/bin/ # 安装dex2jar wget https://github.com/pxb1988/dex2jar/releases/download/2.1/dex2jar-2.1.zip unzip dex2jar-2.1.zip chmod +x dex2jar-2.1/*.sh2. APK反编译三步法
2.1 使用apktool解包APK
apktool d target.apk -o output_dir解包后会得到以下目录结构:
smali/:包含所有smali代码res/:资源文件AndroidManifest.xml:应用配置文件
2.2 提取并转换dex文件
# 从APK中提取classes.dex unzip target.apk classes.dex # 使用dex2jar转换为jar d2j-dex2jar.sh classes.dex2.3 使用JD-GUI分析Java代码
java -jar jd-gui.jar classes-dex2jar.jar3. 快速定位关键校验逻辑
3.1 分析AndroidManifest.xml
查找主Activity入口:
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>3.2 搜索关键字符串
在JD-GUI中搜索以下关键词:
checkverifyvalidatesignauth
3.3 动态调试技巧
使用Android Studio附加进程调试:
- 在
AndroidManifest.xml中添加android:debuggable="true" - 重新打包并签名APK
- 使用adb连接设备:
adb connect 设备IP adb shell am start -D -n 包名/主Activity
4. Timer题目实战分析
以BugkuCTF中的Timer题目为例,演示完整逆向流程:
4.1 反编译APK
apktool d timer.apk -o timer_out d2j-dex2jar.sh timer_out/classes.dex4.2 分析MainActivity
关键代码段:
public class MainActivity extends AppCompatActivity { int beg = (int)(System.currentTimeMillis() / 1000L) + 200000; int k = 0; protected void onCreate(Bundle savedInstanceState) { // ... handler.postDelayed(new Runnable() { public void run() { if (MainActivity.this.beg - now <= 0) { tv2.setText("alictf{" + MainActivity.this.stringFromJNI2(k) + "}"); } if (isPrime(beg - now)) { k += 100; } else { k--; } } }, 0L); } }4.3 修改smali逻辑
定位关键判断逻辑:
if-lez v0, :cond_0 # 修改为if-ltz使用apktool重新打包:
apktool b timer_out -o timer_modified.apk4.4 签名APK
keytool -genkey -v -keystore my.keystore -alias myalias -keyalg RSA -keysize 2048 -validity 10000 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore timer_modified.apk myalias5. 常见校验逻辑破解技巧
5.1 字符串加密处理
常见加密方式:
- Base64变种
- XOR异或加密
- AES/DES对称加密
解密示例(Python):
import base64 encrypted = "991YiZWOz81ZhFjZfJXdwk3X1k2XzIXZIt3ZhxmZ" decoded = base64.b64decode(encrypted[::-1]) print(decoded)5.2 签名校验绕过
定位签名校验代码:
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES); Signature[] signatures = packageInfo.signatures;修改方案:
- 直接nop掉校验逻辑
- 修改smali返回值为true
5.3 Native层校验
处理JNI函数:
- 提取lib目录下的.so文件
- 使用IDA Pro分析native代码
- 关键函数通常命名为:
Java_包名_类名_方法名checkverify
6. 进阶技巧与工具推荐
动态分析工具:
- Frida:动态hook Java和Native代码
- Xposed:修改运行时行为
- IDA Pro:高级反汇编和调试
Frida脚本示例:
Java.perform(function() { var MainActivity = Java.use('com.example.MainActivity'); MainActivity.check.implementation = function() { return true; }; });实用命令备忘表:
| 操作 | 命令 |
|---|---|
| 查看APK信息 | aapt dump badging app.apk |
| 启动Activity | adb shell am start -n pkg/activity |
| 查看日志 | adb logcat | grep -i "keyword" |
编程学习
技术分享
实战经验