Hook微信分享时签名校验

发布于 2021-07-30  144 次阅读


由于手机上修改的软件比较多,分享到微信时会弹出“签名不对,请检查签名是否与开放平台上填写的一致。” ,并且无法分享,因而完成一个Xposed模块过掉校验。

先按照一个完整思路写一遍方法,然后再写一下踩的坑。

定位目标代码

方法一 根据字符串进行定位

从资源文件夹找到“签名不对,请检查签名是否与开放平台上填写的一致。”,获取到其id值是7f10247c,然后搜索smali定位到微信为其重新命名的变量名openapi_invalid_signature,然后翻一翻代码就能定位到函数com.tencent.mm.pluginsdk.model.app.q.a

 public static boolean a(final Context context, g gVar, String str, boolean z) {
       	//此处省略一大段代码…… 
                if (z) {
                    MMHandlerThread.postToMainThread(new Runnable() {
                        /* class com.tencent.mm.pluginsdk.model.app.q.AnonymousClass2 */

                        public final void run() {
                            AppMethodBeat.i(162008);
                            Toast.makeText(context, context.getString(c.h.openapi_invalid_signature), 1).show();
                            AppMethodBeat.o(162008);
                        }
                    });
                }
                Log.w("MicroMsg.AppUtil", "isAppValid, signature is diff");
                fmG.e(gVar);
                AppMethodBeat.o(151767);
                return false;
            }
        }
    }

方法二 利用Xposed Hook Toast的堆栈,定位到关键代码

打印堆栈代码:

Throwable ex = new Throwable();
StackTraceElement[] stackElements = ex.getStackTrace();
if (stackElements != null) {
    for (int i = 0; i < stackElements.length; i++) {

        XposedBridge.log("Dump Stack" + i + ": " + stackElements[i].getClassName()
                         + "----" + stackElements[i].getFileName()
                         + "----" + stackElements[i].getLineNumber()
                         + "----" + stackElements[i].getMethodName());
    }
}
XposedBridge.log("Dump Stack: " + "---------------over----------------");

得到结果:

修改返回值

Class<?> dumpClass = XposedHelpers.findClass("com.tencent.mm.pluginsdk.model.app.q", loadPackageParam.classLoader);
            Class<?> fclass2 = XposedHelpers.findClass("com.tencent.mm.pluginsdk.model.app.g", loadPackageParam.classLoader);
            XposedHelpers.findAndHookMethod(dumpClass, "a", Context.class, fclass2, String.class, boolean.class,
                    new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            XposedBridge.log(TAG + "BeforeSignHook: " + param.args[0] + " " + param.args[1] + " " + param.args[2] + " ");
                            //直接改返回值就可以
                            param.setResult(true);
                        }

                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            XposedBridge.log(TAG + "AfterSignHook: " + param.getResult());

                        }
                    });

简单粗暴,收工。

踩坑

参数错误,导致NoSuchMethodError

大坑,这个地方导致浪费了很长时间,我看到前面有一个g类的import,就想当然的以为是com.tencent.mm.b.g这个类了,vscode点进去也是这个(神坑)。

但是当我dump出所有的函数的时候发现不是:

泪目。感觉这一点Xposed不如Frida,Frida会提示正确的类型,但是Xposed只提示找不到,搞得我以为是微信有什么很牛逼的反Hook方案,大雾。

更:我又看了下smali文件,发现是jadx的锅。。。。

顺便扔一下dump代码方便以后用:

 // 获取指定名称的类声明的类成员变量、类方法、内部类的信息
    public void dumpClass(Class<?> actions) {
        XposedBridge.log("Dump class " + actions.getName());
        XposedBridge.log("Methods");
        // 获取到指定名称类声明的所有方法的信息
        Method[] m = actions.getDeclaredMethods();
        // 打印获取到的所有的类方法的信息
        for (int i = 0; i < m.length; i++) {

            XposedBridge.log(m[i].toString());
        }
        XposedBridge.log("Fields");
        // 获取到指定名称类声明的所有变量的信息
        Field[] f = actions.getDeclaredFields();
        // 打印获取到的所有变量的信息
        for (int j = 0; j < f.length; j++) {
            XposedBridge.log(f[j].toString());
        }
        XposedBridge.log("Classes");
        // 获取到指定名称类中声明的所有内部类的信息
        Class<?>[] c = actions.getDeclaredClasses();
        // 打印获取到的所有内部类的信息
        for (int k = 0; k < c.length; k++) {
            XposedBridge.log(c[k].toString());
        }
    }

Frida无法Hook 微信

原因未知:

可以看到Frida找不到com.tencent.mm进程。