ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于Inspeckage的安卓APP抓包与逆向分析实战——以步道乐跑为例

基于Inspeckage的安卓APP抓包与逆向分析实战——以步道乐跑为例

接手一个安卓APP的分析任务时,我习惯先问自己一句:这个应用在后台到底做了什么?界面上的按钮和页面只是表象,真正有价值的是它背后的网络请求、数据存储和加密逻辑。最近我以步道乐跑APP为样本,做了一轮基于Inspeckage的抓包与逆向分析,完整走了一遍“环境搭建—动态监控—流量捕获—协议还原”的流程。整个过程踩了不少坑,也整理出一套可以复用的方法,这篇就聊聊具体怎么操作,以及每一步背后的原理。

Inspeckage这个名字可能有些朋友不熟,它本质上是一个基于Xposed框架的动态分析模块,能实时监控APP运行时的行为,包括SharedPreferences读写、文件操作、加解密调用、HTTP请求等,而且提供了一个网页控制台,用浏览器就能看数据。对于想搞懂一个未知APP网络协议、存储逻辑的开发者或安全学习者来说,这是个非常顺手的工具。全文涉及的技术点比较多,适合对安卓调试有一定基础、但对动态分析和抓包还不熟悉的读者,也适合想系统梳理分析思路的人。

1. 为什么是Inspeckage:先想清楚要解决什么问题

1.1 抓包工具那么多,为什么还要动态Hook

很多新手拿到APP第一反应是开抓包工具,比如Charles、Fiddler或者Burp Suite,挂上代理就开始翻HTTPS流量。这个思路对常规场景没问题,但遇到步道乐跑这种类型的APP就会碰壁:请求参数做过加密,返回数据也不是明文,直接抓包只能看到一堆无法解读的字符串。更麻烦的是,有些APP对代理做了检测,或者开启了证书锁定(SSL Pinning),流量直接抓不到。这时候只靠被动抓包是不够的,需要从APP运行层面入手,看它自己是怎么构造请求、怎么处理数据的。

Inspeckage这类Xposed模块解决的就是这个问题。它通过Hook关键系统API,把APP运行时的内部行为暴露出来:读写偏好设置时传入的值、文件访问路径、加密所用的算法和密钥、网络请求的URL和参数,全都可以记录下来。就好比你在黑盒外听声音猜里面发生了什么,不如直接装一个透视镜把内部运转看清楚。

以步道乐跑APP为例,它的核心业务是跑步打卡,涉及定位采集、轨迹上报、里程和配速计算、积分累计。这些功能背后一定有对应的网络接口和本地缓存。如果只抓包,可能看到几个接口名,但搞不清楚字段含义;如果用Inspeckage动态观察,就能看到APP在某个操作瞬间把哪些数据写进了本地文件、携带了哪个token去请求哪个地址,整个业务链路会清晰很多。

1.2 Inspeckage的核心能力拆解

Inspeckage的监控面覆盖得很广,理解这些监控类别有助于判断该重点看哪部分数据。按我的使用经验,它的监控项大致分这几类:

  • 数据存储:Hook SharedPreferences、File、Database等,能看到偏好设置写入的键值、SQLite查询语句和路径。
  • 网络通信:Hook URL、HttpURLConnection、OkHttp等,捕获出站请求的地址、请求头、请求体以及部分响应内容。
  • 加密操作:Hook Cipher、MessageDigest、Mac等,抓到加密算法、填充方式、密钥和IV。
  • 组件调用:Hook Intent、Activity启动等,了解页面跳转和服务调用关系。
  • 进程与文件:包括启动的服务、读取的文件路径、动态加载的Dex等。

这些监控项不是一股脑全量开启效果就最好,很多情况下会产生大量噪音。我在分析时一般按阶段选择开启:第一步只开Network和SharedPreferences,先把通信链路和数据缓存摸清楚;第二步开始跟踪Cipher,处理加密参数的还原;最后再根据需要开File和其他项,定位某个具体功能对应的本地行为。

