xposed 修改参数_抱歉,Xposed真的可以为所欲为4.猜拳投骰子你能赢算我输

一句话概括本文

人品大法利用Xposed Hook掉微信猜拳和投骰子,让你无需再担忧拿外卖和搞卫生。

引言

关于这节,我是看代码看到头皮发麻,逆向APP并没有想想中的简单,

特别是微信这种,要投入的学习成本好高…而且最近事比较多,怕是

要断更一会儿了,后续闲下来再去研究吧,折腾本节这个简单的东西,

我花了差不多两天,反编译apk,看smail代码,ddms轨迹跟踪方法调用:

打开DDMS选择自己微信进程:com.tencent.mm,点击下这个箭头的图标

6ac5a2aa639e2669f8e7231b2898aa86.png

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

494ce75f6157d46677277ff1bae48466.png

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

42444953e3606b42bd64d5762a9fa724.png

然后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.gitcd jadx./gradlew dist

等编译完就能用了,cd到build/jadx/bin目录下,你可以使用下述

两个命令,反编译源码(out是输出文件夹,可自己修改)或者直接查看

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

接着呢,普通的APK可以这样整,但是呢,如果微信apk这样搞,那就恭喜你了

过一会儿就卡死了…我的操作是直接解压的apk,然后把里面六个.dex文件

依次调用jadx -d xxx xxx.dex这样,分别反编译到不同的文件夹,最后

放到一个文件夹里

479f5c08a3bd5cd656bbdb94771bd37c.png

再接着使用as打开。

204bbd69886c09226df6363c8a5e4426.png

再接着就要进行分析了。

2.随缘分析

上面讲了,随机基本就那两种套路,ctrl + shift + f 全局搜索 Math.random(

这里用了正则~

c38b3f1a2112d7247020ed9b0f67ff16.png

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

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

ed5d2bc9c991be5caa6cb74030743f9a.png

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

第2个,updater排除

第3个,mapsdk排除

第4,5个,offline排除

第7个,*一个这样的数字,不是正常的值…排除

第8个,ShakeEggAnimFrame,直译,摇蛋动画Frame,猜测是摇一摇那个页面的东西..

094c705267194e15a8cc34ea8a564560.png

第9,10,11,因为名字关系,同样排除。

第12个,ChattingAnimFrame,名字有点感觉,聊天动画Frame,方法也有点像,待定。

第13,14 进去看看就知道不是了

第15,16个,点进去看到包名,luckmoney,跟发红包相关的,排除;

9620f34bee01e5fbba1a74207b99bede.png

第17个,mapsdk包名,应该和腾讯地图有关,排除

第18个,BallonImageView,Ballon翻译毛玻璃,排除。

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

接着全局搜:= new Random(),33个,不算多,也不算少,

排除法一一排除,包名,类名,里面的注释,随机是否合理等。

c0789f719977433b2cf64e379fc1dc1c.png

限于篇幅,就不一一列举了,最后定义到这个类:bh.java,然后这个类

里有3个包含Random,依次排除,第一个字符拼接的,肯定不是:

7bf50e29c15516840efe0e70ca7457c2.png

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

71d6f7be4042158bfe087f79edbfd32d.png

那么就剩下第三个了:

9a26f9f3a1dee13d08b6dc125b7c5304.png

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

再接着,再考虑一个问题,猜拳就三种情况,石头剪刀布,这个随机值,

大部分开发都会用0,1,2这样的表示,当然你说float了,再做下向上或者

向下取整,maybe?不过感觉这样的小功能还做取整就有点繁琐了,so,

先试试第二个地方吧。接下来编写一波xposed代码,Hook掉这个方法,

试试Log把这个方法的参数和返回结果都打印出来,如果投骰子的时候

回调了,证明我们的猜想没错。

3.代码试错

简单的Hook下这个方法,然后把参数和结果都打印出来,最担心的是这个

方法没调用…怀着忐忑的心情安装重启

995a20058eb3ecfdf257a8202ecbf4c3.png

点击猜拳,在看到logcat打印出来的日志后,我不禁泪流满面,这两天的

折腾没有白费,哭哭!!!

8fa26766e7b2651d43e70c6b1c65c4c8.png

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

7a0f9f60ad3409f2a596b1216d37c128.png

第一个参数是固定值2,第二个参数也是固定值0,第三个参数是0,1,2

分别代表:剪刀,石头,布,清理下日志,看看骰子是不是也会调用这

个方法?

287eac18ddcd4b9a48cf95358f6a2819.png

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

2883aa6a6ab9f76019ea84b5e8841dcb.png

第一个参数是固定的5,第二个是固定的0,第三个参数从0-5,依次对应

骰子的1-6,嗯,反编译的Java代码:

232b83b973f983f4d98b3a197325507c.png

看到这,基本就一清二楚了,利用nextInt()方法,随机生成一个特定范围里

的整数,比如想生成2-10的整数,第一个参数为10,第二个参数为2,

接着nextInt(10-2) + 1= 9,即生成0-9之间(不包括8)的一个整数,接着+1,

范围变成了从0-9,接着在加上2,此时就变成2-11的值。

前面的Assert是断言,如果第二个参数大于第一个参数抛出异常!

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

4.运行试试

7acf8ec41661912b7862d72ec7f6e2a6.png

接着测试下:

d67b266a6f8b6734a1504257765b6df8.png

没什么毛病,接着找个小姐姐玩一下~

5.顺带调戏下UI小姐姐

抱歉,小开发仔真的可以为所欲为,顺道用这个模块调戏了一下公司的UI小姐姐

场景是这样的:猜拳输的吃辣花生的士力架,后面因为怀疑我开挂,就投骰子

结果肯定是稳赢啊。套路别人先出就好,偶尔平局,让对方没那么怀疑,实在不信

的可以录一波屏

调戏过程:

f75c079d59486dca9500e3e5cda8417c.png

小结

本节Hook了以下表情里的猜拳和投骰子表情,可以随机出你想要的,

Hook的过程也是头皮发麻,APP逆向真是门技术活,还有耐心,细心,

至少我跟了两天,眼睛都花了,…而且有很多工具还没去尝试,自己瞎

整心累,可能是我一开始就直接拿微信这种大项目来开刀,所以挫败感

满满吧,So,暂时弃坑,哪天突然想整再回来更新吧~抱歉

附:Hook部分代码:

                val c2 = XposedHelpers.findClass("com.tencent.mm.sdk.platformtools.bh",lpparam.classLoader)                XposedHelpers.findAndHookMethod(c2, "eE", Int::class.java, Int::class.java, object : XC_MethodHook() {                    @Throws                    override fun afterHookedMethod(param: MethodHookParam) {                        xsp.reload()                        when(param.args[0]) {                            2 -> {                                if(xsp.getBoolean(Constants.IS_CQ_OPEN, false)) {                                    val cq = xsp.getInt(Constants.CUR_CQ_NUM, 0)                                        param.result = cq                                }                            }                            5 -> {                                if(xsp.getBoolean(Constants.IS_TZ_OPEN, false)) {                                    val tz = xsp.getInt(Constants.CUR_TZ_NUM, 0)                                        param.result = tz                                }                            }                        }                        Log.e("TTZ", "" + param.args[0] + "~" + param.args[1] + "~" +param.result)                        super.afterHookedMethod(param)                    }

————————————————

版权声明:本文为CSDN博主「coder-pig」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/coder_pig/article/details/80173216

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值