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/*.sh2. APK反编译三步法2.1 使用apktool解包APKapktool 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:nameandroid.intent.action.MAIN/ category android:nameandroid.intent.category.LAUNCHER/ /intent-filter /activity3.2 搜索关键字符串在JD-GUI中搜索以下关键词checkverifyvalidatesignauth3.3 动态调试技巧使用Android Studio附加进程调试在AndroidManifest.xml中添加android:debuggabletrue重新打包并签名APK使用adb连接设备adb connect 设备IP adb shell am start -D -n 包名/主Activity4. Timer题目实战分析以BugkuCTF中的Timer题目为例演示完整逆向流程4.1 反编译APKapktool 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 签名APKkeytool -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对称加密解密示例Pythonimport 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返回值为true5.3 Native层校验处理JNI函数提取lib目录下的.so文件使用IDA Pro分析native代码关键函数通常命名为Java_包名_类名_方法名checkverify6. 进阶技巧与工具推荐动态分析工具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