转:http://www.freebuf.com/articles/terminal/146413.html

每次宅寝室一起点外卖谁下去拿都是个大问题,小编寝室一般选择微信色子谁小谁去拿,但是小编运气不太好 总是输,所以寻思着能不能每次都让色子是6点,皇天不负有心人,果然找到了方法。

准备工作

需要一台已经root并且安装了Hook神奇Xposed框架。在Hook过程中最重要的一点就是要找到Hook点这也是最难的部分。找到Hook点之后编写Xposed模块就比较简单了。

本次实验使用的weixin版本是6513.

猜想假设

我们先猜测微信摇色子是怎么实现的。如果有简单编程经验的朋友肯定会猜测是random函数。其实我也是这么猜的。

逆向分析

反编译apk

进行简单的准备工作:使用apktool反编译apk。使用Jadx打开微信的apk。微信较大,打开会比较慢。

找到色子对应控件的id

这一步可以借助AndroidSDK提供的一个工具:uiautomatorviewer.bat。可以看到下面的界面。

<img alt="1.png" src="http://image.3001.net/images/20170906/15046685806536.png!small" width="690" height="437"></p>

可以看到色子控件对应的id是cph。然后在public.xml中找到cph对应的值为0x7f100d28。

<img alt="2.png" src="http://image.3001.net/images/20170906/15046685944283.png!small" width="450" height="112"> </p>

最后用这个值去R类里面找到真正使用的名称为bfq

<img alt="3.png" src="http://image.3001.net/images/20170906/15046686135980.png!small" width="480" height="90"> </p>

查找Hook点

最难的部分就是查找hook点。在jadx中全局搜索bqf。显然这个findViewById()才是我们要找的东西,双击点进去看代码。如果有多个需要一个一个看。

<img alt="4.png" src="http://image.3001.net/images/20170906/15046686273903.png!small" width="690" height="288"> </p>

上下查看这个类包含的内容。可以知道这是一个baseAdapter类。但是getView方法中没有设置点击事件。

<img alt="5.png" src="http://image.3001.net/images/20170906/15046686382119.png!small" width="484" height="224"> </p>

<img alt="6.png" src="http://image.3001.net/images/20170906/15046686483855.png!small" width="300" height="118"> </p>

<img alt="7.png" src="http://image.3001.net/images/20170906/15046686678436.png!small" width="690" height="545"></p>

全局搜索调用这个函数的地方进行查找。

<img alt="8.png" src="http://image.3001.net/images/20170906/15046686995822.png!small" width="455" height="330"> </p>

<img alt="9.png" src="http://image.3001.net/images/20170906/15046687094424.png!small" width="690" height="431"> </p>

双击进入代码查看,看到是SmileyGrid类型的控件。查看SmileyGrid定义。

<img alt="10.png" src="http://image.3001.net/images/20170906/15046687225042.png!small" width="545" height="184"> </p>

对onItemClick中的方法一个一个分析,最后发现红框中才是我们要找的方法。

<img alt="11.png" src="http://image.3001.net/images/20170906/15046687448590.png!small" width="690" height="480"> </p>

查看a函数代码,可以看到最下面两个是toast,显然不是。接下来就需要对剩下的分支进行查看。

<img alt="12.png" src="http://image.3001.net/images/20170906/15046687617249.png!small" width="690" height="636"> </p>

查看之后我们知道是第一个也就是c c = ((com.tencent.mm.plugin.emoji.b.c) h.j(com.tencent.mm.plugin.emoji.b.c.class)).getEmojiMgr().c(cVar);

根据导入的包信息我们可以知道是com.tencent.mm.kernel.h并且类型是com.tencent.mm.plugin.emoji.b.c继续看这几处的代码进行分析。

<img alt="13.png" src="http://image.3001.net/images/20170906/15046687916467.png!small" width="438" height="56"> </p>

下面是h.j的代码,返回是j。

<img alt="14.png" src="http://image.3001.net/images/20170906/15046688025144.png!small" width="574" height="124"></p>

下面是emoji.b.c的代码,我们可以知道是一个接口。

