由于手机上修改的软件比较多,分享到微信时会弹出“签名不对,请检查签名是否与开放平台上填写的一致。” ,并且无法分享,因而完成一个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进程。
请问可以分享下这个模块吗
模块已分享在GitHub:https://github.com/icespite/WXHook
大佬,微信 8.0.40 已经失效了,辛苦在github更新一下
可以使用这个模块:https://cloud.icespite.top/s/JRc9
链接打不开了, 麻烦大佬补一下
已修复