翻阅了一些资料,也来折腾下微信骰子


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日志变化如下图。
堆栈截图.png

定位到函数为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.png
后面直接修改返回结果即可。

                 // 2表示剪刀石头布,5表示骰子
                if((int)param.args[0] == 2){
                    param.setResult(1);
                }else if((int)param.args[0] == 5){
                    param.setResult(5);// 总返回6点
                }

看看效果怎样。

3.png

下篇文章为Xposed 腾讯视频去广告。