您的位置:首页 > 移动开发 > 微信开发

基于Xposed修改微信运动步数

2017-06-11 20:05 190 查看
前言:Zygote 是 Android 的核心,每打开一个 app,Zygote 就会 fork 一个虚拟机实例来运行 app,基于Xposed我们可以使用android hook技术对APK中的方法进行调试、关键API拦截、外挂等。

这篇文章建立在Xposed模块开发的基础之上,没有开发过Xposed模块的请先看这篇入门教程《Xposed模块开发入门教程》

一、微信运动修改步数原理

当点击微信运动排行榜的时候微信APP会获取手机上计数传感器的数值,然后传感器会返回我们行走的步数。此时我们使用Xposed框架来hook计数传感器的队列函数dispatchSensorEvent(),该函数在android.hardware.SystemSensorManager$SensorEventQueue这个类中。当询问传感器的时候我们在数值上加上相应步数返回给微信运动达到欺骗效果。

二、开发Xposed模块

1.新建一个类WeixinSport,具体代码如下:

[java] view plain copy

package com.example.administrator.weixinsport;

import static de.robv.android.xposed.XposedHelpers.findClass;

import java.lang.reflect.Field;

import android.hardware.Sensor;

import android.util.SparseArray;

import de.robv.android.xposed.IXposedHookLoadPackage;

import de.robv.android.xposed.XC_MethodHook;

import de.robv.android.xposed.XposedBridge;

import de.robv.android.xposed.callbacks.XC_LoadPackage;

/**

* Created by Administrator on 2016/5/11.

*/

public class WeixinSport implements IXposedHookLoadPackage {

private static int stepCount = 1;

@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

// filter
if (!loadPackageParam.packageName.equals("com.tencent.mm")) {
return;
}

final Class<?> sensorEL = findClass("android.hardware.SystemSensorManager$SensorEventQueue", loadPackageParam.classLoader);

XposedBridge.hookAllMethods(sensorEL, "dispatchSensorEvent", new XC_MethodHook() {

@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
((float[]) param.args[1])[0] = ((float[]) param.args[1])[0] + 1168 * stepCount;
stepCount++;

Field field = param.thisObject.getClass().getEnclosingClass().getDeclaredField("sHandleToSensor");
field.setAccessible(true);

int handle = (Integer) param.args[0];
Sensor sensor = ((SparseArray<Sensor>) field.get(0)).get(handle);
XposedBridge.log("sensor = " + sensor);
}
});
}


}

这段代码中我们首先通过equals(“com.tencent.mm”)过滤出了来自微信的请求:

[java] view plain copy

if (!loadPackageParam.packageName.equals(“com.tencent.mm”)) {

return;

}

然后hook了android.hardware.SystemSensorManager$SensorEventQueue这个类中的dispatchSensorEvent()函数:

[java] view plain copy

final Class
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: