引言
关于这节,反编译apk,看smail代码,ddms轨迹跟踪方法调用: 打开DDMS选择自己微信进程:com.tencent.mm,点击下这个箭头的图标
弹出个是否跟中的对话框,选中,接着就可以开始跟踪了,
界面上点击下发送猜拳的表情,等随机的结果定格之后再按一次,停止跟踪。
然后find输入搜索的关键字,比如我试过: click,emoji,gif等,一直试一直试,昨天试了一天,并没有得出个所以 然来,心情巨差...今天下午突发奇想,从另外一个角度去取巧,人品不错 折腾个所以然来了。
Java中的产生随机数的方法基本都是两种:
- Math.random()
- new Random()
可以以这个为突破点试试,利用Jadx把dex文件转换为java文件。
1.Jadx把dex文件转换为java文件
下载编译源码(最后一步,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把这个方法的参数和返回结果都打印出来,如果投骰子的时候 回调了,证明我们的猜想没错。