APP逆向(一)之工具、抓包以及案例演示

xiao1star2025-07-28文章来源:SecHub网络安全社区


APP逆向(一)之工具、抓包以及案例演示

我的天,安装这个面具本人真的废了老鼻子劲了终于成功了

工具安装

模拟器的安装以及配置

电雷模拟器下载:https://www.ldmnq.com/other/version-history-and-release-notes.html(本人起初使用的MUMU模拟器发现安装不了Magisk,本人使用的是9.1.40,如果怕翻车建议大家和我安装一样)

20250706165334346.png

点击软件设置->显示->分辨率设置选择手机版(尺寸你们自己随便)

20250701181305144.png

机型->手机型号(建议和本人选择一样的,因为不同型号可能导致安装失败,本人就是使用了这个机型才成功)

20250701181356210.png

磁盘->系统盘设置选择可写入

20250701181448394.png

其他->开启ROOT权限->保存设置,然后重启

20250701182144911.png

MASK面具的安装

给雷池模拟器安装面具

本人在网上找了好多安装教程,但是都已失败告终,这里是我安装成功的面具软件,成功后直接拖进模拟器中即可

通过网盘分享的文件:模拟器面具
链接: https://pan.baidu.com/s/1J7ifJTNPjtBIEL5Hx4HBtQ?pwd=vjex 提取码: vjex 
--来自百度网盘超级会员v5的分享

20250706170217646.png

下载完成之后直接拖入到模拟器中然后双击打开,选择永久记住,然后安装

20250706170408857.png

20250701174146791.png

选择允许

20250701181607001.png

不选择安装到Recovery,下一步

20250701181653221.png

来到这一步选择直接安装(直接修改/system),如果没有这个选项直接关闭虚拟机重新启动,然后点击开始

20250706170521866.png

最后显示安装完成,这时关闭虚拟机重新启动,不要点击下面的重启

20250706171024293.png

重新打开这个有一个异常状态不要管他

20250706171013097.png

此时我们就安装成功啦

20250706171132512.png

adb下载

adb就是用于我们电脑与模拟器连接连接的,下载地址

Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip
Mac版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip
Linux版本:https://dl.google.com/android/repository/platform-tools-latest-linux.zip

接着就设置环境变量,将我们的路径添加到Path中

20250706172222135.png

之后在命令框中输入adb回显如下内容代表正确

20250706172356838.png

MT管理器

地址:https://mt2.cn/

下载完成之后直接拖入到模拟器中

20250706172822290.png

抓包配置

打开我们的burp然后下载证书

20250706171611785.png

命名为1.cer

20250706171735259.png

打开MT管理器将这个路径复制一下,我们将证书导入到这个路径下

20250706173004167.png

在证书的目录下打开cmd,输入

adb push 1.cer /storage/emulated/0/

20250706173205289.png

可以看到证书成功导入到模拟器中

20250706173302576.png

打开是模拟器中的设置->安全性和位置信息->加密与凭据->从SD卡安装

20250706174826811.png

20250706174838495.png

20250706174851662.png

选择我们刚刚导入进来的证书

20250706174953306.png

设置锁定方式即可

20250706175019560.png

这样就导入了我们证书,然是目前出现的问题就是我们只能抓http的包,抓取https的包会有警告,所以我们还需如下操作

给面具模块导入系统抓包证书

模块地址:https://gitcode.com/open-source-toolkit/a6ccf/blob/main/Move_Certificates-v1.9.zip

下载成功后,还是老样子,把他导入到模拟器中某个目录下的1.zip中

adb push Move_Certificates-v1.9.zip /storage/emulated/0/1.zip

20250706173959016.png

打开面具点击模块选择从本地安装

20250706174145364.png

选择文件管理器,然后选择我们上传的1.zip

20250706174218981.png

20250706174218981.png

成功安装接着重启模拟器

20250706174218981.png

这样的话我们的证书就导入到系统证书中了

20250706174218981.png

现在有一些app抓包时可能会检测如下内容

  1. 检测ROOT权限(直接关闭模拟器ROOT权限)
  2. 检测是否使用了代理(不使用代理,使用类似于Proxifier的应用将流量转到burp中)
  3. 检测是否是模拟器(最直接的方法:氪金,使用真机)
  4. 检测SSL签名(一般app很少有)

现在我们就讲讲如何绕过代理的检测以及ROOT

1.绕过ROOT,打开软件设置关闭ROOT权限

20250706180927606.png

2.绕过代理检测

代理检测就是检测我们是否手动配置了代理,想要绕过直接将其改为无即可

20250706181233846.png

那么想要抓包的话,可以下载一个postern的应用

地址:https://github.com/postern-overwal/postern-stuff/blob/master/Postern-3.1.2.apk

20250706181530561.png

接着将下载好的apk拖入到模拟器中

20250706181744268.png

接着打开这个应用,添加代理服务器

20250706182104186.png

设置为你自己的地址与端口,代理类型选择HTTPS\HTTP的,用户名密码不用填,然后保存即可

20250706182218373.png

接着配置规则,添加规则

20250706182418083.png

按照如下内容来选择,接着保存

20250706182458617.png

然后打开VPN,然后重启模拟器

