PC微信Hook实战记录1:找到个人信息

8,796 阅读5分钟

前言

4个月前,自己着迷于微信逆向方面的技术,一是因为公司要做客服微信关键词屏蔽过滤,二是自己觉得很有意思,所以研究了一段时间,记录了一些简单的笔记,分享给大家。

文章由自己的实践笔记整理而成,有大量真实的细节,各位有兴趣完全可以尝试复现。

有些朋友可能会问,为什么不使用itchat这类库?

因为大多数微信号不经常使用网页版微信账号已经无法登陆网页版微信了,不信?试试呗。

个人基本信息查找

登录 win PC微信,可以看到如下个人信息

我们可以看到的内容,肯定也存在与内存中,通过 Cheat Engine 工具可以查找程序内存中的值

Cheat Engine,一般称为CE,是一款开源软件,作者为 Eric,功能包括:内存扫描、十六进制编辑器,除错工具,有Windows和Mac版。 Cheat Engine常用于制作电脑游戏外挂。

因为我是中文名,选择搜索的时候 Value Type 选择 String,接着在 value 填入自己微信的用户名,点击搜索则可

从上图可以看出,从内存中搜索出了很多内容,我们只需要找到一个绿色的 Address, 这就是我们需要的基址,基址在程序下次运行时是不会改变的。

双击基址,将其添加到下面的 Table Extras 中,然后再次双击,查看到其中的值为:WeChatWin.dll+126D91C

此时可知,基址可以通过 WeChatWin.dll 加一个偏移获得。

什么是WeChatWin.dll?

WeChatForPC 有三个比较重要的文件:WeChat.exe、WeChatWin.dll、WeChatResource.dll。

  • WeChat.exe 只执行一些简单的操作,如检查更新、校验 WeChatWin.dll,主要逻辑代码都在 WeChatWin.dll 中。
  • WeChatWin.dll 包含 WeChatPC 的绝大部分主题代码,一些重要的函数使用了 VMP 进行混淆 (较低版本中混淆了更多代码)
  • WeChatResource.dll 保存了 WeChat 的所有资源文件:图片、音效、XML 等,并使用了某种未知的方式进行压缩

通过windows api,可以轻易的获取相应dll所在的内存地址,通过该dll加便宜的形式,就可以定位出任意地址,上面要定位基址,下次程序运行是,dll所在的内存地址改变了,基址内存地址也变了,但不妨碍我们通过windows api获得此时dll所在的位置,然后算出基址内存地址的位置,从而读取其中的值。

回到微信接口,通过观察发现,微信名的周围还有其他的数据,这些数据显示在一起,在内存中,其表现形式通常是在附件的,这样就可以通过 ‘二两’ 所在的地址找到其他数据的地址,打开 Ollydbg ,这里使用吾爱破解的 Ollydbg ,这版 OD 经过一些定制,功能更强大一些。

OllyDbg是一个新的动态追踪工具,它是IDA与SoftICE结合起来的产物,Ring 3级调试器,非常容易上手,另外由于OllyDbg是一个通用的32位汇编分析调试器且操作界面非常直观简单,己代替SoftICE成为当今最为流行的调试解密工具了。

点击文件 --> 附加 --> 输入 wechat --> 找到 WeChat.exe 点击附加,将其内存加载进 OD 中

效果如下,因为吾爱破解版的 Ollydbg 可以直接读取微信的内存,这很方便我们找到微信中使用的 cell方法,从而进行Hook操作

通过 Command 输入前面找到的 地址,使用 dd + 地址则可(OD具体的操作指令)

从而跳转到该内存地址对应的区域,为了可以看见一些内容,右键单击 --> 短型 --> ASCII

效果如下:

接着,找到对应的内存位置

打开 Cheat Engine 点击 Add Address Manually,手动找地址

将 OD 中找到的电话号码的内存地址填入,然后 Type 选择 Text,因为电话号码长度为 11,所以 Length 也填入 11,从而从微信内存中找到我个人微信绑定的手机号,但这个地址是动态地址,即下次重新其中微信后,手机号的内存位置通常不会在这里,所以要找到其基址。

在微信中,基址可以通过 WeChatWin.dll 加一个偏移获得,所以我们可以通过

6ED6D950 - WeChatWin.dll的内存地址 得到偏移地址,再利用WeChatWin.dll的内存地址 + 便宜地址就获得了基址,从而也可以看出,动态地址之所以会变动,是因为 WeChatWin.dll的内存地址变动了,在后续写代码时,可以先拿到 WeChatWin.dll 的内存地址,从而通过偏移获得对应所有的基址,再通过基址获得真正需要的数据。

这里通过计算器来计算一下,将计算器设置成为编程器

通过 Cheat Engine 获得 WeChatWin.dll 的地址

设置成 16进制显示

从图中可以看出 WeChatWin.dll 的地址为 6DB00000

计算器计算一下 6ED6D950 - 6DB00000 = 126D950

那么手机号的基址为: WeChatWin.dll + 126D950

通过这种方式获得对应的数据:

微信名:WeChatWin.dll+126D91C

微信号:WeChatWin.dll+126DA80

电话:WeChatWin.dll+126D950

头像:WeChatWin.dll+126DBE4

这里头像是需要主要的,因为头像是 PNG 图片,需要通过地址的方式去找到,一般就经验而言,它通常也会在内容周围

往下滑动一下,就找到了头像的url

随便选择一个,其地址为 6ED6DBE4 ,需要主要的是,该地址中存放的依旧是一个地址,在 C/C++ 中,其实就是一个指针,当我们获取该指针时,要获得指针中地址所对应的值。

有了这些值之后,就可以写代码来获取微信中的数据了,首先要写一个注入工具,这个注入工具可以将我们写的 DLL 注入到微信进程的内存中,其实很多工具都有这个功能,比如安装了 StrongOD 的 OD就可以直接将DLL注入。

结尾

在下一篇文章中,使用C++来写一个简单的注入工具,将恶意dll注入微信,实现hook微信的第一步。