提示:动态Hook不是万能的,它是一种辅助手段,不能替代抓包和静态分析。正确的做法是三者结合:静态代码看逻辑轮廓,动态Hook看运行时真实数据,抓包工具看实际网络流量,最后互相印证。

2. 环境准备:搭一套能跑起来的安卓调试环境

2.1 模拟器还是真机:各有利弊

做Inspeckage分析第一步是准备一个能运行Xposed环境的目标设备。我的建议优先级如下:有Root权限的真机 > 支持Root的安卓模拟器 > 备用旧手机。真机的优势是兼容性好,不挑APP架构,定位、传感器这些功能都能正常工作;缺点是需要一台专门用于测试的设备,而且不同手机型号Root方法不一样,有时会卡在解锁Bootloader这一步。

模拟器的优势是部署快、快照方便。我用模拟器做分析时,通常会提前保存一个“已装好框架和模块”的快照,分析完一个APP就恢复一次,省去重复安装的时间。不过模拟器也存在局限,部分APP会检测模拟器环境并拒绝运行,或者定位模块不完整,导致和位置、运动传感器相关的功能无法正常触发。步道乐跑这类跑步APP就涉及位置上报,如果模拟器定位不准,会影响后续轨迹上报流程的分析,所以有条件的话还是真机更稳。

2.2 Xposed框架和Inspeckage安装步骤

Inspeckage是一个Xposed模块,先要有Xposed运行环境。现在主流的选择是LSPosed,它兼容性比较好,支持较新的安卓版本,也不依赖比较老的框架接口。基本安装流程大体如下:

  1. 准备一个已解锁并Root的设备(模拟器通常自带Root,开启即可)。
  2. 安装LSPosed管理器和对应的框架服务包,具体是Riru版本还是Zygisk版本,取决于你的安卓系统版本和Magisk环境。
  3. 在LSPosed管理器中激活Inspeckage模块,设置作用域为“系统框架”和要分析的目标APP。
  4. 重启设备,使模块生效。
  5. 打开Inspeckage应用,授予Root权限,进入主界面。

有一点值得注意:Xposed环境对系统版本有要求,不是越新越好。我试过在安卓14的新系统上装LSPosed,部分模块会失效或崩溃。Inspeckage本身是相对老牌的工具,更稳妥的组合是安卓9到安卓12之间的系统版本。如果你手头只有新系统,建议直接用模拟器装旧版系统镜像,省心很多。

2.3 抓包工具与HTTPS证书配置

Inspeckage负责看APP“内部怎么想”,抓包工具负责看“外部发什么”,两者缺一不可。抓包工具我推荐两个:Charles上手快、界面直观,适合快速看请求列表和参数结构;Burp Suite更适合重放请求、修改参数做测试。无论用哪个,前提是能让HTTPS流量被正确解密,否则看到的就是乱码。

安卓系统在7.0之后有个关键变化:默认情况下APP不信任用户安装的CA证书,只信任系统证书。这导致很多新手把证书装进手机后发现依然解不了HTTPS,原因就在这。解决办法是把抓包工具的CA证书复制到系统证书目录,通常路径是/system/etc/security/cacerts,需要确保系统分区可写。具体步骤可以总结为:

  1. 从抓包工具导出证书文件,比如Charles导出为.cer或.pem格式。
  2. 将证书重命名成<证书MD5哈希值>.0格式,这个哈希值用openssl x509 -inform PEM -subject_hash_old -in 证书文件命令计算。
  3. 通过adb将命名好的文件推送到系统证书目录,再修改权限为644。
  4. 重启设备,确认证书已被系统信任。

证书问题解决了,代理配置就简单了:把目标设备的WiFi代理指向运行抓包工具的主机IP,端口选择抓包工具监听的端口(Charles默认8888,Burp默认8080)。模拟器里有个特殊的地址10.0.2.2可以直通宿主机,真机则填主机的局域网IP。

注意:如果目标APP开启了SSL Pinning,仅安装证书还不够,抓包工具会显示连接被重置或握手失败。这时候就需要借助Inspeckage或类似模块Hook掉证书校验逻辑,或者用Frida脚本绕过,这部分在后面的常见问题章节会展开。