20250706182458617.png

然后打开postern,打开之后呢可以看到右上角有一个钥匙的标志

20250706182458617.png

接着打开浏览器可以看到,可以看到成功抓包

20250706182458617.png

frida安装

frida是一款基于python + java 的hook框架,可运行在android、ios、linux、win、osx等各平台,主要使用动态二进制插桩技术。

首先在我们的本机上安装frida的客户端,frida的安装需要python3的环境

查看我们是否有安装frida

pip list

20250706182458617.png

如若没有直接安装,命令如下

frida

pip install frida==16.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

fridatools

pip install frida-tools==12.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

接着将服务端安装在虚拟机上

首先查看一下我们的模拟器的系统版本,cmd命令框输入下入内容

adb shell //连接模拟器的终端 su //使用模拟器的root权限 getprop ro.product.cpu.abi //查看系统版本

可以看到是x86_64的版本

20250706182458617.png

地址:https://github.com/frida/frida/releases?page=5

本人安装的是16.6.1,选择如下进行下载

20250706182458617.png

接着进行解压,重命名为fsfs(因为解压缩后的文件名太长了),然后使用adb将其pull到虚拟机中

adb push fsfs /data/misc/fsfs

20250706182458617.png

接着就是到当这个目录下给这个文件一个运行权限,然后运行这个fsfs

chmod 777 fsfs
./fsfs

20250707193244240.png

接着重现打开一个命令框,之前那个不要关闭,接着将模拟器的端口27042转发到本机的27042端口上

adb forward tcp:27042 tcp:27042

20250707193244240.png

利用frida查看模拟器上的进程

firda-ps -U 

20250707193653666.png

案例演示

在模拟器上打开Postern工具

然后我们在这里抓取一个app的数据包

可以在这个注册页面有一个xmsign的数据,这个是一个加密数据,我们我们可以看到这两个请求包前后两个只有xmsign是不同的,我们现在就逆向破译一下这个加密方式

20250707195517140.png

20250707195806414.png

直接apk包拖到jadx_gui中,全局搜索xmsign

20250707195806414.png

我们来到这个b方法中

20250707195806414.png

**分析:**可以看到首先呢是将我们的参数str调用了两次a方法,然后赋值给strA,接着就对strA进行非空判断,然后将xmsign拼接到sb参数中,接着再将strA拼接到xmsign后面,那么这个strA就是加密的数据,那么我们就看看看a方法

来到内层的a方法,这个方法看上去就是对参数值的拆分然后put到map2中,并没有进行加密

20250707195806414.png

接着我们就看看内层的a方法

20250707195806414.png

分析:可以看到内层的a方法呢首先是查看这个map中的key值是否有xmsign、xdebug、debug这其中的三个的任意一个如果没有就直接append上,最后调用方法s然后连上key一块进行加密

然后我们来到方法s中,发现方法s又调用了c方法

20250707195806414.png

然后看到c方法可以看到最后又调用了a方法

20250707204847667.png

接着就来到a方法,这段代码的作用是将字节数组中的每个字节转换为两位十六进制字符串,并将所有结果拼接在一起。这种转换在处理二进制数据

20250707204847667.png

那么现在我们知道了c方法最后返回的是加密数据了,我们直接右键c方法,然后赋值frida片段

20250707205150100.png

接着创建一个js文件

Java.perform(function(){ ....//frida代码块 });

20250707205714029.png

接着我们查看一下我们应用的包名,使用MT管理器查看,选择安装包提取

20250707210028353.png

获得到我们的包名

20250707210028353.png

接着在我们刚刚那个js的目录下打开cmd命令框输入如下命令,来实现我们方法c加密前以及加密后的数据,使用命令前将抓包工具以及我们要逆向的工具都关闭

frida -U -f "包名" -l 你的js脚本

若出现这个警告代码客户端的连接掉了重新连接一下即可

20250707210028353.png

运行完上面那条指令会显示,模拟器会自动打开这个app,然后出现如下内容

20250707210028353.png

接着我们就直接来到我们要测试的那个页面,查看其加密前后的数据

20250707210028353.png

加密前的数据:
Utils3.c is called: str=p1=store&p10=9.4.1.11&p11=1080&p12=1920&p13=&p14=94111&p15=10007&p16=&p17=&p18=PandaBookAndroid5652&p19=0&p2=PandaBookAndroid5652&p20=30&p3=d9d5ab12722377c5b65e883769b00d3e&p4=SM-S9280&p5=Samsung&p6=SM-S9280&p7=android&p8=28&p9=wlan&type=smslogin&key=7926f2fe246d11e58830005056b243f1
加密后的数据:
Utils3.c result=e98b4c7e6c016b946badd2c2e8d86f3b

其实这就是一个md5的加密,我们将加密前的数据直接进行32位的md的加密可以看到和上面的是一样

20250707210028353.png

总结

我们首先是通过反编译得到的代码获取到加密函数,但是我们无法进行动态调试进而更好的知道加密原数据,我们使用frida来将加密的frida片段通过cmd命令框来显示出加密前后的数据,进而到我们知道加密源数据数据是什么,进而可以构造加密数据

20250706170217646.png20250701181653221.png