Xposed开发入门(2)---开启微信Log日志以及设置过滤

前言:

最近在研究学习xposed,想尝试也写一些微信插件,然后使用jadx打开静态分析,但是因为混淆了代码方面都实在不好分析,只能使用结合日志动态分析,但是使用Android studio是看不到任何微信日志的,所以猜测是微信是上线之后关闭日志打印开关了。

image1.png

工具准备:

1.Jadx:反编译查看源码
2.Android studio:安卓开发工具IDE
3.一台已经安装Xposed的安卓手机
4.微信6.7.0版本apk 微信历史版本下载 https://wechat.cn.uptodown.com/android/old

开始分析:

点进去上面图片的类

image2.png

但是在这个类里面并没有找到开关的设置代码,所以继续分析这个接口类 a 还有没有其他类使用到

image3.png

先点进去这个类看下,看看有没有动态开启日志的代码


image4.png

分析了一下,依然没有找到开关方法,继续找Xlog这个类引用类


image5.png

点进去XlogSetup这个类,可以看到


image6.png

开始写Xposed:

先打开日志开关

  private void weChatLogOpen(final ClassLoader classLoader) {
    //isLogcatOpen
      XposedHelpers.findAndHookMethod("com.tencent.mm.xlog.app.XLogSetup",classLoader, "keep_setupXLog"
          boolean.class, String.class, String.class, Integer.class, Boolean.class,Boolean.class,String.class,
            new XC_MethodHook() {
        
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    param.args[5] = true;
                }

                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    param.args[5] = true;
                    super.afterHookedMethod(param);
                    Log.i(TAG,"keep_setupXLog参数isLogcatOpen: " +param.args[5]);
                }
            });
}

这里已经写好了开启日志开关,但是目前日志级别还是没有过滤的,所以又要回到Xlog类分析日志级别的分类


image.png
image.png

所以看到这里就知道,每次打印日志的时候是logWrite2真正进行操作打印的,第一个参数就是决定那个级别的日志,所以只要Xposed获取里面的值,然后根据第一个参数类型,就能获取所有日志消息进行级别过滤了

//微信日志级别
public static final int LEVEL_VERBOSE = 0;
public static final int LEVEL_DEBUG = 1;
public static final int LEVEL_INFO = 2;
public static final int LEVEL_WARNING = 3;
public static final int LEVEL_ERROR = 4;
public static final int LEVEL_FATAL = 5;
public static final int LEVEL_NONE = 6;

//微信日志过滤
public static final String LOG_VERBOSE = "LOG_VERBOSE";
public static final String LOG_DEBUG = "LOG_DEBUG";
public static final String LOG_INFO= "LOG_INFO";
public static final String LOG_WARNING = "LOG_WARNING";
public static final String LOG_ERROR = "LOG_ERROR";
public static final String LOG_FATAL = "LOG_FATAL";
public static final String LOG_NONE = "LOG_NONE ";


//根据logWrite2方法里面传过来的参数来过滤字段,默认值
private String getWechatLogType(int logType) {
    String TAG=null;
    if(logType==LEVEL_VERBOSE){
        TAG=LOG_VERBOSE;
    }else if(logType==LEVEL_DEBUG){
        TAG=LOG_DEBUG;
    }else if(logType==LEVEL_INFO){
        TAG=LOG_INFO;
    }else if(logType==LEVEL_WARNING){
        TAG=LOG_WARNING;
    }else if(logType==LEVEL_ERROR){
        TAG=LOG_ERROR;
    }else if(logType==LEVEL_FATAL){
        TAG=LOG_FATAL;
    }else if(logType==LEVEL_NONE){
        TAG=LOG_NONE;
    }
    return TAG;
}

Xposed过滤微信Log级别:

private void weChatLog(final ClassLoader classLoader) {
    XposedHelpers.findAndHookMethod("com.tencent.mars.xlog.Xlog", classLoader, "logWrite2",
            int.class,String.class, String.class, String.class,int.class,int.class,long.class,long.class,String.class,
            new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    int logType  = (int) param.args[0];
                    String str2  = (String) param.args[1];
                    String str3  = (String) param.args[2];
                    String str4 = (String) param.args[3];
                    int num4  = (int) param.args[4];
                    int num5  = (int) param.args[5];
                    long long6  = (long) param.args[6];
                    long long7  = (long) param.args[7];
                    String str8  = (String) param.args[8];
                    //根据值来过过滤日志级别
                    String wechatLogType = getWechatLogType(logType);

                    Log.d(wechatLogType, "LogType==="+logType);
                    Log.d(wechatLogType, str2);
                    Log.d(wechatLogType, str3);
                    Log.d(wechatLogType, str4);
                    Log.d(wechatLogType, ""+num4);
                    Log.d(wechatLogType, ""+num5);
                    Log.d(wechatLogType, ""+long6);
                    Log.d(wechatLogType, ""+long7);
                    Log.d(wechatLogType, str8);
                    super.beforeHookedMethod(param);
                }
            });

}

代码写完了,然后重启设备打开Xposed模块

使用Android studio查看具体日志:

image.png
image.png

总结分析:

第一步:根据微信代码逻辑找到微信日志动态开关
第二步:使用Xposed修改值,打开日志开关
第三部:找到微信日志过滤规则,然后使用Xposed来判断过滤级别
第四部:重启设备运行项目,测试,可以查看微信各种级别日志了

你可能感兴趣的:(Xposed开发入门(2)---开启微信Log日志以及设置过滤)