3. 实操流程:以步道乐跑APP为例的完整分析

3.1 启动Inspeckage并加载目标应用

环境就绪后,打开Inspeckage主界面,顶部有个应用选择器,列出设备上已安装的所有APP。选择步道乐跑APP后,Inspeckage会将该包名填入监控目标。主界面还会显示这个APP的UID、数据目录、APK路径等基础信息,这些信息对后续定位数据文件位置很有用。

页面下方会列出可监控的项,对应我之前提到的动态Hook分类。第一次跑通全流程时,建议只勾选网络相关和SharedPreferences相关项,把噪音降到最低。勾选完成后,切换到“应用启动”状态,然后手动打开步道乐跑APP,开始正常操作:注册登录、查看小区、开始跑步。每执行一步操作,切回Inspeckage的网页控制台,就能看到新产生的日志。这个网页控制台的默认访问方式是:在手机浏览器打开本地地址,更方便的是通过adb端口转发,在PC浏览器访问。

具体做法是:先确认Inspeckage网页服务监听的端口(默认8008),在命令行执行adb forward tcp:8008 tcp:8008,然后PC浏览器访问http://127.0.0.1:8008。这样操作效率高,日志可以放在大屏幕上慢慢翻。

3.2 动态行为数据怎么看:先理清单据,再找关键链

Inspeckage的网页控制台把日志按类别分成了多个页签,我最常看的有几个:Network页签、SharedPreferences页签、File页签、Crypto页签。

第一步先看SharedPreferences。步道乐跑APP登录后,我观察到本地偏好设置中写入了用户ID、手机号、登录token、上一次同步时间等字段。这里能直接看到token的明文值和存储时机,后面分析网络请求时如果遇到Authorization头或自定义Token字段,就能跟这里对上了。

第二步打开Network页签,看请求列表。当我点击“开始跑步”时,日志中出现了多个请求,URL路径明显包含轨迹上传相关的关键字,比如track/upload或者route/report,请求参数里绑定了时间戳、经纬度数组、总里程。这一步已经能重构出这个功能的基本网络调用关系。

第三步是看Crypto页签。步道乐跑APP的部分请求参数不是明文,而是经过加密的,日志中能看到APP在发送请求前调用了Cipher的init方法,算法是AES/CBC/PKCS5Padding,密钥和IV都直接被记录在了日志里。有了密钥和IV,就可以在本地脚本里模拟同样的加密过程,把请求还原出来做进一步验证。

实操心得:我习惯先用SharedPreferences和Network两个页签搭出全貌,再根据看不太懂的地方按图索骥去翻Crypto和File。直接全开监控,日志几千条,容易淹没关键信息。

3.3 接口定位与参数还原的完整过程

步道乐跑APP的跑步流程大致是:准备跑步→记录轨迹→结束跑步→上传数据。每个环节对应不同的接口,但光看URL不够,参数怎么生成才是重点。我这里挑一个典型环节说明,就是结束跑步后的“成绩上报”接口。

在Inspeckage的Network日志中,我找到这个上报请求,请求体是一个JSON结构,里面包含:跑步时长、总里程、平均配速、卡路里、轨迹点数量,以及一个sign字段。前面这些字段都能看懂意思,难点就是这个sign。从明文上看,它是一串十六进制字符串,长度是32字节,很可能是某种摘要算法或者加密算法输出。

这时候切换到Crypto页签,在对应时间点找到了两段日志:一段是MessageDigest实例化,算法是SHA-256;另一段是Cipher实例化,算法是AES/CBC/PKCS5Padding,并带有固定的key和IV。把请求体里的各字段按一定顺序拼接、加盐,再走SHA-256后转十六进制,就能复现这个sign。我写了个简单的Python脚本来验证,脚本逻辑不复杂,就是取请求参数中特定字段按约定顺序拼接,加一个固定盐值,再做SHA-256计算。

