¶windows本地调试器 (有更新)
常用的调试器有很多,基本上所有编程语言的IDE都会带有调试的功能,python的pycharm, jupyter notebook, java的 eclipse,intelliJ, c++的visual studio
Windows本地调试器(以Windbg为例)不同于编程语言的调试,Windbg调试的对象是一个程序所调用的windows操作系统的API,例如使用USER32!CreateWindowExA创建窗口和使用ws2_32.dll来访问网络
接下来,结合编程语言的调试(源码调试)和操作系统API的调试,就能对项目进行深入的研究
即便是在没有源码的情况下,windows本地调试也能给我们一些线索,帮助逆向开发
¶大佬的Github源码
https://github.com/chengciming/wechatPc
下载源码,我们就可以开始了
国内可以使用gitee,一些github加速网站,以及一些github镜像网站
不想自己下载可以加群 147694968
求助源码
将wechatPc-master.rar文件下载到本地后,解压到当前文件夹
wechatRobot目录内是执行注入操作的wechatRobot.exe的项目源码
wechatdll目录内是需要被注入的wechatdll.dll的项目源码
Bin目录是这两个项目的成品输出目录
¶步骤+演示
¶大佬的github上给出了项目的通信机制
通讯流程:WechatDll(注入到微信) <–> [WS] <–> WechatRobot(操作界面) <–> [WS] <–> ServerPhp(服务端) <–> [WS] <–> Web(HTML操作界面)
我们以此流程来进行
¶步骤0 开启微信2.8.0.121 (有更新)
如图
如果你打开2.8.0.121被要求强制升级,先将安装2.6版微信并登录一次,再安装2.8。(方法仅供参考)
如果点击登录并扫码后提示“你的微信版本过低”。可以从我的github https://github.com/George-Guo-tech/wechatPc 下载带防更新补丁的更新版,或自己尝试如下:
这时我们打开 procexp.exe ,没有的话到微软官方网站下载sysinternals工具包
点击那个准星,拖到打开的微信的窗口上,它就自动帮我们定位到了进程,可以看到进程ID是11368
接下来打开windbg
点击file,attach to a process, 在弹窗的ProcessID输入刚刚找到的ID
点击OK之后,你会发现微信的窗口怎么点都没反应,这是因为这个进程已经被windbg暂停了,如果你的windbg设置好了符号,你就可以看到windbg自动识别出来了微信进程所调用的所有dll模块,设置符号的方法如图所示:
可以按照我的格式设置
之后输入命令.reload
重新加载符号,再输入x wechatwin!*
,这个命令能列出wechatwin.dll里的所有函数
我们甚至可以看到有一个叫StartWachat
的函数
输入命令lmDvmWeChatwin
,我们可以看到公司名字是腾讯
输入lmDvmWeChatdll
,会发现什么都没有,这是因为我们还没有注入我们的wechatdll.dll
¶步骤1 开启php服务端和web端
首先介绍这个项目的结构和功能,这个项目的根本功能是:在web端(web目录下的index.html)里我们的所有操作都能转化成微信exe进程的操作。
每当我们在web端点击新开一个微信并且登录进去,php服务端(相当于一个ws服务器)以及hook端(wechatRobot.exe)就将这个微信账号和一个微信的exe进程相联系起来。具体的实现方法是将web端发送的ws(websocket, 不懂请看我关于websocket的文章)操作指令包转发给微信exe进程,从而实现在web端控制exe。
php服务端会一直检测当前的web进程以及wechatrobot.exe进程,将所有web端的操作和消息转发给wechatrobot.exe,wechatrobot.exe验证web端身份后将消息发给对应的微信exe
首先开启php服务端(index.php),这需要装有compser的php环境,要么自己安装php和composer,
要么加群下载vender.rar并解压到ServerPhp目录。
之后就可以运行index.php了, 进入ServerPhp文件夹,按住shift右键空白处,选择在此处打开powershell,
进入powershell后,输入命令../phpbin/php.exe index.php
,(如果你使用自己安裝的php环境,就直接使用命令php index.php
)开启后如图
此时php已经开始监听web端和hook端了,hook端将消息传到8686端口,php就能收到,php同样可以从8686发送消息给hook端
这时我们打开Web目录里的index.html,会看到服务端已经发现了这个web端,并赋予这个web端id为1
这时我们在web端点击绿色微信图标,点击新开一个红色的提示意思是没有发现在线的微信,这是因为我们还没有将hook端连接到服务器
¶步骤2 hook端连接web端
打开hook端(Bin/Debug或Release目录下的wechatRobot.exe),为了更清楚的了解wechatRobot.exe的作用,我们不仅要打开,还要调试这个程序。这就需要我们在Visual Studio中,打开WechatRobot目录里的wechatRobot.sln
我们可以看到wechatrobot.cpp里开启了两个线程,一个是连接微信exe的ws,一个是连接web服务端的ws,按住ctrl点击WebSocketMonitor,我们就能进入到这个函数可以看到,这个函数又调用了一个叫WsServerint()的函数,我们再ctrl+左键点进去
看到这里又调用了一个叫WsServerListen的函数,我们同样点进去
这时就看到这里有一个对ws的监听函数,鼠标放在这个常量上,就知道了这个程序所使用的端口是6789
接着打开WechatService.cpp,找到InjectDll函数,下断点。
接着按住ctrl+shift+f,或者在右上方搜索find in file,搜索clientconnect,接着回车,直到找到这个初始化连接服务端的函数,同样下断点现在我们运行程序,确保选择Debug x86模式。
大约五秒后程序会断在上边的断点,按f11进入函数,再按f10一直到 第110行,这时我们再按一次,php上就会跳出可以看到php接受了id为2的微信
这时wechatrobot.exe已经连上了php,我们再进入web端点击新开一个
不过在此之前,再网页里按f12打开开发者工具,点击如图所示
之后会弹出搜索框,在搜索框输入如图所示
点击找到的函数 send(msg),同样在296行下断点
这时回到页面,此时页面已经触发断点这时点击控制台(console),输入ws,我们就可以看到现在ws变量的值,如图
我们看到这条ws消息发送到到本机的5678端口,那么我们打开资源监视器,
点击网络,点击侦听端口,我们看到php监听了5678端口,那么如果我们继续发送,php一定能收到
点击开发者工具的继续,我们看到php跳出一条消息
我试了好几次,都弹出这条消息。这是为什么呢?回到VS一看,原来我们的wechatrobot.exe还在调试暂停状态,刚刚运行完 第110行 如图
我们直接继续让wechatRobot运行起来,就可以看到 transit wechat message:(意思就是:中转来自wechat的消息),仔细观察这一大串日志,我们发现
"timestamp":"1620368375566","wechatId":null,"opCode":0
,这里的timestamp是unix时间戳,opcode代表的操作码在 opCode.h 中,如下图:,我们只需要注意wechatid,这里的 null 代表没有
也就是说我们还没有将wechatRobot.exe和微信exe进程连接起来,这时我们需要再次点击新开一个,不过在此之前,先找到下图下断点之后我们点击新开一个,断点就断在这个位置,我们在Locals找data的值,找不到的话如图:
点击放大镜查看,我们发现一个wechatid发送了操作指令16。
还记得指令16是什么吗?十进制的16就是十六进制的10,也就是新开一个微信客户端命令也就是说,WeChatRobot成功接收到web端的指令了
¶步骤3 hook端连接微信exe程序
继续执行wechatRobot,我们又遇到一个断点,是我们最开始在InjectDLL下的断点,我们可以看到这里hook端启动了一个新的微信exe
这时我们看一下locals里 pi.dwProcessId的值为11488,还记得我们的微信PID是11368
所以这里我们需要双击Value栏,把dwProcessID改成11368,也就是让hook端hook正在运行的微信exe,而不是如图(11488的微信exe)
修改后,再次运行wechatRobot。这时就已经将dll注入到了PID11368微信exe,这个dll会不停的监控微信exe的活动并转发给WechatRobot
我们的微信还在windbg中暂停状态,在windbg中输入qd
命令,就会退出debug但保留exe进程
在我们qd
之前,先在图示WebsocketListen.cpp文件中ctrl+F搜索关键词”接收“,这就是WechatRobot处理dll转发来的数据的函数,我们在第254行下断点!
在qd
的一瞬间,微信就已经运行了起来,同时VS的断点就触发了,这时因为我们注入的dll运行起来了,并且转发了一条消息到wechatRobot,我们先不管VS,我们再次打开windbg,附加到进程11368,可以看到加载符号的最后一行就已经有了我们注入的wechatDll
确认dll加载后,我们回到VS,看到断点 第254行,autos或locals里的data变量的值如图右所示
我们查看一下操作指令144,打开计算器选择十进制,输入144后点十六进制,如图得到90
找到对应的操作码后我们发现这是把二维码发送给web端,接着我们按F11进入WsServerRecvCallback函数,再按F10一句一句一直运行到第90行,然后点击command window,输入
? (char *)json
回车
然后F10,就会发现php直接就接收到了一模一样的消息,而且在二维码在web端也已经显示了出来。如果你在websocket.js 第356行 下了断点,你会发现这是因为网页端收到了php转发来的二维码消息,
现在我们已经实现了从微信exe到web端的消息通信,现在只需要在VS里继续运行wechatRobt,在windbg里继续运行微信exe程序,所有作者项目里实现的功能就都能够使用了,已实现hook的功能
¶步骤4 开始调试wechatdll,进行二次开发
打开VS,打开wechatdll.sln,选择调试 --附加到进程-- 选择已经注入dll的微信exe进程
即可