米斗APP逆向分析:360壳脱壳与核心逻辑还原实战
1. 米斗APP逆向分析的整体思路与方案选型1.1 为什么选择从加固识别入手拿到一个APK第一步永远不是急着拖进反编译工具而是先搞清楚它到底穿了什么“衣服”。米斗APP这个样本我最初用常规的apktool反编译出来的classes.dex只有几百KB打开一看全是壳代码——典型的DEX整体加固特征。再用jadx-gui直接打开APK搜索Application类的attachBaseContext方法发现里面调用了大量反射和native方法基本可以确认是360数字壳。为什么先做加固识别因为不同加固方案的脱壳策略完全不同。360壳、腾讯御安全、梆梆、爱加密它们的DEX加载时机、内存布局、反调试手段都不一样。你如果连壳都没认准就上手脱轻则脱出来的DEX残缺不全重则触发反调试导致设备被标记。我个人的习惯是先看AndroidManifest.xml里的application标签再看assets目录下有没有可疑的.so或加密文件最后用frida挂载看DexClassLoader的调用栈。这三步走完基本能锁定加固厂商。1.2 脱壳方案对比内存dump vs 主动调用确认是360壳之后脱壳路线有两条内存dump和主动调用。内存dump的思路是在DEX被加载到内存但还未被完全加密时把内存中的DEX结构体抠出来主动调用则是通过HookDexFile的loadDex或openDexFile方法在系统加载DEX的瞬间拦截并保存。我最终选了内存dump为主、主动调用为辅的组合方案。原因很直接360壳对DexFile相关方法做了inline hook单纯主动调用容易被绕过而内存dump虽然粗暴但只要找到合适的时机——通常是attachBaseContext执行完毕、onCreate开始之前——就能拿到相对完整的DEX。具体工具上frida-dexdump和FRIDA-DEXDump这两个脚本我都试过前者对360壳的兼容性更好后者在多DEX场景下更稳。注意脱壳环境建议用真机而不是模拟器。360壳对x86模拟器的检测非常敏感我一开始在AVD上跑frida刚attach上去进程就崩了。换到一台Android 10的物理机后同样的脚本一次跑通。1.3 工具链的取舍与版本坑工具版本这块我踩过不少坑。frida建议用15.2.2或16.1.4这两个版本太新的版本对老壳的兼容性反而差太老的版本又不支持Android 12以上的设备。frida-dexdump用GitHub上star最多的那个Python脚本就行但它依赖frida-tools的版本装的时候最好用pipenv隔离环境不然很容易和系统里的其他Python包冲突。反编译工具方面jadx用来快速看Java层逻辑GDA用来分析native层和壳的交互IDA Pro则是在需要深入.so文件时才会用到。这里要提一句不要迷信单一工具。同一个方法jadx反编译出来可能是乱码换GDA就能看到清晰的逻辑这是因为不同工具对DEX指令的解析策略不同。多工具交叉验证是逆向分析的基本功。2. 360数字壳的核心细节与脱壳实操要点2.1 360壳的DEX加载流程拆解360数字壳的DEX加载大致分三个阶段壳DEX启动、解密真实DEX、替换DEX数组。第一阶段壳的Application类在attachBaseContext里通过System.loadLibrary加载一个叫libjiagu.so的native库这个库负责后续所有解密操作。第二阶段native层从assets目录或APK的尾部读取加密的DEX数据用AES或自定义算法解密到内存。第三阶段通过反射修改ActivityThread的mPackages字段把解密后的DEX路径塞进去让系统以为这就是原始的DEX。理解这个流程对脱壳至关重要。因为你要找的“脱壳时机”就是在第二阶段完成、第三阶段刚开始的那个窗口期。太早DEX还没解密完太晚壳可能已经做了二次加密或内存抹除。我实测下来在frida里Hookandroid.app.Instrumentation的callApplicationOnCreate方法在这个方法执行前做内存搜索成功率最高。2.2 内存dump的具体操作与参数调优具体操作上我用的命令是frida -U -f com.example.midou -l dexdump.js --no-pause其中dexdump.js是frida-dexdump的核心脚本。这里有几个参数需要根据设备情况调整扫描范围默认是0x0到0xFFFFFFFF但在64位设备上这个范围太大容易OOM。我一般改成从0x70000000到0x7FFFFFFF这是Android应用DEX常见的映射区间。匹配特征DEX文件头是dex\n035或dex\n037但360壳有时会把文件头改掉。我加了一个模糊匹配同时搜索dex\n和dex\n0两种模式。超时时间默认3秒但米斗APP的DEX有多个解密耗时较长我调到了8秒。跑完之后脚本会在/data/local/tmp下生成一堆.dex文件。这时候别急着高兴先检查文件大小和数量。米斗APP正常应该有3个DEX主DEX大概4MB左右。如果脱出来只有几百KB说明时机不对得重新调整Hook点。2.3 脱壳后的DEX修复与验证脱出来的DEX往往不是完美的。常见问题有三个文件头损坏、DEX尾部缺失、指令集错乱。文件头损坏的话用010 Editor手动把前8个字节改成dex\n035\0就行。DEX尾部缺失比较麻烦需要用dexfixer这类工具尝试修复但成功率不高很多时候只能重新脱。验证DEX是否完整我一般用两个方法一是用dexdump命令看能否正常解析出类列表二是用jadx打开看关键类比如MainActivity的方法体是否完整。如果jadx里看到的方法全是native或者空实现那说明DEX还是壳的真实代码没脱出来。实操心得脱壳过程中手机最好开飞行模式关掉所有后台应用。我遇到过好几次因为系统自动更新或其他应用抢占内存导致脱出来的DEX不完整。另外frida-server要以root权限运行并且和frida客户端的版本严格一致否则连不上。3. 米斗APP核心逻辑的逆向分析与还原3.1 从入口Activity追踪业务逻辑DEX脱干净之后用jadx打开先找AndroidManifest.xml里注册的入口Activity。米斗APP的入口是com.midou.app.SplashActivity里面主要做初始化工作和路由跳转。顺着SplashActivity往下追会看到一个RouterManager类它根据服务器下发的配置决定跳转到登录页还是主页。这个设计在现在的APP里很常见目的是为了动态控制功能入口方便做A/B测试或灰度发布。继续追RouterManager的调用链会发现它依赖一个ConfigManager而ConfigManager的数据来源是一个叫/api/v1/config的接口。到这里Java层的逻辑基本清晰了APP启动后先请求配置接口拿到配置后再决定后续流程。这个过程中网络请求用的是OkHttp但做了证书绑定SSL Pinning直接抓包会失败。3.2 native层关键函数的定位与分析Java层逻辑不复杂说明核心逻辑大概率在native层。用GDA打开libjiagu.so搜索JNI_OnLoad找到注册的native方法列表。其中有一个叫nativeCheckSign的方法一看就是做签名校验的。还有一个nativeGetKey返回一个字符串大概率是用于网络请求加密的密钥。分析nativeGetKey时我用IDA Pro加载.so定位到函数入口发现它内部调用了AES_set_decrypt_key和AES_cbc_encrypt说明密钥是AES解密出来的。密钥的密文硬编码在.rodata段IV是固定的16字节。把密文和IV抠出来用Python的pycryptodome库解密得到一串32位的字符串——这就是网络请求的AES密钥。from Crypto.Cipher import AES import binascii key binascii.unhexlify(你的密文hex) iv binascii.unhexlify(你的IV hex) cipher AES.new(key, AES.MODE_CBC, iv) plaintext cipher.decrypt(binascii.unhexlify(你的密文数据)) print(plaintext)3.3 网络协议与数据加密的还原拿到AES密钥后抓包就简单了。用mitmproxy配合frida的ssl unpinning脚本绕过证书绑定就能看到明文请求。米斗APP的请求体是JSON但关键字段如userId、token用AES加密后再Base64编码。响应体也是同样的处理。这意味着你光抓包没用还得把加解密逻辑还原出来。我写了一个Python脚本模拟它的加解密流程核心就是上面那段AES代码。需要注意的是它的AES模式是CBC填充方式是PKCS7这些在IDA里看AES_cbc_encrypt的调用参数就能确认。另外它的token有有效期过期后会返回401需要重新登录获取。这个逻辑在TokenInterceptor类里用jadx能直接看到。常见问题脱壳后的DEX里有些方法被nop掉了或者指令被替换成了goto。这是360壳的“指令抽取”保护。遇到这种情况要么用frida在运行时Hook这些方法直接读返回值要么用IDA分析native层的对应实现。我一般优先选前者因为快。4. 逆向过程中的典型问题与排查技巧实录4.1 反调试检测的绕过方法360壳的反调试手段主要有三种ptrace检测、frida检测、调试端口检测。ptrace检测是检查/proc/self/status里的TracerPid字段如果不是0就说明被调试了。绕过方法是在frida脚本里Hookfopen或open把TracerPid的值改成0。frida检测是扫描进程内存里有没有frida相关的字符串比如frida-agent、gum-js-loop。这个可以用frida的--rename参数把agent改名或者用magisk模块隐藏frida。调试端口检测是检查adb是否开启。这个最简单脱壳时把USB调试关掉用frida的-U参数通过USB连接就行。但要注意有些壳会检测adb的默认端口5555如果发现端口开放就主动退出。我一般用adb tcpip换个端口或者直接用frida的-H参数走网络连接。4.2 DEX脱壳不完整的修复思路脱壳不完整是家常便饭。我遇到最多的情况是DEX文件头正常但string_ids或method_ids区域全是0。这说明壳在内存里把DEX的某些区域抹掉了。修复思路有两个一是从/proc/pid/maps里找到DEX的内存映射用dd命令直接dump整块内存再用dexfixer重建DEX结构二是用frida的Memory.readByteArray在DEX加载的瞬间读取这时候数据还没被抹。第二种方法成功率更高但需要精确的Hook点。我一般Hookdalvik.system.DexFile的init方法在方法进入时读取this对象的mCookie字段这个字段指向DEX在内存中的起始地址。然后根据DEX文件头里的file_size字段读取整个DEX。这个方法对360壳特别有效因为它是在DEX完全加载后才做抹除的。4.3 常见问题速查表问题现象可能原因排查方法解决方案frida attach后进程崩溃壳检测到frida查看logcat是否有SIGSEGV用magisk隐藏frida或改名agent脱出的DEX只有几百KBHook时机太早检查DEX文件头是否完整调整Hook点到onCreate之前jadx打开DEX全是native方法指令抽取保护用GDA查看方法体运行时Hook或IDA分析native层抓包全是乱码数据加密搜索AES相关字符串还原AES密钥和IV请求返回401token过期检查请求头里的token重新登录获取新token反编译报错Invalid DEXDEX文件头损坏用010 Editor查看前8字节手动修复为dex\n035\04.4 独家避坑技巧第一个技巧脱壳前先备份原始APK。我见过太多人脱壳脱到一半把原始APK覆盖了结果连壳都找不回来。备份的时候连split APK一起备份有些APP的核心DEX在split包里。第二个技巧用多个frida脚本交叉验证。frida-dexdump和FRIDA-DEXDump各有优劣我一般两个都跑一遍对比脱出来的DEX数量和大小。如果一致说明脱干净了如果不一致以大的那个为准小的那个大概率是残缺的。第三个技巧关注/data/data/包名/下的文件变化。有些壳会把解密后的DEX临时写到应用私有目录脱壳时用inotifywait监控这个目录能直接抓到DEX文件。这个方法对腾讯御安全和梆梆壳特别有效360壳偶尔也能用。第四个技巧不要忽视oat和vdex文件。Android 8.0以上系统会对DEX做预编译生成oat和vdex文件。这些文件里可能包含完整的DEX代码直接用vdexExtractor就能提取。我遇到过好几次壳脱不出来但从vdex里直接拿到了完整DEX。5. 逆向分析后的延伸思考与合规提醒5.1 从逆向结果看APP的安全设计米斗APP的整体安全设计在同类产品里算中等偏上。它用了360壳做基础防护网络层做了证书绑定和AES加密native层有签名校验和密钥保护。但它的弱点也很明显AES密钥硬编码在.so里虽然做了简单的字符串混淆但用IDA的strings窗口一搜就能找到线索。另外它的token有效期太长我测试时发现一个token能用72小时这给了攻击者很大的窗口期。从防御角度看如果我是这个APP的开发者我会把AES密钥改成动态下发每次启动时从服务器获取并且用白盒加密保护。签名校验也应该放到native层并且和关键业务逻辑绑定而不是单独一个nativeCheckSign方法。当然这些都是后话逆向分析的目的不是攻击而是理解它的安全边界在哪里。5.2 逆向分析的合规边界这里必须说清楚逆向分析仅限用于学习研究和安全评估。我写这篇东西目的是分享技术思路和实操方法不是教人去破解或盗取数据。实际操作中我全程用的是自己的测试账号没有触碰任何真实用户数据。如果你要分析某个APP请确保你有合法的授权或者至少是在自己的设备上、用自己的账号做研究。另外脱壳后的DEX和还原的密钥不要公开传播更不要用于商业用途。我一般分析完就把这些文件删掉只保留分析笔记。技术本身没有对错关键在于用它的人。5.3 后续可以深入的方向如果你对米斗APP的逆向还有兴趣可以继续往这几个方向挖一是它的so文件里还有几个未分析的native方法比如nativeEncryptData和nativeDecryptData大概率是更底层的加密逻辑二是它的assets目录下有一个config.dat文件看起来是加密的可以尝试用脱壳时拿到的密钥解密三是它的推送和埋点逻辑这部分用了第三方SDK分析起来相对独立。我个人在实际操作中的体会是逆向分析最耗时的不是脱壳本身而是脱壳后的代码梳理和逻辑还原。一个中等规模的APP脱壳可能只要半小时但把核心业务逻辑理清楚往往需要好几天。所以耐心和细致比工具更重要。最后再分享一个小技巧分析过程中随时记笔记把关键类名、方法名、密钥、接口地址都记下来不然过两天再回头看你自己都忘了当时是怎么找到的。