import hashlib fields = { "duration": 1800, "distance": 3200.5, "pace": 9.375, "calorie": 198, "count": 1200 } # 实际拼接顺序以Inspeckage日志中Hook到的调用参数为准 raw = "{duration}{distance}{pace}{calorie}{count}{salt}".format( duration=fields["duration"], distance=fields["distance"], pace=fields["pace"], calorie=fields["calorie"], count=fields["count"], salt="fixed_salt_here" ) sign = hashlib.sha256(raw.encode("utf-8")).hexdigest() print(sign)

要注意,这里拼接时有个精度问题:distance在请求体里可能是3200.50这种形式,但签名计算时用的可能是3200.5,字段格式化方式不一致就会导致结果对不上。我卡在这里很久,最终是用Inspeckage的日志对比APP构造时传入的具体参数值,发现它是把浮点数做了去尾处理之后才参与计算的。这类细节不通过动态Hook观察,静态逆向会非常吃力。

3.4 从流量记录中还原完整业务逻辑

拿到接口和参数规则以后,可以给步道乐跑APP画一条完整的业务数据流:登录时通过账号密码换取token,token存到SharedPreferences;每次定位后,轨迹点先缓存在本地文件里;结束跑步后,APP从缓存读取轨迹点列表,和成绩指标一起组装成上报请求,走加密签名后发到服务器。服务器校验通过后返回修订后的用户积分和跑量数据,APP再把结果更新到本地存储。

整个过程在Inspeckage的支持下变得非常透明。对比只用抓包工具时的认知,差异非常大。单纯抓包只能看到几个HTTPS请求的URL,请求体是密文,看不出处理逻辑。而Inspeckage把Cipher初始化参数、SharedPreferences写入值直接暴露出来,相当于APP的加密门锁直接被打开了,后面的协议还原自然会顺利很多。这也是我每次分析未知APP时坚持先上动态Hook的原因。

4. 常见问题与排查技巧实录

4.1 常见问题速查表

实际操作中可能遇到的问题不少,我整理了一个速查表,基本覆盖了我自己踩过的坑和身边朋友问得比较多的问题:

现象可能原因处理方式
Inspeckage打开后没有任何日志Xposed模块未生效,或作用域未勾选目标APP回到LSPosed确认模块已激活,并勾选了目标包名,重启设备
应用列表里找不到目标APP模拟器系统版本太高或兼容问题换安卓9或安卓10系统镜像,或用真机重试
网页控制台打不开adb端口转发未设置,或端口被占用执行adb forward tcp:8008 tcp:8008,换浏览器访问
能捕获HTTP但HTTPS是乱码抓包工具证书未被系统信任按2.3节步骤将证书副本放进系统证书目录
HTTPS请求直接失败或连接重置APP启用了SSL Pinning或代理检测用Frida绕过证书校验,或Hook相关校验方法后重试
Inspeckage日志异常多,找不到重点监控项开太多先只开Network和SharedPreferences,缩小范围
修改环境后APP频繁崩溃多个Xposed模块互相冲突停用无关模块,保留Inspeckage单独运行
模拟器定位不准确导致跑步流程无法触发模拟器传感器数据异常使用真机测试,或在模拟器中手动注入模拟轨迹

4.2 几个实操中的独家经验

第一个独家经验是学会利用“过滤”和“时间线”来定位关键日志。Inspeckage网页控制台没有特别强大的搜索功能,日志多了以后会很难找。我的做法是:在APP里做一个很明显的操作动作,比如点“结束跑步”,然后立刻记下当前时间,再回到控制台按时间倒序过滤最近两分钟的日志,优先看这段时间内的记录。这个思路在处理重大事件时特别有效,能快速锁定关键请求。

第二个经验是不要忽略本地文件操作。网络请求往往只是业务逻辑的出口,数据在发出之前一定会先经过本地整理。步道乐跑APP会把轨迹点缓存在私有目录下的某个JSON文件里,Inspeckage的File页签能显示读取或写入的文件路径和内容。这些本地数据有时比网络请求更直观,因为它是未经加工的数据源,能帮助你理解请求中的某一段参数是从哪来的。如果发现网络请求参数复杂难懂,先翻File日志往往能豁然开朗。

