一般测试 APP 都是先设置代理,然后抓包进行测试。但是大多数情况下,抓取的数据包都含有参数校验,一旦修改其中一个参数之后,就会返回签名错误。
例如 :
还有的有时间校验,当过去某一时间段后,该数据包就失效了。
因此如果想要去重放或者修改数据包进行 FUZZ 的话,就要弄清楚其中的加密 sign 值的算法。
本文以某 app 老版本为例 ( 仅为技术研究 ) ,主要目的是利用 Frida 进行 HOOK 进而去获取其 api -sign 的加密算法。
0x02 环境准备
这里手机采用 魅 族 X4 ,刷了 CM13.0 ,开启 ROOT 权限。
APP 版本为 v3.0.10 ,下载地址:
https://www.wandoujia.com/apps/cn.soulapp.android/history_v18080100
然后就是 Frida 环境的准备了 。
Frida 是一款基于 Python + JavaScript 的 Hook 与调试框架,在 AndroidLinuxWindows 等平台均能使用。这里我们以 Windows 来对 Android 应用程序进行 Hook 。 Frida 的官网地址是: https://www.frida.re 。
安装方法也很简单 :
pip install frida -tools
手机开启开发者模式,并开启 USB 调试。
下载 frida-server ,下载地址为:
http://build.frida.re/frida-snapshot/android/arm/bin/frida-server 。
上传到手机
adb push frida -server /data/local/ tmp /
添加权限
root@mx4:/ # chmod 777 frida -server
手机上运行 frida-server ,命令如下 :
root@mx4:/ #./ data/local/ tmp / frida -server
端口转发 , 电脑上运行如下命令 :
adb forward tcp:27042 tcp:27042
环境准备好了,就开始对 APP 进行测试 。
0x03 利用 Frida 进行 HOOK
安装后打开 APP 。
发现 APP 闪退,并提示 SoulApp 暂不支持模拟器,请稍后再试 ~ 。
用 jadx 打开 apk 文件,搜索关键字 模拟器 。
只有一处,我们点进去。
其中有个判断,如果 cn.soulapp .android.utils.j.e() 为 true ,则提示不支持模拟器,并退出程序。点进这个方法查看。
其中有多个判断,如果一个为 true ,则返回 true ,最简单有效的方法就是 hook ,直接令返回为 false 。 使用 Frida 进行 hook ,代码如下 :
运行后,发现再次打开 app ,可以顺利进入了。
输入手机号,点击确定。
提示 网络错误 ,这是因为使用了代理,所以报错,但是有数据包的。可以暂时先不管这里。我们目的是获取 sign 值的加密算法。这里是获取 api -sign 的加密算法。
数据包内容
数据包中有 api-sign ,所以直接利用 jadx 搜索 api-sign 。
发现在 cn.soulapp.android.api.b. b.b () 中有调用,进入查看 。
api-sign 值的获取调用了 cn.soulapp.android.api.b. c.a 方法 。
这里是创建了一个 stringBuilder ,经过拼接后,调用 com.gongjiao .rr.tools.f.b 进行 sha1 加密,并转换为大写。我们需要知道 cn.soulapp.android.api.b.c.a 三个参数的值是什么。
aVar.b (" api -sign", c.a ( aaVar , replaceAll , currentTimeMillis ));
根据代码可以推测,第一个参数 aaVar 是类 okhttp3.Request 的实例化;
第二个参数 replaceAll 是获取的 UUID 去除中间的 "-" ;
第三个参数是当前时间戳减去 cn.soulapp.android.api. a.a () 。这个值是从 soul_share.xml 中读取 ApiConstants_timeDiff 的值,查看 soul_share.xml 发现内容为空。
所以第三个参数为当前的时间戳。
查看 cn.soulapp.android.api.b.c.a 方法,前半部分是对 aaVar 进行操作,大概是获取请求的路径,然后对参数进行拼接。
看后半部分的代码 :
这里第71行中的UTDevice.getUtdid(SoulApp.b())为设备号,即数据包里面的device-id;
第72行的a.j为固定值,这里为10000003;
第73行这个值需要获取,可以用hook获取;
第74行a(j)是将传入的时间戳(第三个参数)进行转换;
第75行是拼接了传入的第二个参数;
第78行拼接了固定值3010;
然后第80行调用com.gongjiao.rr.tools.f.b对stringBuilder进行加密,并转换为大写。
可以通过 hook 的方法直接获取 cn.soulapp.android.api.b. c.a 和 com.gongjiao.rr. tools.f.b 的参数。
主要代码 :
由于 cn.soulapp.android.api.b.c 中有多个 a 方法,所以这里用了重载,指明参数类型来确定是哪个方法。
运行效果
知道了加密算法以及参数,就可以自己实现加密获取 api -sign 了,如下所示:
api -sign 值可以获取了,我们试一下能否利用。由上面知道 代理抓 包时数据包返回 400 ,经过查看代码是可以解决这个问题的。 这里不详细说明 。
发现该方法获取 api -sign 是可行的。
0x04 其他问题
1. 不进行 hook 获取参数的内容或者查看调用堆栈的方法
可以通过动态调试的方法进行查看。
首先将 apk 反编译为 smali 文件,然后 IDEA 安装 smalidea 插件。下载地址: https://bitbucket.org/JesusFreke/smali/downloads/
反编译的命令如下 :
java -jar baksmali-2.2.2.jar d 106_3ce8a91b116f3ca28175affa3d12083f.apk -o SoulApp3010/ src
然后导入到 idea 中
然后在需要查看的地方下断点。
例如在 cn.soulapp.android.api.b. c.a 下断点
打开 Run /Debug Configurations ,添加一个远程调试,端口 8700
运行 app ,然后在 Android Device Monitor 中选中
打开调试按钮,点击手机上的确定,进入调试。
2. 加密的算法在 so 文件中
简单的方法就是获取调用 so 中方法的参数,然后自己写一个 app ,调用其 so 文件。
如果有判断的话,可以修改 so 文件达到可以调用的目的。
如上所示,该 so 文件有判断,如果 isInMyAPP 为 false ,则会退出,返回 null 。
我们可以修改 CMP R0,#0 为 CMP R0,#1 来绕过该限制。
修改后
更深入的就是对 so 文件进行分析,找到其中的加密算法。
0x05 总结
Frida 不仅可以用于 hook java 层,也可以进行 native 层的 hook 。利用 Frida 进行 hook 时,要求需要使用已 ROOT 的手机,对于手机无法 ROOT 的,安装 VirtualXposed 后使用 Xposed 框架也可以进行 HOOK 。这里就不说明了,有兴趣的可以去试一试。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Spring 缓存大法
- phpmyadmin getshell大法
- Echarts 系列之复制粘贴大法
- iOS 模拟器调试大法了解一下?
- 图片和视频编辑之Matrix大法好
- 重启大法好!线上常见问题排查手册
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。