吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7480|回复: 29
收起左侧

[原创] PC微信逆向分析の强制输出微信调式信息

  [复制链接]
zmrbak 发表于 2020-1-9 08:25
作者:zmrbak(赵庆明老师)

前言

2019年4月份 JieKeH的一篇文章《PC微信逆向---分析获取登录二维码的数据》一文,让不少的朋友对微信这个软件产生了浓厚的兴趣,当然也包括我。令我印象最深刻的莫过于“打开微信的Xlog日志输出”这部分内容。

虽然腾讯公司在微信的发布版本中对调试信息进行了屏蔽,但JieKeH通过IDA反汇编的伪代码与Xlog源码对比的方式找到了输出调试信息的关键点,并提供了突破屏蔽的方法。在学习了这篇文章后,本人也通过OD中的反汇编代码与Xlog源码对比的方式,同样找到了相应的关键点,之后将其录制成一个视频分享给了身边一起研究的朋友们。

新问题新对策

很不幸,该文章出现后不久,新版本的微信进行了相应的调整,JieKeH文章中所讲述的方法完全失效。身边的朋友不时告诉我,这个方法失效了,同时请教我还有什么办法可以输出这些调试信息。其实,玩过HOOK的朋友,会马上想到另一个办法,就是写一个dll注入,在dll中编写相应的逻辑实现需要的功能。我用这种方法录制了一个小视频分享之后,再也没有人问过这个问题。看来这个办法还是不错的!

更简单的方式

编写DLL,所涉及到的知识较多,涉及到编码、编译、注入等一系列操作,不但操作复杂而且修改也不容易。近日,最新正式版的微信2.8.0.106推出,我在此新版本上进程了相关的尝试,其实只是在CE中进行简单的一些设置,即可满足需求,就算是新手也不难掌握。由于剪辑视频太耗时间,而且相比于上一个视频也没多少新意,因此仅整理成文档分享给大家。部分内容,之前的视频中有讲解,这里就不再赘述,直接进入本文主题。

定位“是否启用调试”的地址

在OD中附加微信后,查询二进制代码“74 14 FF B5 EC FE FF”(为何是这个二进制代码,请参考之前的视频讲解),定位到如下代码片段,并在接下来的CALL(WeChatWi.79164604)上下一个断点:

1

1


ds:[0x79A6CA01],这个地址,就是是否启动调试的开关。计算出偏移地址:0x160CA01。在微信中,这个地址中的数据被设置成0,因此调试信息将不会输出。只要将这个地址中的数据更改为1,那么输出调试信息的开关就被打开了。但是,调试信息还有其他开关,那就是调试级别。
       
定位“调试级别”的地址

查询二进制代码“56 89 9D F0 FB FF FF”(为何是这个二进制代码,请参考之前的视频讲解),定位到如下代码片段:

2

2


进入 WeChatWi.79154DB0这个CALL后,到达如下代码片段:

3

3


ds:[0x79A1CD54],这个地址,就是调试级别的设置。计算出偏移地址:0x15BCD54。在微信中,这个地址中的数据被设置成2,也就是高于“kLevelDebug”的信息才会被输出。只要将这个地址中的数据更改为0,也就是“kLevelAll”或“kLevelVerbose”,也就是输出全部调试信息。

定位调试数据的代码段

在JieKeH的文章中,完成这两步设置后,调试信息即可输出,在DebugView中课捕获微信自身的调试信息。正如前文所述,随着微信版本的升级,此方法很快失效。于是,基于此设置,我再用HOOK的方式,重新让微信具备了调试信息的输出的功能。到目前最新的2.8.0.106版本,HOOK方法依然有效。当然,无论怎么做,定位调试数据这个步骤还是不能少的。

用鼠标动一动微信,OD中程序将暂停在调用“WeChatWi.79164604”处(之前下的断点处),按F7进入该函数。注意观察堆栈窗口,持续按F8,单步执行,直到堆栈顶部出现如下类似的信息。这些信息,就是原本要输出的调试信息。接下来,在HOOK中,同样把这个数据提取出来,从调试信息中输出,然后在DebugView中捕获。

4

4