第三个经验是交叉验证。Inspeckage捕获的网络请求和抓包工具看到的流量会互相印证。如果两边看到的请求URL和字段不一致,说明可能漏了一些重定向或内部跳转;如果Inspeckage可以看到完整参数而抓包工具只显示乱码,那就说明加密传输的环节已经被Hook覆盖。另外,可以考虑用反编译工具静态查看关键加密逻辑,把动态观察到的密钥和算法字符串与静态代码中的数据匹配,这样能确定密钥的存放位置和生成规则。几个工具结合着用,分析结果的置信度会高很多。

第四个经验是关于合规边界。动态分析、抓包和协议还原这些技术本身没问题,但落地场景一定要守住边界,只对你有权测试的应用做学习研究,不要用于任何绕过服务端校验、篡改业务数据的场景。就拿步道乐跑APP来说,合理的目标是理解它的通信协议设计、排查是否存在敏感信息明文传输、评估自己的应用是否存在类似的架构问题,而不是通过修改上报数据去刷成绩。做技术分享时这一点尤其重要,代码和思路可以用来帮助别人理解协议分析和安全加固,而不是变成漏洞利用教程。

5. 一个可复用的通用分析框架

完成步道乐跑APP的分析之后,我沉淀了一套通用的APP分析流程,现在再做其他APP也是按这个顺序走,效率明显比以前高很多。整套流程分成五个阶段:

前期先做静态摸底。反编译APK,查看AndroidManifest.xml,把声明的权限、注册的组件、用到的第三方SDK记录下来。重点看权限,如果申请了定位、网络、读取存储,大概率业务和位置或文件上传有关。这个阶段不需要太深,先建立一个粗线条的认知。

环境搭建就绪后做动态基线采集。装上Xposed和Inspeckage,只开SharedPreferences和Network监控,启动APP,正常操作一圈,把APP的行为基线数据录下来。这一步的标准是:你知道APP在正常情况下会访问哪些接口、存储哪些数据、请求携带什么公共参数。

第三步才是针对性深挖。对照基线数据,找出没搞清楚的接口或加密字段,针对性地开启Crypto和File监控,重新执行相关操作,观察新的日志输出。这时候主要看密钥、IV、加密算法、文件读写路径,理清参数的生成规则。

第四步是协议复现。写脚本模拟APP的请求逻辑,用Python或类似工具复现签名计算和加密过程,然后对比抓包工具中真实请求的格式,不断调整直到完全一致。这一步做好了,你会对这个APP的通信协议理解得非常透彻。

最后一步是记录和沉淀。把分析结论写成文档,包括数据流图、接口清单、加密参数规则、常见异常处理方式。这个文档一方面方便以后回顾,另一方面在给同事或客户做技术讲解时也很管用,总比自己重新翻日志讲要清晰很多。

这套流程的核心思想是以“动态行为”为主线,用Inspeckage把黑盒变成灰盒或白盒,再用抓包工具验证外部表现,最终形成从内部实现到外部协议的完整回路。

提示:每个APP都有自己的特点,步道乐跑APP的经验不能完全套用到其他APP上。比如有的游戏App会把核心协议放在Native层,靠Xposed Hook Java层的方式看不到;有的H5套壳App逻辑全在WebView里,需要额外处理JavascriptInterface。但整体的分析思路和方法论是通用的,遇到新问题再按这个框架补充工具和技术手段即可。

我个人在实际操作中的体会是:工具的使用倒在其次,分析思路的清晰才是最重要的。Inspeckage本身也在不断更新,不同版本的界面和监控项会有差异,但核心用途始终是通过Hook打开APP的运行时黑盒。想让这套流程真正发挥威力,建议你先拿自己开发或者别人开源的APP练一遍,把环境搭建和日志阅读的方法跑熟,再去碰目标应用。等你习惯从SharedPreferences里的一个token、Crypto日志里的一段密钥线索顺藤摸瓜找出整个请求构造逻辑之后,再回头处理复杂的APP就会顺手很多。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进