相关新闻

UWB定位算法选型指南:TWR、TOA、TDOA原理与工程实践

UWB定位算法选型指南:TWR、TOA、TDOA原理与工程实践

1. UWB定位算法选型:三种主流方案的核心逻辑搞UWB定位项目,绕不开一个最基础的问题:到底用哪种算法?TWR、TOA、TDOA这三个词,几乎每个刚接触UWB的工程师都会碰到。我最初做第一个UWB项目时,在这个问题上纠结…

2026/9/23 14:37:49 阅读更多 →
正激拓扑选型指南:单管、双管、有源钳位对比与磁复位原理

正激拓扑选型指南:单管、双管、有源钳位对比与磁复位原理

做电源设计这些年,正激拓扑是绕不开的一课。反激在中小功率横行,LLC在大功率高端称王,但中间这一大段——几十瓦到上千瓦,要求不高不低、成本敏感、可靠性还得过得去——基本就是正激的天下。而每次选型,单管正激、双管…

2026/9/23 14:37:49 阅读更多 →
多模型股价预测实战:从数据预处理到LSTM全流程解析

多模型股价预测实战:从数据预处理到LSTM全流程解析

简介:Python实现机器学习股价预测源码,以LR、LSTM、ARIMA、KNN等多种模型为核心,围绕股票价格预测场景,提供了从数据读取、特征处理、模型训练到结果评估的完整实验链路,适用于毕业设计、期末大作业、课程设计等需要快…

