z14mian 发表于 2019-1-21 22:42

用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框架。


萌新第一次发帖,各位大佬多多指教 (>▽<)

Wise_58 发表于 2019-1-22 09:20

涛之雨 发表于 2019-1-28 21:02

所以。。。楼主有没有直接安装就行的办法。。。
总不至于出去装个逼还要给人家装一套框架吧(虽然vxp相对来说好多了)

瓜子吧3 发表于 2019-1-21 23:07

前来膜拜学习下, 虽然好久没有碰了

lei191650 发表于 2019-1-21 23:08

{:301_997:} 成品可以发出来测试一下最好了

小泪痕 发表于 2019-1-22 00:11

看看学习一下 支持了

可惜没如果i 发表于 2019-1-22 03:49


看看学习一下 支持了

禽·兽 发表于 2019-1-22 06:37

虽然看的一脸懵逼但是小白还是表示下膜拜

xudongchu 发表于 2019-1-22 08:02

谢谢您的分享!!!

三号小学生 发表于 2019-1-22 09:05

感谢楼主分享

z6810753 发表于 2019-1-22 09:23

之前hook过这个地方,不过有问题,学习一下
页: [1] 2 3 4 5
查看完整版本: 用xposed绕过重签名后qq登录显示“非官方正版应用”的验证