安卓APP测试之HOOK大法

栏目: IOS · Android · 发布时间: 5年前

一般测试 APP 都是先设置代理,然后抓包进行测试。但是大多数情况下,抓取的数据包都含有参数校验,一旦修改其中一个参数之后,就会返回签名错误。

例如

安卓APP测试之HOOK大法

还有的有时间校验,当过去某一时间段后,该数据包就失效了。

安卓APP测试之HOOK大法

因此如果想要去重放或者修改数据包进行 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测试之HOOK大法

发现 APP 闪退,并提示 SoulApp 暂不支持模拟器,请稍后再试 ~

jadx 打开 apk 文件,搜索关键字 模拟器

安卓APP测试之HOOK大法

只有一处,我们点进去。

安卓APP测试之HOOK大法

其中有个判断,如果 cn.soulapp .android.utils.j.e() true ,则提示不支持模拟器,并退出程序。点进这个方法查看。

安卓APP测试之HOOK大法

其中有多个判断,如果一个为 true ,则返回 true ,最简单有效的方法就是 hook ,直接令返回为 false 使用 Frida 进行 hook ,代码如下

安卓APP测试之HOOK大法

运行后,发现再次打开 app ,可以顺利进入了。

安卓APP测试之HOOK大法

输入手机号,点击确定。

安卓APP测试之HOOK大法

提示 网络错误 ,这是因为使用了代理,所以报错,但是有数据包的。可以暂时先不管这里。我们目的是获取 sign 值的加密算法。这里是获取 api -sign 的加密算法。

数据包内容

安卓APP测试之HOOK大法

数据包中有 api-sign ,所以直接利用 jadx 搜索 api-sign

安卓APP测试之HOOK大法

发现在 cn.soulapp.android.api.b. b.b () 中有调用,进入查看

安卓APP测试之HOOK大法

api-sign 值的获取调用了 cn.soulapp.android.api.b. c.a 方法

安卓APP测试之HOOK大法

这里是创建了一个 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 进行操作,大概是获取请求的路径,然后对参数进行拼接。

看后半部分的代码

安卓APP测试之HOOK大法

这里第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 的参数。

主要代码

安卓APP测试之HOOK大法

由于 cn.soulapp.android.api.b.c 中有多个 a 方法,所以这里用了重载,指明参数类型来确定是哪个方法。

运行效果

安卓APP测试之HOOK大法

知道了加密算法以及参数,就可以自己实现加密获取 api -sign 了,如下所示:

安卓APP测试之HOOK大法

api -sign 值可以获取了,我们试一下能否利用。由上面知道 代理抓 包时数据包返回 400 ,经过查看代码是可以解决这个问题的。 这里不详细说明

安卓APP测试之HOOK大法

发现该方法获取 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

安卓APP测试之HOOK大法

然后在需要查看的地方下断点。

例如在 cn.soulapp.android.api.b. c.a 下断点

安卓APP测试之HOOK大法

打开 Run /Debug Configurations ,添加一个远程调试,端口 8700

运行 app ,然后在 Android Device Monitor 中选中

安卓APP测试之HOOK大法

打开调试按钮,点击手机上的确定,进入调试。

安卓APP测试之HOOK大法

2. 加密的算法在 so 文件中

简单的方法就是获取调用 so 中方法的参数,然后自己写一个 app ,调用其 so 文件。

如果有判断的话,可以修改 so 文件达到可以调用的目的。

安卓APP测试之HOOK大法

如上所示,该 so 文件有判断,如果 isInMyAPP false ,则会退出,返回 null

我们可以修改 CMP R0,#0 CMP R0,#1 来绕过该限制。

修改后

安卓APP测试之HOOK大法

更深入的就是对 so 文件进行分析,找到其中的加密算法。

0x05 总结

Frida 不仅可以用于 hook java 层,也可以进行 native 层的 hook 。利用 Frida 进行 hook 时,要求需要使用已 ROOT 的手机,对于手机无法 ROOT 的,安装 VirtualXposed 后使用 Xposed 框架也可以进行 HOOK 。这里就不说明了,有兴趣的可以去试一试。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法设计与分析

算法设计与分析

郑宗汉/郑晓明编 / 清华大学出版社 / 2005-6 / 32.00元

《算法设计与分析》系统地介绍算法设计与分析的概念和方法,共四部分内容,第一部分包括前两章,介绍算法设计与分析的基本概念及必要的数学工具,对算法的时间复杂性的概念及算法的分析方法作了较为详细的叙述。第二部分包括第3~~9章,以算法设计技术为纲,从排序问题和离散集合的操作开始,进而介绍递归技术、分治法、贪婪法、动态规划、回溯法、分支与限界法以及随机算法等算法设计技术及其复杂性。第三部分包括第10章和第......一起来看看 《算法设计与分析》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具