抱歉,Xposed真的可以为所欲为——4

本文讲述了作者逆向微信应用,通过Jadx工具反编译DEX文件,查找Math.random()和newRandom()生成随机数的方法,最终确定随机数生成逻辑的过程。作者还分享了如何使用Xposed进行代码Hook以验证猜想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于这节,我是看代码看到头皮发麻,逆向APP并没有想想中的简单, 特别是微信这种,要投入的学习成本好高…而且最近事比较多,怕是 要断更一会儿了,后续闲下来再去研究吧,折腾本节这个简单的东西, 我花了差不多两天,反编译apk,看smail代码,ddms轨迹跟踪方法调用: 打开DDMS选择自己微信进程:com.tencent.mm,点击下这个箭头的图标

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

弹出个是否跟中的对话框,选中,接着就可以开始跟踪了,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

界面上点击下发送猜拳的表情,等随机的结果定格之后再按一次,停止跟踪。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后find输入搜索的关键字,比如我试过: click,emoji,gif等,一直试一直试,昨天试了一天,并没有得出个所以 然来,心情巨差…今天下午突发奇想,从另外一个角度去取巧,人品不错 折腾个所以然来了。

Java中的产生随机数的方法基本都是两种:

  • Math.random()
  • new Random()

可以以这个为突破点试试,利用Jadx把dex文件转换为java文件


1.Jadx把dex文件转换为java文件

官方地址github.com/skylot/jadx

下载编译源码(最后一步,windows下直接运行gradlew.bat):

git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist

等编译完就能用了,cd到build/jadx/bin目录下,你可以使用下述 两个命令,反编译源码(out是输出文件夹,可自己修改)或者直接查看

jadx -d out xxx.apk
jadx-gui xxx.apk

接着呢,普通的APK可以这样整,但是呢,如果微信apk这样搞,那就恭喜你了 过一会儿就卡死了…我的操作是直接解压的apk,然后把里面六个.dex文件 依次调用jadx -d xxx xxx.dex这样,分别反编译到不同的文件夹,最后 放到一个文件夹里

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再接着使用as打开。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再接着就要进行分析了。


2.随缘分析

上面讲了,随机基本就那两种套路,ctrl + shift + f 全局搜索 Math.random\( 这里用了正则~

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

18个,不算太多,一个个打开猜测一波:

  • 第1个,排除了,生成0到100的整数,而且这里有个Xfermode东西,猜测是进度条渐进加载的东西。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接着好几个看名知意的(最喜欢这种了~)

  • 第2个,updater排除
  • 第3个,mapsdk排除
  • 第4,5个,offline排除
  • 第7个,*一个这样的数字,不是正常的值…排除
  • 第8个,ShakeEggAnimFrame,直译,摇蛋动画Frame,猜测是摇一摇那个页面的东西…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 第9,10,11,因为名字关系,同样排除。
  • 第12个,ChattingAnimFrame,名字有点感觉,聊天动画Frame,方法也有点像,待定。
  • 第13,14 进去看看就知道不是了
  • 第15,16个,点进去看到包名,luckmoney,跟发红包相关的,排除;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 第17个,mapsdk包名,应该和腾讯地图有关,排除
  • 第18个,BallonImageView,Ballon翻译毛玻璃,排除。

到此就可能第12个,ChattingAnimFrame 有一定可能是,mark先。

接着全局搜:= new Random\(\),33个,不算多,也不算少, 排除法一一排除,包名,类名,里面的注释,随机是否合理等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

限于篇幅,就不一一列举了,最后定义到这个类:bh.java,然后这个类 里有3个包含Random,依次排除,第一个字符拼接的,肯定不是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二个,方法里不加具体整数的话,返回的会是一个随机的整数,排除

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么就剩下第三个了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

综上,随机生成结果的可能就是上面两个地方了。

再接着,再考虑一个问题,猜拳就三种情况,石头剪刀布,这个随机值, 大部分开发都会用0,1,2这样的表示,当然你说float了,再做下向上或者 向下取整,maybe?不过感觉这样的小功能还做取整就有点繁琐了,so, 先试试第二个地方吧。接下来编写一波xposed代码,Hook掉这个方法, 试试Log把这个方法的参数和返回结果都打印出来,如果投骰子的时候 回调了,证明我们的猜想没错。


3.代码试错

简单的Hook下这个方法,然后把参数和结果都打印出来,最担心的是这个 方法没调用…怀着忐忑的心情安装重启

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击猜拳,在看到logcat打印出来的日志后,我不禁泪流满面,这两天的 折腾没有白费,哭哭!!!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

试了几次,终于把剪刀石头步都集齐了!!!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一个参数是固定值2,第二个参数也是固定值0,第三个参数是0,1,2 分别代表:剪刀,石头,布,清理下日志,看看骰子是不是也会调用这 个方法?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

日志如我们预想的输出了,棒!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一个参数是固定的5,第二个是固定的0,第三个参数从0-5,依次对应 骰子的1-6,嗯,反编译的Java代码:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看到这,基本就一清二楚了,利用nextInt()方法,随机生成一个特定范围里 的整数,比如想生成2-10的整数,第一个参数为10,第二个参数为2, 接着nextInt(10-2) + 1= 9,即生成0-9之间(不包括8)的一个整数,接着+1, 范围变成了从0-9,接着在加上2,此时就变成2-11的值。 前面的Assert是断言,如果第二个参数大于第一个参数抛出异常!

到此就弄得明明白白了,接下来改下界面,整理下代码,运行下~


4.运行试试


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接着测试下:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
Android进阶视频+面试资料部分截图

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

的工作,也节省大家在网上搜索资料的时间来学习。
[外链图片转存中…(img-E2tGeX8V-1713623030426)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值