Loading... > 本文基于Android 微信 8.0.3 最近开始做一些软件的逆向学习,记录一下。 本文为微信系列的第一篇,对掷骰子和猜拳功能的分析。 掷骰子和猜拳都会出现随机的结果,所以猜测,应该是通过随机数实现的,后期发现实际上也是如此。 ## 1、 寻找hook点 Java Random类对应的类名为java.util.Random,使用objection对其进行watching: ![2022-05-21T17:04:58.png][1] 发送骰子的表情,发现Random的以下方法被调用: ![2022-05-21T17:05:23.png][2] 对java.util.Random.nextInt进行watch,再次掷骰子,dump出调用栈、参数和返回值: ![2022-05-21T17:05:39.png][3] > nextInt(n) :在方法调用返回介于0(含)和n(不含)伪随机,均匀分布的int值。 nextInt的参数为6,返回值为1,掷骰子的结果为2。 其实此处也可以作为hook点,但是不够细致。需要hook的点仅仅是掷骰子和猜拳,直接hook Java工具类的随机数方法,还是比较粗暴。 上溯调用栈,getIntRandom是tencent sdk中的方法,很明显的一个生成随机数的方法。 继续向上,om.tencent.mm.plugin.emoji.e.f.o ,watch一波这两个方法,看看能得到什么额外的信息。 ```shell android hooking watch class_method com.tencent.mm.sdk.platformtools.Util.getIntRandom --dump-args --dump-return android hooking watch class_method com.tencent.mm.plugin.emoji.e.f.o --dump-args --dump-return ``` 再次掷骰子,这次的结果为5点。 e.f.o方法的参数为: ![2022-05-21T17:06:30.png][4] 返回值为: ![2022-05-21T17:06:47.png][5] 从这个方法的参数和返回值可以推断出,dice.png是掷骰子的图片,dice_5.png是5点的骰子。 ![2022-05-21T17:07:14.png][6] 在本次调用过程中:图片可以看出,getIntRandom得到的随机数“0-5”,对应掷骰子结果的点数“1-6” --- 接下来,看了一下猜拳的逻辑,和掷骰子一致。 1.field_name为 ‘jsb.png’,也就是剪刀石头布的拼音首字母: ![2022-05-21T17:07:35.png][7] 2、getIntRandom的参数为2,获取[0,2]的int随机数: ![2022-05-21T17:07:51.png][8] 3、返回值中的field_name为jsb_b.png,和猜拳的结果"布"一致。 ![2022-05-21T17:08:19.png][9] ![2022-05-21T17:07:58.png][10] 分析到这里,在利用过程中可以根据e.f.o的参数来判断当前要获取随机数的是什么表情(猜拳 OR 掷骰子),然后hook 并修改getIntRandom的返回值,来得到想要的结果。 总结一下,可以用来hook的点: ```shell com.tencent.mm.plugin.emoji.e.f.o(com.tencent.mm.storage.emotion.EmojiInfo) com.tencent.mm.sdk.platformtools.Util.getIntRandom(int,int) ``` ## 2、编写Frida script 设定:猜拳只出剪刀,掷骰子只出6点。 编写frida脚本: ```js function main() { Java.perform(function () { Java.openClassFile("/data/local/tmp/r0gson.dex").load(); const gson = Java.use('com.r0ysue.gson.Gson') var jsb = 0 // 只出剪刀 var dice = 5 // 只出6点 var efo = Java.use('com.tencent.mm.plugin.emoji.e.f') efo.o.implementation = function (x) { var xstr = gson.$new().toJson(x) if (xstr.search('dice.png') != -1) { console.log('正在掷骰子') hookIntRandom(dice) } else if (xstr.search('jsb.png') != -1) { console.log("正在猜拳") hookIntRandom(jsb) } var res = this.o(x) return res } }) } function hookIntRandom(a) { Java.perform(function () { var util = Java.use('com.tencent.mm.sdk.platformtools.Util') util.getIntRandom.implementation = function (int1, int2) { var res = this.getIntRandom(int1, int2) return a } }) } setImmediate(main) ``` 注:脚本中使用了肉丝的Gson来打印对象,不得不说,好使。 ![2022-05-21T17:09:47.png][11] ## 3、参考资料 参考资料 Frida打印[object]解决Gson包重名的问题 - https://bbs.pediy.com/thread-259186.htm [1]: https://reao.io/usr/uploads/2022/05/597536837.png [2]: https://reao.io/usr/uploads/2022/05/525971177.png [3]: https://reao.io/usr/uploads/2022/05/2361824389.png [4]: https://reao.io/usr/uploads/2022/05/3359460909.png [5]: https://reao.io/usr/uploads/2022/05/3077918982.png [6]: https://reao.io/usr/uploads/2022/05/4023274478.png [7]: https://reao.io/usr/uploads/2022/05/2899604050.png [8]: https://reao.io/usr/uploads/2022/05/3366450713.png [9]: https://reao.io/usr/uploads/2022/05/516045524.png [10]: https://reao.io/usr/uploads/2022/05/1590903390.png [11]: https://reao.io/usr/uploads/2022/05/1993472354.png 最后修改:2022 年 06 月 12 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