BugkuCTF 安卓逆向:APK反编译与JEB/JD-GUI 3.5.0实战,3步定位关键校验逻辑

📅 2026/7/8 20:19:11 👁️ 阅读次数 📝 编程学习
BugkuCTF 安卓逆向:APK反编译与JEB/JD-GUI 3.5.0实战,3步定位关键校验逻辑

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/*.sh

2. 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.dex

2.3 使用JD-GUI分析Java代码

java -jar jd-gui.jar classes-dex2jar.jar

3. 快速定位关键校验逻辑

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中搜索以下关键词:

  • check
  • verify
  • validate
  • sign
  • auth

3.3 动态调试技巧

使用Android Studio附加进程调试:

  1. AndroidManifest.xml中添加android:debuggable="true"
  2. 重新打包并签名APK
  3. 使用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.dex

4.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.apk

4.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 myalias

5. 常见校验逻辑破解技巧

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函数:

  1. 提取lib目录下的.so文件
  2. 使用IDA Pro分析native代码
  3. 关键函数通常命名为:
    • Java_包名_类名_方法名
    • check
    • verify

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
启动Activityadb shell am start -n pkg/activity
查看日志adb logcat | grep -i "keyword"