【安卓逆向】Apk反编译和Frida定位签名校验

发布时间:2026/7/7 10:03:56
【安卓逆向】Apk反编译和Frida定位签名校验 文章目录1. 简单签名校验2. 涉及的核心类3. 核心 API3.1. 参数说明4. 典型实现代码5. 签名校验调用时机6. 签名相关类关系图 ***7. 逆向分析方法8. 拓展阅读8.1. Context8.2. PackageManager8.3. Signature9. 重打包APK、签名9.1. 反编译工具Apktool9.2. 基本使用命令9.2.1. 反编译 APK9.2.2. 重打包成 APK9.3. 反编译后的文件结构9.4. 优缺点分析9.5. 常见错误及解决9.6. 常用进阶参数9.7. 典型工作流程9.8. 反编译图形化工具Batch apktool 3.8.09.9. 总结10. frida定位签名校验10.1. 列出所有运行中的应用10.2. hook脚本10.3. 修改apk方式绕过签名校验10.3.1. 修改smali代码重新打包10.3.2. 重新打包后的apk1. 简单签名校验签名校验通常在 APP启动阶段Application或SplashActivity的onCreate()中执行用于验证当前 APK 的签名是否与官方一致防止应用被二次打包或篡改。2. 涉及的核心类类作用Context保存应用环境信息提供系统服务访问接口PackageManager获取安卓系统信息和已安装 APP 的信息Signature表示应用签名信息用于签名验证3. 核心 APIcontext.getPackageManager().getPackageInfo(context.getPackageName(),64).signatures[0].hashCode()3.1. 参数说明参数说明context应用上下文提供环境信息getPackageManager()获取包管理器getPackageName()获取当前应用的包名64等于PackageManager.GET_SIGNATURES常量signatures[0]获取第一个签名通常只有一个hashCode()返回签名对象的哈希值用于快速比较4. 典型实现代码publicclassSignCheck{// 官方签名的 hashCode预存值privatestaticfinalintOFFICIAL_SIGN_HASH123456789;publicstaticbooleanisSignatureValid(Contextcontext){try{PackageManagerpmcontext.getPackageManager();PackageInfopackageInfopm.getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNATURES);Signature[]signaturespackageInfo.signatures;if(signatures!nullsignatures.length0){intcurrentSignHashsignatures[0].hashCode();returncurrentSignHashOFFICIAL_SIGN_HASH;}}catch(Exceptione){e.printStackTrace();}returnfalse;}}5. 签名校验调用时机APP 启动 │ ▼ Application.onCreate() │ ├── 执行签名校验 │ ├── 校验通过 → 继续启动 │ └── 校验失败 → 退出 APP │ ▼ SplashActivity.onCreate() │ ├── 执行签名校验二次校验 │ ▼ MainActivity.onCreate()6. 签名相关类关系图 ***┌─────────────────────────────────────────────────────┐ │ Context │ │ (应用环境信息) │ │ │ │ │ ▼ │ │ getPackageManager() │ │ │ │ │ ▼ │ │ PackageManager │ │ (包管理器) │ │ │ │ │ ▼ │ │ getPackageInfo() │ │ │ │ │ ▼ │ │ PackageInfo │ │ (包信息) │ │ │ │ │ ▼ │ │ signatures[] │ │ │ │ │ ▼ │ │ Signature │ │ (签名对象) │ │ │ │ │ ▼ │ │ hashCode() / toByteArray() │ └─────────────────────────────────────────────────────┘7. 逆向分析方法根据现象正向分析代码流程步骤操作说明1定位签名校验代码搜索signatures、hashCode、PackageManager.GET_SIGNATURES等关键字2分析校验逻辑找到签名的对比值硬编码或网络获取3分析校验失败后的行为是否有弹窗、退出、崩溃等4定位调用链从Application.onCreate()开始追踪8. 拓展阅读8.1. Context保存应用环境信息是 Android 四大组件和系统服务的桥梁https://www.jianshu.com/p/0599b060e074https://blog.csdn.net/bendan50/article/details/80142612https://developer.android.com/reference/kotlin/android/content/Context8.2. PackageManager包管理器获取安卓系统信息和 APP 的信息https://www.cnblogs.com/travellife/p/3932823.htmlhttps://developer.android.com/reference/kotlin/android/content/pm/PackageManager8.3. Signature签名信息类https://developer.android.com/reference/kotlin/android/content/pm/Signature9. 重打包APK、签名9.1. 反编译工具ApktoolApktool 是一款开源的 APK 反编译工具主要用于解包和重新打包APK 文件。项目说明官方地址https://ibotpeaches.github.io/Apktool/开发语言Java主要功能反编译 APK → smali 代码 资源文件并支持重新打包适用场景修改资源文件、Smali 代码注入、重打包签名9.2. 基本使用命令9.2.1. 反编译 APKapktool d test.apk参数说明ddecode反编译命令test.apk要反编译的 APK 文件路径执行后会生成一个test/目录包含反编译后的文件结构。9.2.2. 重打包成 APKapktool btest参数说明bbuild构建/重打包命令test刚才反编译生成的文件夹路径执行后会在test/dist/目录下生成重新打包的 APK 文件。9.3. 反编译后的文件结构test/ ├── AndroidManifest.xml # 清单文件可读 ├── apktool.yml # 元信息 ├── res/ # 资源文件可修改 ├── smali/ # smali 代码可修改 │ └── com/example/app/ ├── smali_classes2/ # 多 DEX 的 smali ├── lib/ # Native 库 ├── assets/ # 原始资源 └── unknown/ # 其他未知文件9.4. 优缺点分析优点 ✅缺点 ❌支持重打包 APK仅命令行操作无可视化界面可以修改 smali 代码和资源文件不方便分析 Java 代码逻辑开源免费对近一两年的新版 APK 反编译时容易报错支持 AndroidManifest.xml 还原难以理解复杂混淆逻辑跨平台Java 运行环境需要额外配合其他工具如 JADX分析代码9.5. 常见错误及解决错误信息原因解决方法Exception in thread main资源解析失败添加-r参数跳过资源Could not decode arsc file新版资源格式更新 Apktool 到最新版No resource foundFramework 缺失安装对应的 frameworkInvalid resource混淆资源尝试-r或-d参数9.6. 常用进阶参数# 反编译时跳过资源只提取 smali 代码apktool d test.apk-r# 反编译时强制覆盖已存在的目录apktool d test.apk-f# 反编译时保留原始 AndroidManifest.xmlapktool d test.apk-p# 安装 Framework解决系统框架依赖apktoolifframework-res.apk9.7. 典型工作流程原始 APK │ ▼ apktool d test.apk ──► 解包 │ ▼ 修改 smali / 资源文件 │ ▼ apktool b test ──► 重打包 │ ▼ 生成 new.apk │ ▼ 签名 Zipalign │ ▼ 安装测试9.8. 反编译图形化工具Batch apktool 3.8.0文章地址https://www.52pojie.cn/thread-2016201-1-1.html9.9. 总结Apktool 是 APK 重打包场景下的核心工具适合需要修改 smali 代码或资源的场景。但对于纯粹的代码分析建议配合 JADX 等其他可视化工具一起使用。10. frida定位签名校验10.1. 列出所有运行中的应用# 列出所有正在运行的应用frida-ps-Ua10.2. hook脚本Java.perform(function(){console.log(start hook...);varSignatureJava.use(android.content.pm.Signature);Signature.hashCode.implementationfunction(){// 此应用没有使用hashCode方法所以hook不到console.log([Hook] hashCode...);returnthis.hashCode();};Signature.toByteArray.implementationfunction(){// 使用此方法可hook到console.log([Hook] toByteArray...);// 通过堆栈获取调用方printStack();returnthis.toByteArray();};// 打印调用堆栈functionprintStack(){console.log(Java.use(android.util.Log).getStackTraceString(Java.use(java.lang.Exception).$new()))}// 通过hook方式将签名验证方法强制返回truevarAAJava.use(类的完整包名路径);AA.a.overload(android.content.Context).implementationfunction(){returntrue;};});10.3. 修改apk方式绕过签名校验10.3.1. 修改smali代码重新打包.method static a(Landroid/content/Context;)Z .locals 1 .prologue # 直接返回 true绕过签名校验 const/4 v0, 0x1 return v0 .end method10.3.2. 重新打包后的apk感谢关注【遇事不決洛必達】欢迎点赞收藏和交流指正我会持续分享我的学习经验和心得。