<img alt="15.png" src="http://image.3001.net/images/20170906/1504668815913.png!small" width="373" height="230"> </p>

在做到这里的时候卡了好久没什么思路了,然后写了一个简单的xposed模块hook了com.tencent.mm.kernel.h的j函数看看返回的类型是什么。

<img alt="16.png" src="http://image.3001.net/images/20170906/15046685159574.png!small" width="690" height="120"> </p>

将模块装安装重启后,打开weixin清空logcat然后点击色子,看到了下面的输出,可以知道输入参数的类型是com.tencent.mm.plugin.emoji.b.c返回的类型是com.tencent.mm.plugin.emoji.PluginEmoji。然后看看PluginEmoji的代码。

<img alt="17.png" src="http://image.3001.net/images/20170906/15046684725471.png!small" width="464" height="45"> </p>

看到PluginEmoji包含了getEmojiMgr方法,重点看这个方法。

<img alt="18.png" src="http://image.3001.net/images/20170906/15046688328600.png!small" width="248" height="219"> </p>

<img alt="19.png" src="http://image.3001.net/images/20170906/15046688467336.png!small" width="468" height="158"> </p>

有了前面的经验,这里就在前面的那个模块也hook了这个方法看看返回的具体是什么。点击之后在上面的提示出现了另一行。返回的具体是com.tencent.mm.plugin.emoji.e.g再去看emoji.e.g的代码。

<img alt="20.png" src="http://image.3001.net/images/20170906/15046688569714.png!small" width="690" height="92"></p>

<img alt="21.png" src="http://image.3001.net/images/20170906/15046688644278.png!small" width="465" height="57"> </p>

重点当然是分析emoji.e.g的c方法。代码如下。通过yH.movToPosition(dM)知道dM才是关键,继续追踪bf.dM的代码。通过导入的包可以知道来自com.tencent.mm.sdk.platformtools.bf。

<img alt="22.png" src="http://image.3001.net/images/20170906/15046688753733.png!small" width="690" height="161"> </p>

<img alt="23.png" src="http://image.3001.net/images/20170906/15046688855403.png!small" width="341" height="53"> </p>

看到这个Random函数还真是有点小激动啊。估摸应该是这里了。同样hook看一下输入参数和返回的参数是什么。

<img alt="24.png" src="http://image.3001.net/images/20170906/15046689003007.png!small" width="667" height="121"> </p>

<img alt="25.png" src="http://image.3001.net/images/20170906/15046689089847.png!small" width="690" height="173"></p>

输入的参数都是5和0,输出的正好和点数相对应,3对应4点,1对应2点,1对应0点.

<img alt="26.png" src="http://image.3001.net/images/20170906/15046689161241.png!small" width="339" height="122"></p>

<img alt="27.png" src="http://image.3001.net/images/20170906/1504668929651.png!small" width="690" height="1200"></p>

编写模块

找到随机数的返回点,接下来写hook模块就简单了。还有一点要注意的是,石头剪刀布也是用的这个随机函数。所以写的时候要注意一下。

<img alt="28.png" src="http://image.3001.net/images/20170906/15046689397007.png!small" width="690" height="214"> </p>

最后体验一下效果如何。

<img alt="29.png" src="http://image.3001.net/images/20170906/15046689482485.png!small" width="690" height="1200"></p>

这下终于不用拿外卖了。

总结

1. 找id:对于控件的点击事件可以用uiautomatorviewer定位到控件的id,然后通过public.xml和R类找到真正使用的类名和十六进制id。

2. 定位到关键代码:接下来最难的就是定位到关键代码,通常要花很多时间,多练习能够提高速度。

3. 编写xposed模块:找到关键函数以后,编写模块就比较简单了。有些app有分包的时候要注意一下。

<img alt="1.png" src="http://image.3001.net/images/20170906/15046685806536.png!small" width="690" height="437"></p>
<img alt="2.png" src="http://image.3001.net/images/20170906/15046685944283.png!small" width="450" height="112"> </p>
<img alt="3.png" src="http://image.3001.net/images/20170906/15046686135980.png!small" width="480" height="90"> </p>

