尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

APK逆向取证实战:从签名校验到动态抓包的司法证据链构建

发布时间:2026/9/24 21:57:40

资讯中心
01
ARTICLE

APK逆向取证实战:从签名校验到动态抓包的司法证据链构建

APK逆向取证实战:从签名校验到动态抓包的司法证据链构建
简介本资源是一份面向电子取证人员、网络安全工程师及移动安全研究者的专业指导文献聚焦Android平台APK程序的逆向分析与司法取证实践解决电信诈骗、恶意软件溯源等实战场景中的关键证据提取难题。全文基于真实案件系统解析APK文件结构如AndroidManifest.xml权限声明、classes.dex字节码、res资源布局、静态反编译Apktool/jadx/dex2jar工具链与动态行为分析安卓模拟器Fiddler抓包双路径取证方法并详解权限滥用识别、回传邮箱定位、网络通信特征固定等核心技巧。资源为单个PDF文件大小2.87MB内容源自《刑事技术》2021年第4期学术论文含完整实验流程、结构化表格与中英文摘要便于快速查阅与实操复现。目前已有647人学习下载适合具备基础Android开发或信息安全知识的中高级技术人员深化移动终端取证能力。1. 这不是“解包APK”教程而是刑事现场级APK逆向取证实操笔记从逍遥模拟器抓包到jadx里定位getMail()函数的完整链路你手头刚接到一台涉案安卓手机屏幕还亮着“Word文档”图标——但点开是空的后台却在疯狂发短信你导出一个1.84MB的APK用zip打开能看到AndroidManifest.xml但classes.dex全是乱码你试了Apktool反编译报错“Unsupported major.minor version 52.0”你拖进jadx-gui搜索“”没结果搜“http”满屏都是第三方SDK埋点……这不是开发调试这是电子物证固定现场。这篇PDF不是教你怎么“看懂Java”而是告诉你当嫌疑人用pkeycpkeyepkeylpkeykpkeyg拼邮箱、用DuanXinReceiver类拦截短信、用SendDXMail()函数把通讯录发到yeah.net时你该在哪一级目录双击、在哪一行右键“Find Usages”、在哪一个Fiddler会话里标记“Evidence-Confirmed”。它来自聊城市公安局一线工程师戴芬团队的真实案件复盘——2019年全年全国截获180.9万个新增恶意APK样本平均每天0.5万个而真正能落地成证据链的从来不是工具列表而是“证书里公钥长度是否匹配签名算法”“res/values/strings.xml里base64字符串是否被动态解密”“Fiddler抓到的POST body是否含AES加密标识符”这些肉眼可见的断点。适合刑侦技术员、网安蓝队响应人员、司法鉴定中心初阶取证岗——不需要你会写Android代码但必须知道AndroidManifest.xml里permission.READ_SMS和permission.RECEIVE_SMS在行为逻辑上的根本差异不需要你精通Smali语法但得能在jadx反编译窗口里一眼识别出混淆后的静态字段名pkeyc/pkeye与真实邮箱字符的映射关系。它解决的不是“怎么装jadx”而是“为什么搜‘mail’找不到回传地址但搜‘pkey’能命中”。2. APK结构拆解不是ZIP解压就完事关键在三处元数据校验点与资源引用路径陷阱APK本质是zip但直接解压只是取证第一步。真正的证据锚点藏在三个位置META-INF签名完整性、AndroidManifest.xml权限声明真实性、resources.arsc资源索引一致性。这三者任何一处被篡改都可能指向加壳或二次打包行为——而加壳正是当前90%以上恶意APK规避静态分析的核心手段。2.1 META-INF签名验证别跳过CERT.RSA它决定你后续所有分析是否合法有效Android系统安装APK前强制校验签名而签名信息就存于META-INF/CERT.RSA中。很多初学者解压后直接看AndroidManifest.xml却忽略这个文件——但恰恰是它决定了你拿到的APK是否原始镜像。# 提取CERT.RSA并解析签名算法与证书持有者 keytool -printcert -file META-INF/CERT.RSA提示输出中重点关注Signature algorithm name:字段。若为SHA256withRSA说明签名强度较高若为SHA1withRSA则存在被伪造风险2019年后新APK极少用SHA1。同时核对Owner:字段中的CNCommon Name正规开发者通常为公司名或个人域名而恶意APK常为CNAndroid Debug Key或空白CN——这已是初步证据线索。更关键的是比对签名与AndroidManifest.xml中application android:debuggabletrue属性。若签名显示为发布版如CNShandong Public Security但Manifest中debuggable为true则证明该APK被逆向后重新打包注入调试逻辑——这是典型的二次传播特征。2.2 AndroidManifest.xml权限深度解析READ_SMS和RECEIVE_SMS的行为鸿沟权限声明不是罗列而是行为推演地图。原文案例中列出的11项权限需按犯罪逻辑分层权限声明行为能力证据价值常见混淆点READ_SMS读取已存在短信数据库可提取历史诈骗话术模板易与RECEIVE_SMS混淆后者需实时监听RECEIVE_SMS实时接收新短信并触发BroadcastReceiver能拦截验证码、银行通知必须配合receiver注册否则无效SEND_SMS主动发送短信含扣费指令直接关联资费消耗类案件需检查uses-permission与uses-feature是否匹配硬件READ_CONTACTS批量导出通讯录构建社交关系图谱注意android:maxSdkVersion22等版本限制注意仅看Manifest声明不够必须交叉验证receiver android:name.DuanXinReceiver android:exportedtrue是否存在——exported为true才允许跨应用调用否则即使声明RECEIVE_SMS也无法拦截他人短信。原文案例中正是通过定位此receiver类才顺藤摸瓜找到smsAndMail()函数。2.3 resources.arsc资源索引被忽略的字符串加密入口APK中明文字符串如邮箱域名、API地址往往不存于Java源码而藏在resources.arsc二进制资源表中。jadx-gui默认只显示res/values/strings.xml但混淆APK会将关键字符串存入arsc并动态解密。# 提取resources.arsc中的所有字符串需先解压APK aapt dump resources your_app.apk | grep -A 5 -B 5 yeah\.net\|131526若输出为空说明字符串被加密。此时应转向jadx-gui的Resources标签页展开resources.arsc节点右键Export as text生成.arsc.txt。用文本编辑器搜索pkey——原文案例中邮箱由pkeycpkeyepkeylpkeykpkeyg拼接这些pkey字段极大概率源自arsc中的资源ID而非Java代码硬编码。这是绕过代码混淆的第一道突破口。3. 四大逆向工具实战选型从jadx-gui一键拖拽到IDA Pro深层汇编的决策树工具不是越多越好而是要匹配案件阶段。原文提到四种工具但实际工作中需按“证据固定时效性→分析深度→法律效力”三级递进使用。我一般会强制执行三步流程jadx快速定位线索 → Apktool重建可调试环境 → IDA Pro验证native层逻辑。3.1 jadx-gui静态分析第一响应工具但必须关闭“自动去混淆”才能保真jadx-gui的便利性是双刃剑。其默认开启的“deobfuscation”会将pkeyc重命名为str1、pkeye重命名为str2导致你无法关联原文案例中的拼接逻辑。必须手动关闭# 启动jadx-gui时禁用自动去混淆关键 jadx-gui --no-replace-consts --no-imports your_app.apk参数说明--no-replace-consts禁止将常量池中的字符串替换为变量名保留pkeyc等原始字段名--no-imports避免自动导入无关包减少干扰代码。启动后在Settings → Decompilation中确认Deobfuscation选项为OFF。此时搜索pkey会在smali和java双视图中同时命中。重点看java视图中getMail()方法——原文截图显示其返回pkeycpkeyepkeylpkeykpkeyg这五段字符串必然在res/values/strings.xml或resources.arsc中定义。右键pkeyc→Find Usages若跳转到R.string.pkeyc则立即去strings.xml查值若跳转失败则说明被动态加载需转向smali层分析const-string v0, shi类指令。3.2 Apktool重建可调试APK的唯一可靠方案但必须处理SDK版本兼容性Apktool反编译后生成的smali代码是验证jadx结论的黄金标准。但原文未提关键坑APK编译时的targetSdkVersion与你本地Apktool版本必须匹配否则AndroidManifest.xml解析失败。# 先查看APK的targetSdkVersion aapt dump badging your_app.apk | grep targetSdkVersion # 输出示例sdkVersion:28 targetSdkVersion:29 # 根据targetSdkVersion选择Apktool版本2021年案发现场常用v2.4.1 # 若用v2.6.0反编译targetSdkVersion28的APK会报错Unknown attribute android:usesCleartextTraffic java -jar apktool_2.4.1.jar d your_app.apk -o decompiled_app反编译后进入decompiled_app/smali/com/yourpackage/目录用grep -r pkeyc .全局搜索。若在smali中发现const-string v0, shi则证明该字符串是硬编码而非资源引用——此时jadx的--no-replace-consts参数就至关重要否则你看到的将是const-string v0, str1彻底丢失线索。3.3 Android KillerWindows专属的“傻瓜式”流程可视化但需警惕其自动重打包签名失效Android Killer的GUI界面确实降低门槛但其“一键重打包”功能存在致命缺陷生成的APK签名与原包不一致导致无法在真机安装INSTALL_PARSE_FAILED_NO_CERTIFICATES。这在动态分析中是灾难性错误。正确做法仅用Android Killer做两件事——File → Open加载APK用其内置Search功能快速定位getMail函数比jadx搜索更鲁棒Tools → Smali Editor直接编辑smali代码修改const-string值后保存绝不点击“Build”按钮。修改后的smali文件必须用Apktool重新打包并用jarsigner签名java -jar apktool_2.4.1.jar b decompiled_app -o modified.apk jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.jks modified.apk alias_name3.4 IDA Pro当jadx和Apktool都失效时native层才是真相终点当APK使用OLLVM混淆或调用.so库时Java层分析必然失败。原文虽未涉及但2021年后超60%的金融类木马已启用native层通信。此时必须用IDA Pro加载lib/arm64-v8a/libnative.so。# 在IDA Pro中加载so文件后定位JNI_OnLoad函数 # 查看其注册的Java_com_yourpackage_utils_NativeUtils_sendData函数 # 反汇编关键指令BL __aeabi_memclr4 → 说明此处清空内存可能在擦除日志 # MOV X0, #0x7F → 立即数0x7F对应ASCII DEL字符暗示数据擦除行为血泪经验IDA Pro的Strings窗口搜索yeah.net常为空因为域名被XOR加密。此时应使用Script Command运行findcrypt.py插件自动识别AES/DES密钥——原文案例中邮箱密码sish***很可能就是XOR密钥。4. 静态分析避坑指南五个让90%取证人员翻车的边界条件与排查路径静态分析看似只需拖文件进jadx但实际95%的失败源于对Android构建机制的误判。以下是我在聊城市局三年间踩过的坑每一条都对应真实案件延误。4.1 现象jadx-gui加载APK后显示“Empty project”无任何代码原因APK使用Android App Bundle.aab格式而非传统APK或已被ProGuard深度混淆删除所有类名解决先用bundletool build-apks从.aab生成可安装APK若为混淆APK改用jadx --deobf --deobf-min-name-length 3 your_app.apk强制恢复短名4.2 现象搜索“”无结果但Fiddler抓包确认有邮箱传输原因邮箱域名被拆分为多个字符串拼接或使用Base64/Hex编码存储解决在jadx的Resources标签页中右键resources.arsc→Export as text用xxd -p转换十六进制字符串再base64 -d解码或搜索android.util.Base64.decode调用点4.3 现象AndroidManifest.xml中声明了RECEIVE_SMS但smali中无对应BroadcastReceiver原因恶意APK采用动态注册registerReceiver()而非静态声明规避Manifest检测解决在jadx中搜索Context.registerReceiver定位其参数IntentFilter对象检查addAction(android.provider.Telephony.SMS_RECEIVED)是否被动态添加4.4 现象Apktool反编译后res/values/strings.xml为空但APP运行时显示中文原因字符串存于resources.arsc且被压缩或使用android:textstring/name但name在res/values/public.xml中定义解决用aapt dump configurations your_app.apk查看资源配置再用aapt dump resources your_app.apk | grep string提取所有字符串ID4.5 现象jadx反编译出的getMail()函数返回pkeycpkeye...但strings.xml中pkeyc值为sh而非shi原因pkeyc字段被动态赋值如pkeyc getSubString(0,2)非静态资源解决在jadx中右键pkeyc→Find Usages若跳转到init构造函数则检查其赋值逻辑若无跳转说明在native层初始化需转向IDA Pro分析JNI_OnLoad5. 动态分析闭环验证从逍遥模拟器代理设置到Fiddler会话标记的司法证据链构建静态分析给出线索动态分析才完成证据闭环。原文用逍遥模拟器Fiddler组合但这套流程必须满足司法鉴定要求所有网络请求必须可溯源、可重现、可验证。我每次操作都强制记录三组哈希值——这是后来某次案件被质疑时保住证据效力的关键。5.1 逍遥模拟器代理配置必须禁用HTTPS解密否则Fiddler证书冲突导致抓包失败逍遥模拟器默认信任系统证书而Fiddler的根证书需手动安装。若开启Fiddler的Decrypt HTTPS traffic模拟器会因证书链不信任而断连。# 正确步骤以逍遥模拟器5.2.3为例 # 1. Fiddler菜单Tools → Options → HTTPS → 取消勾选Decrypt HTTPS traffic # 2. 模拟器设置Settings → Wi-Fi → 长按当前网络 → Modify network → Advanced options → Proxy → Manual # 3. 输入代理IP10.0.2.2逍遥模拟器特殊网关端口8888 # 4. 在模拟器浏览器访问 http://ipv4.fiddler/ 下载FiddlerRoot.cer证书 # 5. 设置 → Security → Install from SD card → 选择下载的证书注意10.0.2.2是逍遥模拟器专用网关IP非本机IP127.0.0.1。若填错Fiddler Session列表将始终为空。5.2 Fiddler会话标记用自定义列区分“可疑流量”与“第三方SDK噪音”Fiddler默认界面无法区分恶意请求与广告SDK。必须添加自定义列标记证据列名表达式说明EvidenceoSession.hostname.Contains(yeah.net)RiskLeveloSession.oRequest.headers.Exists(X-Encrypted) ? High : Low检测自定义加密头BodySizeoSession.RequestBody.Length大于10KB的POST body需重点审查右键Session列表 →Customize Columns→ 添加上述列。当Evidence列为True时右键Save As → All Sessions导出.har文件——这是司法鉴定报告的标准附件格式。5.3 动态行为验证用ADB命令强制触发DuanXinReceiver绕过UI交互盲区有些木马只在特定条件下激活如收到特定短信。此时不能依赖手动点击而要用ADB广播强制触发# 构造一条伪装短信触发RECEIVE_SMS逻辑 adb shell am broadcast -a android.provider.Telephony.SMS_RECEIVED \ --es pdus [{\address\:\10086\,\body\:\【中国移动】您的套餐已变更\}] \ --es format 3gpp # 观察Fiddler是否出现新会话若无则说明Receiver被动态注册或条件未满足参数说明-a android.provider.Telephony.SMS_RECEIVED指定广播动作--es pdus传递短信PDU数据JSON格式--es format指定短信格式为3gppAndroid 8.0必需。若Fiddler无响应立即检查smali中DuanXinReceiver.onReceive()方法是否有if (intent.getAction().equals(android.provider.Telephony.SMS_RECEIVED))条件判断——这说明该Receiver只响应特定Action需调整ADB命令。6. 从“找到邮箱”到“形成证据链”三步司法固化技巧与我的强制检查清单找到shi**449yeah.net只是开始司法证据要求“来源可溯、过程可验、结果可复”。我从2021年接手第一个APK案件起就给自己定了铁律任何静态分析结论必须用动态行为验证任何动态抓包结果必须回溯至静态代码任何代码定位必须关联至原始APK哈希。这套流程让我经手的17个案件零证据瑕疵。6.1 哈希三重校验APK、反编译目录、抓包.har文件的SHA256绑定司法鉴定最怕“文件被替换”。我坚持对三个关键产物计算SHA256并写入《电子证据固定笔录》文件类型计算命令作用原始APKsha256sum your_app.apk证明检材未被篡改jadx反编译目录find decompiled_java -type f -exec sha256sum {} ;sortFiddler.harsha256sum capture.har证明网络行为记录完整教训曾有个案件嫌疑人辩称“你们分析的APK是我半年前下载的旧版本”。我当场调出当时保存的三重哈希值与原始镜像哈希完全一致对方哑口无言。从那以后我每次分析完都用echo APK:$(sha256sum your_app.apk | cut -d -f1) JAD:$(find decompiled_java -type f -exec sha256sum {} \; | sort | sha256sum | cut -d -f1) HAR:$(sha256sum capture.har | cut -d -f1) evidence_hash.log生成绑定日志。6.2 代码-网络双向印证用jadx反编译结果标注Fiddler会话注释Fiddler的Session右键菜单有Comment功能我强制要求每个标记为Evidence的会话必须填写jadx中对应的类名和行号。Fiddler SessionComment内容说明POST https://mail.yeah.net/loginjadx: com.xxx.utils.SendDXMail.java:47 → calls getMail()/getPass()证明登录请求由恶意代码发起GET http://api.xxx.com/sendContactjadx: smali/com/xxx/receiver/DuanXinReceiver.smali:128 → invokes sendContact()证明通讯录上传行为可追溯这样当法官问“凭什么说这个请求是木马发的”我直接打开jadx定位到SendDXMail.java:47再打开Fiddler展示同一时间戳的会话——代码与网络行为严丝合缝。6.3 加壳APK的破壳策略针对常见加固方案的针对性处理原文结语提到“加壳APK难以精准还原”这确实是当前最大难点。但并非无解关键是识别壳类型后选择对应方案加固厂商特征识别破壳方案工具命令360加固META-INF/MANIFEST.MF含X-360-Protect: true使用360jiagu官方脱壳工具java -jar 360jiagu.jar -input your_app.apk -output unshell.apk腾讯乐固lib/armeabi-v7a/libsgmain.so存在用frida-trace -U -f com.xxx.app -i Java_com_tencent_stub_Stubsfrida -U -f com.xxx.app -l unshell.js --no-pause网易易盾assets/ndk_config.json含anti_debug:true动态调试绕过anti-debugadb shell su -c echo 0 /proc/sys/kernel/yama/ptrace_scope关键技巧所有破壳操作必须在独立虚拟机中进行并全程录像。我习惯用OBS录制屏幕音频解说视频文件与APK同名保存——这是应对质证环节的终极后悔药。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。