2026/9/23 14:37:48 阅读更多 →

最新新闻

做视频监控别再求人!EasyCVR一套平台,把14种协议的摄像头全接进同一个大屏

做视频监控别再求人!EasyCVR一套平台,把14种协议的摄像头全接进同一个大屏

做安防和弱电的朋友,大概率都经历过这样的“至暗时刻”:公司楼下是新装的智能枪机,仓库里还有十年前的老球机;总部用海康,分公司用大华,办公网里还“顺手”挂着几台萤石云、乐橙云的家用摄像头。每路摄像头…

2026/9/23 20:02:15 阅读更多 →
2026最新:3个步骤搞定无聊的英文底层逻辑

2026最新:3个步骤搞定无聊的英文底层逻辑

2026最新:3个步骤搞定无聊的英文底层逻辑 复制来的代码跑不通,报错信息像天书,调试半天找不到原因,这是很多开发者在接触新框架或底层机制时的噩梦。尤其是当涉及到那些看似简单实则复杂的“无聊的英文”——比如标准库中的基础数据类型处理、字符串…

2026/9/23 20:02:15 阅读更多 →
UE4 C++调用外部EXE:蓝图可调用进程启动器实现

UE4 C++调用外部EXE:蓝图可调用进程启动器实现

简介:本资源是一份面向UE4中级开发者的技术实践工程,聚焦C与蓝图协同调用外部exe程序的核心需求,适用于游戏工具链集成、辅助编辑器启动及自动化脚本执行等实际场景。资源包含完整可编译的UE4项目工程(OpenExe)&#x…

