微信PC端技术研究(3)-如何找到消息发送接口

二进制安全 2019-11-10

准备工具:Cheat EngineOllyDbgIDA

前一篇()已经说过 CE 是什么,也应用 CE 研究了如何保存微信语音,这篇继续使用 CE 和 OD 来研究一下微信的消息发送接口。

思路大概是这样:在消息框中输入内容之后,通过 CE 找到内容地址,然后通过内存断点来找到发送该数据的相关代码,从而找到消息发送接口。

分析过程

查找关键数据地址

在输入框输入一个比较特别的文字内容(避免搜索时太多内存选项)后,使用 CE 搜索该内容地址。

由于已经知道确切的消息内容,很容易就能通过 CE 的 Exact value->String 来找到内容地址,修改内容多次筛选,最后留下两个结果(详细操作见上一篇文章)。

img

通过 CE 修改一下内存的内容,微信输入框中内容同步改变,说明这个内存地址就是输入框中内容地址,最终确认地址是2A1E1A8

接着在点击发送按钮之后,输入框内容会被清空,所以第一想法就是对内存地址下内存写入断点,可以找到发送过程中清空内容的代码。

打开 OD,挂载到 WeChat.exe 进程,在右下角数据窗口 Ctrl+G 输入2A1E1A8,然后右键选择断点->内存写入断点。

img

F9 让 OD 跑起来,然后点击微信发送按钮,没想到意外发生了,输入框内容清空了,但是断点却没有触发。

怎么回事?断点弄错?地址找错?暂时没有答案。

用 CE 多次重复前面的操作,地址依然是这个地址,断点就是不触发。

通过 OD 查看到,在输入框清空后,2A1E1A8的内容确实没有变化,和发送前一样,并且在重新输入新的内容之后,该内存内容同步更新。

所以结论就是输入框内容地址确实是2A1E1A8,但是清空输入框并不是清空该内存内容,猜测编辑框可能通过控制字符串长短来控制显示的,清空输入框内容就是设置字符串长度为 0。

找到输入框类

清空输入框没有进展了,那怎么办呢?

尝试去找了其他数据,比如发送按钮的发送(S),发送按钮的提示内容不能发送空白内容等等,数据地址也可以很快找到,但是和我们的分析目标偏的太远了。

几番折腾后,作罢。

转念一想,清空不行,发送总的读取输入框中内容吧,那换成内存访问断点尝试一下。

依然是在右下角数据窗口 Ctrl+G 输入2A1E1A8,然后右键选择断点->内存访问断点。

img

完成后回到微信界面,没想到直接断下了,我还没点发送按钮呢。根据以前的经验,下意识就觉得是界面刷新显示文字触发了断点,这可能会影响分析,根本没办法通过发送按钮来触发内存访问断点。

img

一般解决方法有:

1、条件断点。也就是屏蔽掉刷新界面触发的断点,但是好像内存断点不支持条件断点啊,要么通过脚本来完成,好麻烦。

2、找其他切入点。废话,清空那边的路都断了,死心吧。

3、其他我不知道的...

放弃了一般的解决方法,我决定看看本次断点究竟干嘛了。

注意到断点的位置不是微信模块WeChatWin.dll中,而是在msftedit.dll,很少见的一个模块。根据目录可以看到是微软系统的一个模块,名字中的edit也可以看出这应该是一个编辑框相关的模块。

可执行模块, 条目 20
基址=6F050000
大小=00094000 (606208.)
入口=6F05D53D msftedit.<ModuleEntryPoint>
名称=msftedit (系统)
文件版本=5.41.21.2510
路径=C:\Windows\System32\msftedit.dll

好像和我们的分析目标很贴近嘛,在 OD 中数据窗口右键断点->删除内存断点,然后按下 Alt+F9 回到用户模块领空,也就是跳过系统模块的代码,直接回到微信的模块代码中,省过对系统代码的分析。

看到返回到6E20CCC2这个地址,上一行代码就是调用msftedit.dll的函数,我们对其下一个断点,鼠标点击到6E20CCBF这行代码,按下F2下一个int 3断点,然后F9跳过本次分析。

img

OD 继续断下,此次直接断在了6E20CCBF这个位置,可以看到call调用了msftedit.6F05AD69,这是个什么函数呢?

img

既然msftedit.dll是微软模块,那么肯定是有符号的嘛,嘿嘿。

这里可以直接在 OD 中加载符号来分析,使用方法是:

1、在 WingDbg 目录下拷贝 dbgeng.dll,dbghelp.dll,srcsrv.dll,symbolcheck.dll,symsrv.dll,symsrv.yes,一共 6 个文件至 OD 目录下。

2、打开 OD,设置符号路径。调试--->选择符号路径。

3、设置 StrongOD 的插件选项。选择加载符号。

原文:

https://blog.csdn.net/sr0ad/article/details/8253311

但是只支持本地符号,也就是得自己下载了模块对应符号到本地,OD 设置符号文件路径后,才能正常使用,有点麻烦。

我这时候一般就会使用 IDA 了,因为它会自己在线下载模块对应的符号,很方便。

用 IDA 打开msftedit.dll,等待些许时间,IDA 下载符号,解析等等完成后,我们去找到msftedit.6F05AD69对应的函数究竟是个什么东西。

但是这里msftedit.6F05AD69的模块基址是6F050000,而 IDA 解析使用的是默认基址0x6FCD0000,要么修改IDA解析基址为6F050000,等待 IDA 重新解析,要么通过偏移计算对应地址。

再解析等太久,直接计算吧,所以要安利我写的一个小工具([偏移计算工具](https://mp.weixin.qq.c


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论