这时候,观察程序运行的代码部分,计算出该代码片段中“add esp,0x4c“所在汇编代码的偏移地址:0x‭CE7853‬。其代码片段如下:‬

5

5


在上一个HOOK的视频中,我在这里进行了HOOK。在本文中,我使用CE来进行一小段“代码注入”即可代替编写DLL这种难度高、而且手续繁杂的工作。
               
定位堆栈中数据的地址

虽然数据在堆栈顶部,但是由于下来要对堆栈进行操作,如果使用ESP来取数据,还需一些手动的计算,稍显麻烦。由于EBP在堆栈操作过程中会保持不变,因此我们使用EBP加上一定的偏移量来取数据,这样就不需要额外的手动计算。

在OD堆栈窗口中,点右键选择“转到EBP“,在该行的地址上双击,变成”$==>“

6

6


然后,在OD堆栈窗口中,点右键选择“转到ESP“,记录该行相对于EBP的偏移:$-40E0。也就是说,当前的数据位于[ebp-0x40E0]这个地方,也就是ESP所指向的地方。因此,我们取到了数据存储的地址:ebp-0x40E0。

7

7


使用CE编写代码注入脚本

启动CE,附加微信。点击“手动添加地址”,分别添加“WeChatWin.dll+0x160CA01”与“WeChatWin.dll+0x15BCD54”,再分别命名为“输出调试信息”和“设置调试级别”,再将其值分别更改为1与0,如下图所示:

8

8


点击“查看内存”,定位到“WeChatWin.dll+CE7853”,并选中此行。

9

9


接下来,在“内存浏览器”窗口中依次点击“工具\自动汇编”,在弹出的新窗口中,依次点击“模板\CT表框架代码”,再依次点击“模板\代码注入”,确保弹出对话框中内容为“"WeChatWin.dll"+CE7853”(代码选中的位置),点击“OK”。

10

10


接下来,依次点击“文件\分配到当前的CT表”,然后点击关闭。CE的主窗口中将多出一行内容。将其改名为“OutPutDebug”。记得随时按Ctrl+s(保存)。

11

11


双击OutPutDebug中的数值栏中的“脚本”,在打开的新窗口中对该脚本进行编辑。在newmem与originalcode之间添加如下代码(备注:0x7747efd0,就是OutputDebugStringA函数地址。相关理论,不赘述):

[Asm] 纯文本查看 复制代码
pushad
push [ebp-0x40E0]
call 0x7747efd0
popad


12

12


点击“确定”。记得再按Ctrl+s保存。

开始测试

  • 输出调试信息:1
  • 设置调试级别:0
  • OutPutDebug:启用(那个方框中间画一个叉)


13

13

以管理管身份启动“DebugView”软件,用鼠标动一动微信,即可观察到微信输出的调试信息。

14

14


源码及工具
WeChat2.8.0.106_Debug.7z (146.18 KB, 下载次数: 99)

免费评分

参与人数 8吾爱币 +7 热心值 +7 收起 理由
whg118 + 1 + 1 说的透彻,看得明白。
修罗本灭世 + 1 + 1 谢谢@Thanks!
liphily + 1 用心讨论,共获提升!
你若安好OR + 1 + 1 我很赞同!
JuncoJet + 3 + 1 流弊流弊
nws0507 + 1 谢谢@Thanks!
jerryZhang123 + 1 谢谢@Thanks!
生有涯知无涯 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ekanshao 发表于 2020-1-9 08:40
不明觉厉,帮顶
s8023q 发表于 2020-1-9 08:47
blueawter_cg 发表于 2020-1-9 08:53
hqm2019 发表于 2020-1-9 08:57
楼主非常牛逼非常厉害这块真的很难学
a1327831029 发表于 2020-1-9 09:40
看不懂,顶一下
头像被屏蔽
hua111 发表于 2020-1-9 10:10
提示: 作者被禁止或删除 内容自动屏蔽
归客 发表于 2020-1-9 10:12
楼主,来我们腾讯微信部门上班吧,薪资加倍
4AFilm 发表于 2020-1-9 10:32
看看,支持一下~
zHiHz 发表于 2020-1-9 11:06
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 05:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表