前言:
最近在研究學(xué)習(xí)xposed嘹屯,想嘗試也寫一些微信插件肛走,然后使用jadx打開靜態(tài)分析焚志,但是因?yàn)榛煜舜a方面都實(shí)在不好分析,只能使用結(jié)合日志動(dòng)態(tài)分析胆筒,但是使用Android studio是看不到任何微信日志的邮破,所以猜測(cè)是微信是上線之后關(guān)閉日志打印開關(guān)了。
工具準(zhǔn)備:
1.Jadx:反編譯查看源碼
2.Android studio:安卓開發(fā)工具IDE
3.一臺(tái)已經(jīng)安裝Xposed的安卓手機(jī)
4.微信6.7.0版本apk 微信歷史版本下載 https://wechat.cn.uptodown.com/android/old
開始分析:
點(diǎn)進(jìn)去上面圖片的類
但是在這個(gè)類里面并沒有找到開關(guān)的設(shè)置代碼腐泻,所以繼續(xù)分析這個(gè)接口類 a 還有沒有其他類使用到
先點(diǎn)進(jìn)去這個(gè)類看下决乎,看看有沒有動(dòng)態(tài)開啟日志的代碼
分析了一下,依然沒有找到開關(guān)方法派桩,繼續(xù)找Xlog這個(gè)類引用類
點(diǎn)進(jìn)去XlogSetup這個(gè)類构诚,可以看到
開始寫Xposed:
先打開日志開關(guān)
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參數(shù)isLogcatOpen: " +param.args[5]);
}
});
}
這里已經(jīng)寫好了開啟日志開關(guān),但是目前日志級(jí)別還是沒有過濾的铆惑,所以又要回到Xlog類分析日志級(jí)別的分類
所以看到這里就知道范嘱,每次打印日志的時(shí)候是logWrite2真正進(jìn)行操作打印的送膳,第一個(gè)參數(shù)就是決定那個(gè)級(jí)別的日志,所以只要Xposed獲取里面的值丑蛤,然后根據(jù)第一個(gè)參數(shù)類型叠聋,就能獲取所有日志消息進(jìn)行級(jí)別過濾了
//微信日志級(jí)別
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 ";
//根據(jù)logWrite2方法里面?zhèn)鬟^來的參數(shù)來過濾字段,默認(rèn)值
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級(jí)別:
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];
//根據(jù)值來過過濾日志級(jí)別
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);
}
});
}
代碼寫完了受裹,然后重啟設(shè)備打開Xposed模塊
使用Android studio查看具體日志:
總結(jié)分析:
第一步:根據(jù)微信代碼邏輯找到微信日志動(dòng)態(tài)開關(guān)
第二步:使用Xposed修改值碌补,打開日志開關(guān)
第三部:找到微信日志過濾規(guī)則,然后使用Xposed來判斷過濾級(jí)別
第四部:重啟設(shè)備運(yùn)行項(xiàng)目棉饶,測(cè)試厦章,可以查看微信各種級(jí)別日志了