0x01 前言
该方法很简单,本次记录是为了加深对安卓hook技术的学习,以及进一步熟悉frida和objection的使用,如果只是想需要这个功能,推荐手机root后装微x模块
技术仅供分享,请勿用于非法用途
0x02 环境准备
首先需要准备一台已经root的安卓手机(虚拟机也可),配备需求如下:
- 微信(最新版即可,本次使用的版本为v8.0.32)
- frida
- adb
其次需要电脑安装frida环境,之后再安装objection,具体如何配置可以在网上查找教程
0x03 hook过程
首先打开cmd在手机端启动frida:
adb shell su -c /data/local/tmp/frida
执行如下指令,第二条指令执行完后会返回如下图所示:
objection -g com.tencent.mm explore
android hooking search classes random
上图中看到了java.util.Random,紧接着我们hook该class,看一下发送随机表情后,会不会触发该类中的函数,执行如下指令进行hook:
android hooking watch class java.util.Random
接下来我们在手机端微信中进入文件传输助手,点击石头剪刀布或骰子,可以看到cmd中已被触发(如果没被触发,检查一下frida是否掉线了,或者可以objection重新挂载一下,还是不行的话请检查微信版本):
上图中不难看出java.util.Random.nextInt和java.util.Random.next两个方法被触发了,学过逆向的应该都明白这个并不微信本身的函数,而是系统层函数,直接改这个函数的值可能会导致程序崩溃等等。既然如此,我们先了解一下这俩函数的意思:
nextInt方法调用返回一个伪随机、均匀分布的 int 值,介于 0(包括)和 n(不包括)之间。
next()方法用于返回以位为单位的伪随机数。
不难知晓nextInt方法中传递的参数可能为随机值的范围,因此我们hook该函数的堆栈,在此之前,我们先删除之前java.util.Random的hook点:
jobs list
jobs kill 222843
紧接着我们执行如下指令对java.util.Random.nextInt方法进行hook:
android hooking watch class_method java.util.Random.nextInt --dump-args --dump-backtrace --dump-return
然后发送一个石头剪刀布的表情,可以看到cmd中触发的信息如下:
按照堆栈顺序,不难看出com.tencent.mm.sdk.platformtools.Util.getIntRandom方法为上层方法,根据函数名,可以推出该方法即为发送剪刀石头布的随机值传递方法,下方可以看到传递的参数为3,返回值为1,手机上发出的表情为石头,可以推测返回值1代表石头,再次发送返回值为none,手机上发出的表情为剪刀,可以推测返回值none代表剪刀,再次发送返回值为2,手机上发出的表情为布,可以推测返回值1代表布。
同样的方法我们可以得出从none到5为骰子点数从1到6,得到这样的结果后,我们应该考虑的是如何判断我们是点击了骰子的表情呢还是剪刀石头布,我们再往com.tencent.mm.sdk.platformtools.Util.getIntRandom方法的上层查看,下hook断点:
android hooking watch class_method com.tencent.mm.sdk.platformtools.Util.getIntRandom
发现提示找不到类,这里调试很久也没找到解决办法,但是光用frida可以hook到该方法(有时候能hook到,有时候又hook不到),这里就很奇怪,有大佬能明白的欢迎私信共同讨论。
如果此处走通,那么接下来便很容易了,写个frida脚本即可
最后,公众号试运营,欢迎关注公众号:恒运安全