<img alt="4.png" src="http://image.3001.net/images/20170906/15046686273903.png!small" width="690" height="288"> </p>
<img alt="5.png" src="http://image.3001.net/images/20170906/15046686382119.png!small" width="484" height="224"> </p>
<img alt="6.png" src="http://image.3001.net/images/20170906/15046686483855.png!small" width="300" height="118"> </p>
<img alt="7.png" src="http://image.3001.net/images/20170906/15046686678436.png!small" width="690" height="545"></p>
<img alt="8.png" src="http://image.3001.net/images/20170906/15046686995822.png!small" width="455" height="330"> </p>
<img alt="9.png" src="http://image.3001.net/images/20170906/15046687094424.png!small" width="690" height="431"> </p>
<img alt="10.png" src="http://image.3001.net/images/20170906/15046687225042.png!small" width="545" height="184"> </p>
<img alt="11.png" src="http://image.3001.net/images/20170906/15046687448590.png!small" width="690" height="480"> </p>
<img alt="12.png" src="http://image.3001.net/images/20170906/15046687617249.png!small" width="690" height="636"> </p>
<img alt="13.png" src="http://image.3001.net/images/20170906/15046687916467.png!small" width="438" height="56"> </p>
<img alt="14.png" src="http://image.3001.net/images/20170906/15046688025144.png!small" width="574" height="124"></p>
<img alt="15.png" src="http://image.3001.net/images/20170906/1504668815913.png!small" width="373" height="230"> </p>
<img alt="16.png" src="http://image.3001.net/images/20170906/15046685159574.png!small" width="690" height="120"> </p>
<img alt="17.png" src="http://image.3001.net/images/20170906/15046684725471.png!small" width="464" height="45"> </p>
<img alt="18.png" src="http://image.3001.net/images/20170906/15046688328600.png!small" width="248" height="219"> </p>
<img alt="19.png" src="http://image.3001.net/images/20170906/15046688467336.png!small" width="468" height="158"> </p>
<img alt="20.png" src="http://image.3001.net/images/20170906/15046688569714.png!small" width="690" height="92"></p>
<img alt="21.png" src="http://image.3001.net/images/20170906/15046688644278.png!small" width="465" height="57"> </p>
<img alt="22.png" src="http://image.3001.net/images/20170906/15046688753733.png!small" width="690" height="161"> </p>
<img alt="23.png" src="http://image.3001.net/images/20170906/15046688855403.png!small" width="341" height="53"> </p>

<img alt="24.png" src="http://image.3001.net/images/20170906/15046689003007.png!small" width="667" height="121"> </p>
<img alt="25.png" src="http://image.3001.net/images/20170906/15046689089847.png!small" width="690" height="173"></p>
<img alt="26.png" src="http://image.3001.net/images/20170906/15046689161241.png!small" width="339" height="122"></p>
<img alt="27.png" src="http://image.3001.net/images/20170906/1504668929651.png!small" width="690" height="1200"></p>

<img alt="28.png" src="http://image.3001.net/images/20170906/15046689397007.png!small" width="690" height="214"> </p>

<img alt="29.png" src="http://image.3001.net/images/20170906/15046689482485.png!small" width="690" height="1200"></p>

