转:https://www.toutiao.com/i6480401747104760333/
前言
Android 系统及其程序日志(Log)通常通过LogCat输出,小app一般采用Android 自带的工具类Log,一旦有点规模的APP都会封装自己的Log工具类,那么作为开放平台的微信会如何输出自己的log信息。大胆猜想应该是封装一个自己的日志类,用于控制发布时关闭日志输入。
今天的工作计划是把微信的日志打印输出,水平有限不敢去想攻克微信的通信日志,smali的方式来回编译也很麻烦,我打算直接通过hook的方式改变微信的日志输出
材料装备:
-
jadx:直接看看apk、dex、jar代码
-
Android studio:Android 开发ide
-
微信6.5.16-apk:
-
微信6.5.16:"Wechat6.5.16smali第1版本"(我已分析在csdn)
-
apkDB改之理:
-
androidKiller
-
xposed框架:
大胆猜想
像微信这么大的app一定会封装自己的log工具类。
先用解压软件打开微信6.5.16-apk,并解压,大致浏览一下发现Lib目录下的可疑的so文件libwechatxlog.so
用jadx直接搜索包含“Log”的类,进入可疑的类查看分析。发现XLogSetup应该是负责Log工具类初始化。
进入XLogSetup发现可以关键字“isLogcatOpen”应该是打开Logcat的开关,通过Xlog.setConsoleLogOpen(isLogcatOpen.booleanValue())进行打开或关闭
hook keep_setupXLog 修改 bool2 =true
由于Xlog.setConsoleLogOpen是native方法,所以我们修改在keep_setupXLog入口位置修改isLogcatOpend的参数值=true。
代码如下:
static String TAG = "HookXLog";
static public void keep_setupXLog(XC_LoadPackage.LoadPackageParam lpparam) {
//public static void keep_setupXLog(boolean z, String str, String str2, Integer num, Boolean bool, Boolean bool2, String str3)
XposedHelpers.findAndHookMethod("com.tencent.mm.xlog.app.XLogSetup", lpparam.classLoader, "keep_setupXLog",
boolean.class, String.class, String.class, Integer.class, Boolean.class,
Boolean.class, //isLogcatOpen
String.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
param.args[5] = true;
//param.setResult(null);
}
@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类
-
logDecryptor 应该是解码类
-
XLoggerInfo 应该是日志信息
-
LEVEL_*(应该是Log的级别LEVEL_DEBUG、LEVEL_ERROR、LEVEL_FATAL等等)
-
logWrite、logWrite2:应该是写日志的方法
logWrite2应该是写日志的操作,对应的参数内容正好是XLoggerInfo的相关属性
Xlog实现接口在com.tencent.mm.sdk.platformtools.w中我们看到了各个级别的Log打印
我们也进去看看
从调用传递进入的参数可以看到与XLoggerInfo极其类似
uMm.logF(str, "", "", Process.myTid(), Process.myPid(), Thread.currentThread().getId(), Looper.getMainLooper().getThread().getId(), objArr == null ? str2 : String.format(str2, objArr));
Hook Log工具类对应的各个级别的调用位置。
代码如下:
static private void platformtools_w_Log_f(XC_LoadPackage.LoadPackageParam lpparam) {
//platformtools_w
//public static void f(String str, String str2, Object... objArr)
XposedHelpers.findAndHookMethod("com.tencent.mm.sdk.platformtools.w", lpparam.classLoader, "f",
String.class, String.class, Object[].class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
String str = (String) param.args[0];
String str2 = (String) param.args[1];
Object[] objArr= (Object[]) param.args[2];
String format = objArr == null ? str2 : String.format(str2, objArr);
Log.e(TAG+"f"+str,format);
super.beforeHookedMethod(param);
}
});
}
static private void platformtools_w_Log_e(XC_LoadPackage.LoadPackageParam lpparam) {
XposedHelpers.findAndHookMethod("com.tencent.mm.sdk.platformtools.w", lpparam.classLoader, "e",
String.class, String.class, Object[].class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
String str = (String) param.args[0];
String str2 = (String) param.args[1];
Object[] objArr= (Object[]) param.args[2];
String format = objArr == null ? str2 : String.format(str2, objArr);
if (format == null) {
format = "";
}
Log.e(TAG+"e"+str,format);
super.beforeHookedMethod(param);
}
});
}
...
...
查看打印日志的情况
发送与接收消息看看
发送消息在日志里面,不过多次毕竟后,发现不是通信的Log。看来通信的日志还得花不少事件慢慢折腾了。
在发送一张图片看看日志
在朋友圈中任意打开一张照片看看,你会看看到日志中有朋友圈图片本地的存储位置
在打开一张看看
太累了,今天就先分析到这里。有空再进一步深入.