翻阅了一些资料,也来折腾下微信骰子
0x01 定位随机函数
这里也只是猜测,看到大佬的文章说可能用到Radnom函数,因此本次的思路便是Hook所有的Random函数,然后发送骰子,查看调用堆栈信息,找到定位函数。
public class XposedInit implements IXposedHookLoadPackage {
String TAG = "hooktest";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if(lpparam.packageName.equals("com.tencent.mm")){
// hook random构造函数 Random(long s)
XposedHelpers.findAndHookConstructor("java.util.Random", lpparam.classLoader, long.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Log.e(TAG,"Random(long)");
Log.e(TAG, Log.getStackTraceString(new Throwable()));
super.afterHookedMethod(param);
}
});
// hook Random()
XposedHelpers.findAndHookConstructor("java.util.Random", lpparam.classLoader, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Log.e(TAG,"Random()");
Log.e(TAG, Log.getStackTraceString(new Throwable()));
super.afterHookedMethod(param);
}
});
}
}}
然后调用到发送骰子界面,发送一个骰子,观察logcat日志变化如下图。
定位到函数为com.tencent.mm.sdk.platformtools.bp.gv。
0x02 Hook定位函数
通过上面找到触发随机数产生的位置,下面就开始看该函数与骰子结果之间的关系。
public class XposedInit implements IXposedHookLoadPackage {
String TAG = "hooktest";
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if(lpparam.packageName.equals("com.tencent.mm")){
XposedHelpers.findAndHookMethod("com.tencent.mm.sdk.platformtools.bp", lpparam.classLoader, "gv", int.class,int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Log.e(TAG, "args: "+param.args[0]+" Result ----" + param.getResult());
super.afterHookedMethod(param);
}
});
}
}
}
结果如下,发下随机数字与骰子结果刚好一一对应。
后面直接修改返回结果即可。
// 2表示剪刀石头布,5表示骰子
if((int)param.args[0] == 2){
param.setResult(1);
}else if((int)param.args[0] == 5){
param.setResult(5);// 总返回6点
}
看看效果怎样。
下篇文章为Xposed 腾讯视频去广告。