2026/9/23 20:02:15 阅读更多 →
3步搞定u盘强制格式化避坑指南

3步搞定u盘强制格式化避坑指南

3步搞定u盘强制格式化避坑指南 面试被问原理答不上来?别慌,这不仅是运维面试的高频考点,更是你日常处理脏数据、恢复生产环境存储故障的救命稻草。很多开发者只知 format…

2026/9/23 20:02:15 阅读更多 →
Snake主动轮廓模型实战:从能量方程到GUI参数调试的图像分割

Snake主动轮廓模型实战:从能量方程到GUI参数调试的图像分割

简介:这份资源是一套基于MATLAB的SNAKE主动轮廓图像分割GUI演示程序,面向图像处理初学者、计算机视觉方向学生及需要快速验证分割算法的研究者。它把经典的能量最小化轮廓跟踪方法与可视化交互界面结合起来,让使用者无需深入编程即可调整参数…

2026/9/23 20:02:15 阅读更多 →
shdoclc.dll下载手写实现:3个面试坑一次讲透

shdoclc.dll下载手写实现:3个面试坑一次讲透

shdoclc.dll下载手写实现:3个面试坑一次讲透 看了一堆教程还是不会写项目?别急,这行代码能救你。shdoclc.dll下载这个看似简单的需求,其实是Windows系统编程的深水区。很多新人只知下载,不懂底层,面试一问就露馅。今天我…

2026/9/23 20:01:14 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →