# 手把手教你当微信运动第一名 – 利用Android Hook进行微信运动作弊

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-09-06T02:29:00Z
Canonical: https://wepostx.com/topics/1016

> 乌云历史资料归档
>
> **原始作者：** 蒸米
> **原始编号：** superkieran-wooyundrops:743
> **原始发布时间：** 2015-09-06 10:29
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 序

随着带协处理器和买手环的人越来越多，微信运动一下子火了，只要你在微信关注微信运动，手机就能自动记录你每天行走的步数，还可以跟朋友圈里的好友PK运动量。并且每日排名第一的用户可以占据当日排行榜的封面。这充分激起了大家的求胜的欲望，于是出现了很多励志的和悲伤的故事……

![原文图片](/media/2016/06/c699e2f6d5cbb3751fb021e6047d2605)

![原文图片](/media/2016/06/ca88c0687f1cf8bbcfd4c2f4a8a84496)

# 0x01微信运动作弊大法

其实想要拿第一没有那么麻烦，只要会一点Android的Hook知识，就可以轻松冲到排行榜第一名。接下来我就手把手教你如何变成第一。
首先我们需要一台带协处理的root后的android机器，比如说nexus 5。然后我们装上作弊用的XPosed Hook框架和作弊插件。这两个apk可以在我的github上下载到。
[https://github.com/zhengmin1989/WechatSportCheat](https://github.com/zhengmin1989/WechatSportCheat)
下载完后，先安装XPosed.apk。接着打开Xposed，选择“安装/更新”，然后根据提示重启手机。

![原文图片](/media/2016/06/b39bd4049682483255d8f0282e6b5a3e)

重启完后，再安装xposedwechat.apk插件。然后打开Xposed的模块界面，会看到xposedwechat这个插件。我们在这里将它选中，然后再根据提示重启手机。

![原文图片](/media/2016/06/d97ea0b94b057981d4a3d49060d2f4a7)

接下来就是见证奇迹的时刻…你随意走两步，然后打开微信运动，咦，怎么就多了1000步？再随便走几步，咦，怎么又多了1000步？… demo视频如下：

仅仅刷步数还是不够过瘾吧？微信运动还推出了益行家活动，可以用每天的步数换取爱心捐款。有了微信运动作弊大法，我们可以每天在家随便走几步然后换取爱心捐款（如图所示）。

![原文图片](/media/2016/06/856c944a5ad14bb79817ff4ae6c77351)

# 0x02 微信运动作弊原理

我们是如何作弊的呢？简单来说，当微信运动想要知道我们走了多少步的时候，微信app会询问android系统的计数传感器，随后计数传感器会返回我们行走的步数。因此，如果我们能够拦截微信运动和计数传感器之间的对话，然后伪造一个步数传递给微信运动就可以达到我们想要的作弊效果。
具体怎么做呢？首先我们可以用Xposed框架来hook计数传感器的队列函数dispatchSensorEvent()，这个函数在 android.hardware.SystemSensorManager$SensorEventQueue这个类中。随后在微信运动每次询问行走步数的时候，我们先获取当前步数，然后在目前的步数的基础上加1000步，然后将信息返回给微信运动。微信运动就会误以为我们运动了1000步，从而达到了欺骗的效果。
关键代码如下：
首先hook android.hardware.SystemSensorManager$SensorEventQueue这个类的dispatchSensorEvent()函数：

```text
final Class<?> sensorEL = findClass("android.hardware.SystemSensorManager$SensorEventQueue",lpparam.classLoader); XposedBridge.hookAllMethods(sensorEL, "dispatchSensorEvent", new XC_MethodHook()
```
接着我们在记步传感器把步数信息返回给微信运动之前，将返回的步数加上1000步：

```text
protected void beforeHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log(" mzheng Hooked method: " + param.method); ((float[]) param.args[1])[0]=((float[]) param.args[1])[0]+1000*WechatStepCount; WechatStepCount+=1; …
```
另外我们还可以使用一些传感器的接口获取一些数据的信息：

```text
Sensor ss = ((SparseArray<Sensor>) field.get(0)).get(handle); XposedBridge.log(" SensorEvent: sensor=" + ss);
```

![原文图片](/media/2016/06/cad42871fda4b7b1383694bb07a7df5c)

比如说x就代表开机以来行走的步数，timestamp是获取步数时候的时间戳等。
另外，我们不仅在android上可以hook计步器，在iOS上也是可以通过越狱后hook iHealth的API接口达到同样的作弊效果，有兴趣的同学可以继续研究。

![原文图片](/media/2016/06/5c35d68063833b6f88dfb495f519c721)

![原文图片](/media/2016/06/e6ace7e03d424479045ca70ad2f1dbe5)

# 0x03微信运动反作弊建议

如何防止这种作弊发生呢？我的第一个建议是加强服务器端的逻辑检测功能。比如说一个人是不可能十分钟内走一万步的，如果他做到了，那么他一定是在作弊。 我的第二个建议是增加对hook的检测功能。虽然微信运动作下弊无非就是满足一下大家争强好胜的虚荣心，并不会对大家的隐私和财产产生损失。但是既然微信运动可以被hook，同样也意味着语音聊天，微信支付等功能也是可以被hook的，当黑客利用hook技术对你的隐私和财产产生危害的时候可就不是那么好玩的事了。之前我们在Hacking Team事件中也亲眼目睹了利用hook技术来获取微信语音消息的android木马，所以一定要增加针对hook的检测才行。

# 0x04 总结

此文只是介绍了Android Hook的简单场景应用，关于Android Hook的原理以及更多的利用方式，比如说调试，关键API拦截，外挂等技巧，敬请期待WooYun Book系列的文章《安卓动态调试七种武器之离别钩 - Hooking》。 https://github.com/zhengmin1989/TheSevenWeapons

# 0x05 参考文章

- [Android.Hook框架xposed篇(Http流量监控)](http://drops.wooyun.org/tips/7488)

- [人手一份核武器 - Hacking Team 泄露（开源）资料导览手册](http://drops.wooyun.org/news/6977)

## Replies
