前言:
最近在研究学习xposed,想尝试也写一些微信插件,然后使用jadx打开静态分析,但是因为混淆了代码方面都实在不好分析,只能使用结合日志动态分析,但是使用Android studio是看不到任何微信日志的,所以猜测是微信是上线之后关闭日志打印开关了。
工具准备:
1.Jadx:反编译查看源码
2.Android studio:安卓开发工具IDE
3.一台已经安装Xposed的安卓手机
4.微信6.7.0版本apk 微信历史版本下载 https://wechat.cn.uptodown.com/android/old
开始分析:
点进去上面图片的类
但是在这个类里面并没有找到开关的设置代码,所以继续分析这个接口类 a 还有没有其他类使用到
先点进去这个类看下,看看有没有动态开启日志的代码
分析了一下,依然没有找到开关方法,继续找Xlog这个类引用类
点进去XlogSetup这个类,可以看到
开始写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类分析日志级别的分类
所以看到这里就知道,每次打印日志的时候是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查看具体日志:
总结分析:
第一步:根据微信代码逻辑找到微信日志动态开关
第二步:使用Xposed修改值,打开日志开关
第三部:找到微信日志过滤规则,然后使用Xposed来判断过滤级别
第四部:重启设备运行项目,测试,可以查看微信各种级别日志了