用xposed绕过重签名后qq登录显示“非官方正版应用”的验证
本帖最后由 z14mian 于 2019-1-22 10:01 编辑一、前言
众所周知,如果一个app重新签名了之后,在调用qq进行第三方登录时,会显示“非官方正版应用”。
这就很令人难受了,卡在最后一步,的确会很让人抓狂。而且网上也貌似很少有这方面的教程(这让我等小白更抓狂了)。在一次机缘巧合下,看到了四哥的一篇文章:http://www.520monkey.com/archives/1009。四哥介绍了两种方式,一种是写xp插件,一种是直接改qq。改qq的话,一个是重编译麻烦,一个是只能自己用(毕竟别人也不敢随便用被改过的qq)。然后四哥说了一句话:写xp模块现在谁都会了,我们讲另一种好了。
Emmmmm
(⊙﹏⊙)
不!我不会!
于是就有了这篇帖子
二、分析
1. 在上面那个框出现的时候,用adbshell dumpsys activity top直接就能找到类名
2. 把qq安装包中的classes.dex拉出来,用jadx反编译软件打开,可以直接看到java代码。按照路径展开到目标位置,然后看代码。如图,日志已经出卖了你。
也就是说,这里的string a 就是app的签名md5值。我们只需要hook他就好了。先确认一下参数类型:instance是MessageDigest类,所以instance.digest()是byte[]类型(百度就有了)。
3. 按下ctrl,上面的HexUtil会变成可点。点过去。
4. 从页面最上的package可以看到类名com.tencent.mobileqq.utils。然后问题来了,这里有很多个a方法(因为被混淆过了),但是上面我们已经确定了参数是byte[],所以直接就能找到。
准备开搞
三、写xposed插件
1. 基础教程,可以看这里:https://blog.csdn.net/csdn_lqr/article/details/52245132
2. 开撸,代码如下
package com.cy.qq;
import android.app.AndroidAppHelper;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class hook implements IXposedHookLoadPackage {
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.contains("com.tencent.mobileqq"))
return;
XposedHelpers.findAndHookMethod("com.tencent.mobileqq.utils.HexUtil", lpparam.classLoader, "a", byte[].class, new XC_MethodHook() {
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
byte[] signatures = (byte[]) param.args;
String sign = bytesToHex(signatures);
XposedBridge.log("输出 ------------- " + sign);
AndroidAppHelper.currentApplication();
if (sign.equals("自己app签名md5")) {
String result="正版签名md5";
param.setResult(result);
}
}
});
}
public static String bytesToHex(byte[] bytes) {
StringBuffer sb = new StringBuffer();
for (byte b : bytes) {
String hex = Integer.toHexString(b & 255);
if (hex.length() < 2) {
sb.append(0);
}
sb.append(hex);
}
return sb.toString();
}
}
加了原签名md5判断的原因是,这个方法并不是验证签名专用的,如果无条件直接返回自己的值,会影响程序的运行,以及其他的程序都没办法用qq登录了。
3. 写完后,打包安装xp框架打勾重启。启动修改过的第三方app,搞定,成功绕过
四、其他
因为只是hook了程序,没有涉及到hook系统和资源布局,所以这个模块还可以用于免root的virtualxposed框架。
萌新第一次发帖,各位大佬多多指教 (>▽<) 所以。。。楼主有没有直接安装就行的办法。。。
总不至于出去装个逼还要给人家装一套框架吧(虽然vxp相对来说好多了) 前来膜拜学习下, 虽然好久没有碰了 {:301_997:} 成品可以发出来测试一下最好了 看看学习一下 支持了
看看学习一下 支持了 虽然看的一脸懵逼但是小白还是表示下膜拜 谢谢您的分享!!! 感谢楼主分享 之前hook过这个地方,不过有问题,学习一下