微信Log日志分析——初步探索

转: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

微信Log日志分析——初步探索

unzip

用jadx直接搜索包含“Log”的类,进入可疑的类查看分析。发现XLogSetup应该是负责Log工具类初始化。

微信Log日志分析——初步探索

searchLog

进入XLogSetup发现可以关键字“isLogcatOpen”应该是打开Logcat的开关,通过Xlog.setConsoleLogOpen(isLogcatOpen.booleanValue())进行打开或关闭

微信Log日志分析——初步探索

xLogsetup

微信Log日志分析——初步探索

XLog

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:应该是写日志的方法

微信Log日志分析——初步探索

XLog2

微信Log日志分析——初步探索

XLog3

logWrite2应该是写日志的操作,对应的参数内容正好是XLoggerInfo的相关属性

微信Log日志分析——初步探索

logWrite2

Xlog实现接口在com.tencent.mm.sdk.platformtools.w中我们看到了各个级别的Log打印

我们也进去看看

微信Log日志分析——初步探索

XLogImp

从调用传递进入的参数可以看到与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日志分析——初步探索

LogInfo

发送与接收消息看看

微信Log日志分析——初步探索

sendMessage

发送消息在日志里面,不过多次毕竟后,发现不是通信的Log。看来通信的日志还得花不少事件慢慢折腾了。

微信Log日志分析——初步探索

LogInfo2

在发送一张图片看看日志

微信Log日志分析——初步探索

LogInfo3

微信Log日志分析——初步探索

LogInfo4

在朋友圈中任意打开一张照片看看,你会看看到日志中有朋友圈图片本地的存储位置

微信Log日志分析——初步探索

LogInfo5

在打开一张看看

微信Log日志分析——初步探索

LogInfo6

太累了,今天就先分析到这里。有空再进一步深入.

分享是一种美德,牵手是一种生活方式。

最后感谢今日头条提供的分享平台,你觉得有用可以收藏方便以后查阅


### 配置Nginx以支持企业微信客户端 为了使Nginx能够适配并支持企业微信客户端的访问或集成,主要关注点在于确保Nginx可以正确响应来自企业微信服务器的校验请求以及处理由企业微信发起的各种HTTP请求。下面提供具体的配置方案。 #### 处理企业微信域名校验 对于企业微信接入时所需的域名验证文件放置服务,可以通过设置特定路径匹配规则来实现自动返回相应的内容: ```nginx location ~ /WW_verify_(.*)\.txt { default_type text/plain; return 200 $1; } ``` 这段配置使得当有针对`/WW_verify_*.txt`形式URL的GET请求到达此位置时,将以纯文本格式直接回应文件名中的随机字符串部分作为内容[^1]。 #### 设置监听端口和服务名称 为了让开发环境下的调试更加方便,在本地环境中调整Nginx监听端口号至非标准80端口可能是必要的操作之一;同时指定server_name为localhost有助于简化测试流程: ```nginx listen 9000; server_name localhost; ``` 上述指令让Nginx实例仅接受来自本机且目标端口为9000的数据包连接尝试,并将其视为发往名为"localhost"的服务请求[^2]。 #### 实现重定向功能辅助H5页面加载 考虑到某些情况下可能遇到的安全策略限制问题——即微信内置浏览器不允许跨站资源加载的情况,可采用如下方式绕过此类约束: ```nginx if ($request_uri ~* "/static/(.*)") { rewrite ^ http://your-server-ip/static/$1 permanent; } ``` 这里定义了一个条件判断语句,一旦发现URI中含有静态资源标志符(如"/static/"),则立即执行永久性重写动作,将原始请求转发给实际托管这些资源的目标服务器地址[^3]。 #### 获取真实客户端IP地址 由于不同操作系统上的微信应用可能会发送不同的X-Forwarded-For头部字段值,因此建议在Nginx层面实施额外的日志记录逻辑以便于后续分析工作: ```nginx log_format main '$remote_addr - [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; set_real_ip_from 172.16.0.0/12; # 假设内部网络范围在此区间内 real_ip_header X-Real-IP; ``` 以上片段不仅自定义了一套日志模板用于捕获更多上下文信息,还指定了哪些源IP被认为是可信的真实客户终端设备发出者,并告知Nginx应从哪个HTTP头读取真正的访客公网IPv4数值[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值