如何让微信丢骰子永远只出“666”相关推荐

  1. 概率论的学习和整理--番外7:简单的丢骰子 和 抽黑球白球问题,对比不同概率模型求解的差别。

    前言:通过题目去理解概率知识 刷题的意义 虽然说刷题不好,但是不会做题肯定也不对 理论学了一箩筐,但是不会做题,说明不会应用模型,对模型的条件,应用环境,背后的逻辑理解的不深 刷题的局限性 不要记这个 ...

  2. 微信群流量池构建出不为人知的“商业帝国”

    线上平台层出不穷,大家都知道做互联网生意最重要的是流量,都明白得流量者得天下.但是有很多人都为了如何引流头疼无比,这两年,微信端的巨大流量让所有人都心动,日活跃用户据说最高的时候达到8亿.然而中国才1 ...

  3. Frida HOOK微信实现骰子作弊

    由于微信摇骰子的功能在本地进行随机后在发送,所以存在可以hook掉判断骰子数的方法进行修改作弊. 1.frida实现hook java层函数 1)写个用来测试的demo,当我们点击按钮的时候会弹出窗口 ...

  4. 最新猜骰子玩法源码分享+微信猜骰子源码下载

    模拟算法是用随机函数来模拟自然界中发生的不可预测的情况,C语言中是用srand()和rand()函数来生成随机数. 先来介绍一下随机数的生成: 1.产生不定范围的随机数 函数原型:int rand() ...

  5. TEMPO研究第一年影像学数据: 骨侵蚀修复几乎只出现在无关节肿胀或肿胀改善组...

    标签: TEMPO研究; 依那西普; 放射学进展; 类风湿关节炎 TEMPO研究第一年影像学数据: 骨侵蚀修复几乎只出现在无关节肿胀或肿胀改善组 EULAR2007. Abstract No: OP0 ...

  6. php手机网站底部导航代码,jQuery微信手机端底部弹出导航菜单列表代码

    jQuery微信手机端底部弹出导航菜单列表代码 jQuery微信手机端底部弹出导航菜单列表代码是一款网页底部点击按钮弹出浮动的图标菜单列表的手机特效. js代码 function showList() ...

  7. PHP微信公众号支付弹出“NaN:undefined”解决方法

    PHP微信公众号支付弹出"NaN:undefined"解决方法 参考文章: (1)PHP微信公众号支付弹出"NaN:undefined"解决方法 (2)http ...

  8. android微信点赞ui,Android中使用PopupWindow 仿微信点赞和评论弹出

    微信朋友圈的点赞和评论功能,有2个组成部分:左下角的"更多"按钮:点击该按钮后弹出的对话框: PopupWindow,弹出框使用PopupWindow实现,这是点赞和评论的载体,具 ...

  9. 微信服务器 移动信号,微信消息延迟,只需更改手机这5个设置,效果“立竿见影”...

    随着移动互联网的发展和科学技术的进步,微信作为一种生活交往工具,迅速的成为人们信息交往重要的平台,如同张小龙所说,在用户一天中的任何一个阶段,都会与微信进行接触,这就是微信的生活方式. 经过这几年的发 ...

最新文章

  1. spring jdbcTemplate使用queryForList示例
  2. jar打包 剔除第三方依赖以及它的依赖_面试官:为什么Spring Boot的jar可以直接运行?...
  3. 482. 密钥格式化
  4. php array colum,php5.5新数组函数array_column使用
  5. 一起谈.NET技术,HubbleDotNet 和 Lucene.Net 匹配相关度的比较
  6. MySql-流程函数
  7. 项目启动后去除项目标题,去除时间与状态栏Android
  8. bzoj 3119: Book(构造)
  9. Buddy分配器之释放一页
  10. java indexof 参数_Java indexOf() 方法
  11. 嵌入式Linux培训开发
  12. Android MMKV框架引入使用
  13. 树莓派硬件编程——(一)用RPi.GPIO库输出信号
  14. 能不用事务就尽量别用
  15. kbhit linux windows通用,_kbhit() for Linux
  16. 算法原理系列:红黑树
  17. 掌阅群分享技术点收集(app性能优化专攻)
  18. 03. 交换机的Telnet远程登陆配置
  19. html实现鼠div的旋转,鼠标悬浮到div上,div进行360°旋转
  20. 快播“洗白”,难道要抛弃用户?

热门文章

  1. 人工智能:声纹相关基础概念介绍
  2. 声纹识别之I-Vector
  3. 「 机器人学 」“里程计/仪技术”浅谈
  4. error C2059: 语法错误:“,”
  5. 幸福公开课字幕 中英文全
  6. java复杂逻辑如何设计_javabean如何实现复杂的业务逻辑
  7. 解决java虚拟机内存不足的错误 java.lang.OutOfMemoryError: PermGen space 没有文件TOMCAT_HOME/bin/catalina.sh
  8. axp202电源管理
  9. 去外包公司的伙伴们小心了!——亲身经历,数数外包公司的坑
  10. python int() round() floor()函数的比较