如何绕过Ijiami加壳APK的补丁防护以抓取网络交互数据?
加壳APK的防护机制与无DEX恢复抓包绕过方案
一、导致apk-mitm失效的防护机制原理
这类加壳工具(如爱加密)针对APK篡改的防护主要有三类:
- 签名校验:壳会预先存储原始APK的签名哈希值,启动时对比当前APK的签名,一旦发现被apk-mitm重签名,直接终止进程。
- 完整性校验:壳在加载阶段会计算DEX文件、lib目录下原生库的哈希值,和预先存储的校验值比对,apk-mitm插入的证书信任代码会破坏这种完整性,触发防护。
- 运行时反篡改检测:壳会检测进程是否存在异常注入代码、系统是否存在用户自定义证书、是否设置了代理,一旦检测到抓包相关的特征,就终止应用运行。
二、无需恢复DEX代码的绕过方案
1. 系统级证书信任(无需修改APK)
将mitmproxy的根证书安装到系统证书目录(需设备ROOT),让应用通过系统默认信任链认可抓包证书,无需篡改APK:
- 导出mitmproxy证书为PEM格式,转换为DER格式:
openssl x509 -in mitmproxy-ca.pem -outform DER -out mitmproxy-ca.der - 计算证书哈希值:
openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca.pem | head -1 - 重命名DER文件为
[哈希值].0,推送至设备的/system/etc/security/cacerts/目录 - 修改文件权限为
644,重启设备后即可正常抓包
2. Frida动态Hook绕过壳校验
直接Hook壳的校验逻辑,让验证步骤返回“通过”,无需修改APK文件:
- 编写Hook脚本(示例):
// 绕过签名校验 Java.perform(function() { var Signature = Java.use("java.security.Signature"); Signature.verify.overload("[B").implementation = function() { return true; }; // 绕过壳自定义的完整性校验方法(需根据实际壳的类名调整) var ShellChecker = Java.use("com.ijiami.ShellChecker"); ShellChecker.checkIntegrity.implementation = function() { return true; }; });
- 执行命令:
frida -U -f com.target.package -l bypass.js --no-pause
3. VPN式抓包工具绕过代理检测
部分壳会检测系统代理设置,改用基于VPN的抓包工具(如Packet Capture),这类工具通过VPN接管流量,无需设置系统代理,可绕过应用的代理检测。若设备未ROOT,可配合Shizuku模块实现无ROOT使用。
4. Hook网络检测API
拦截应用检测代理的逻辑,让应用认为无代理存在,同时配合系统证书信任抓包:
Java.perform(function() { // 拦截代理获取API var Proxy = Java.use("java.net.Proxy"); Proxy.getDefault.implementation = function() { return Proxy.NO_PROXY; }; // 拦截系统属性读取 var System = Java.use("java.lang.System"); System.getProperty.overload("java.lang.String").implementation = function(key) { if (key.indexOf("proxy") !== -1) { return null; } return this.getProperty(key); }; });
内容的提问来源于stack exchange,提问作者Max Dmitrichenko
相关产品推荐
相关产品推荐

