0%

windows调试器的使用,汇编语言逆向开发

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 (有更新)

如图

image-20210507133202708

如果你打开2.8.0.121被要求强制升级,先将安装2.6版微信并登录一次,再安装2.8。(方法仅供参考)
如果点击登录并扫码后提示“你的微信版本过低”。可以从我的github https://github.com/George-Guo-tech/wechatPc 下载带防更新补丁的更新版,或自己尝试如下:image-20210708161437476

这时我们打开 procexp.exe ,没有的话到微软官方网站下载sysinternals工具包

image-20210507134844407点击那个准星,拖到打开的微信的窗口上,它就自动帮我们定位到了进程,可以看到进程ID是11368

接下来打开windbg

image-20210507135115012点击file,attach to a process, 在弹窗的ProcessID输入刚刚找到的IDimage-20210507135225209

点击OK之后,你会发现微信的窗口怎么点都没反应,这是因为这个进程已经被windbg暂停了,如果你的windbg设置好了符号,你就可以看到windbg自动识别出来了微信进程所调用的所有dll模块,设置符号的方法如图所示:image-20210507135912353image-20210507135951315

可以按照我的格式设置

之后输入命令.reload 重新加载符号,再输入x wechatwin!*,这个命令能列出wechatwin.dll里的所有函数

image-20210507140327790

我们甚至可以看到有一个叫StartWachat的函数

输入命令lmDvmWeChatwin,我们可以看到公司名字是腾讯image-20210507140906143

输入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)开启后如图

image-20210506194832735此时php已经开始监听web端和hook端了,hook端将消息传到8686端口,php就能收到,php同样可以从8686发送消息给hook端

这时我们打开Web目录里的index.html,会看到image-20210506195438059服务端已经发现了这个web端,并赋予这个web端id为1

这时我们在web端点击绿色微信图标,点击新开一个image-20210506195830487红色的提示意思是没有发现在线的微信,这是因为我们还没有将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,我们就能进入到这个函数image-20210506203455919可以看到,这个函数又调用了一个叫WsServerint()的函数,我们再ctrl+左键点进去

看到这里又调用了一个叫WsServerListen的函数,我们同样点进去

这时就看到这里有一个对ws的监听函数,鼠标放在这个常量上,就知道了这个程序所使用的端口是6789

image-20210506201331646

接着打开WechatService.cpp,找到InjectDll函数,下断点。

接着按住ctrl+shift+f,或者在右上方搜索find in file,搜索clientconnect,接着回车,直到找到这个初始化连接服务端的函数,同样下断点现在我们运行程序,确保选择Debug x86模式。

大约五秒后程序会断在上边的断点,按f11进入函数,再按f10一直到 第110行,这时我们再按一次,php上就会跳出image-20210506212217272可以看到php接受了id为2的微信

这时wechatrobot.exe已经连上了php,我们再进入web端点击新开一个

不过在此之前,再网页里按f12打开开发者工具,点击如图所示

image-20210506214749046之后会弹出搜索框,在搜索框输入如图所示image-20210506214907259

点击找到的函数 send(msg),同样在296行下断点

这时回到页面,此时页面已经触发断点image-20210506215213881这时点击控制台(console),输入ws,我们就可以看到现在ws变量的值,如图image-20210506220714399我们看到这条ws消息发送到到本机的5678端口,那么我们打开资源监视器,

点击网络,点击侦听端口,我们看到php监听了5678端口,那么如果我们继续发送,php一定能收到

image-20210506220601087

点击开发者工具的继续,我们看到php跳出一条消息image-20210506221428836

我试了好几次,都弹出这条消息。这是为什么呢?回到VS一看,原来我们的wechatrobot.exe还在调试暂停状态,刚刚运行完 第110行 如图

image-20210507141812249

我们直接继续让wechatRobot运行起来,就可以看到 transit wechat message:(意思就是:中转来自wechat的消息),仔细观察这一大串日志,image-20210506222215890我们发现"timestamp":"1620368375566","wechatId":null,"opCode":0,这里的timestamp是unix时间戳,opcode代表的操作码在 opCode.h 中,如下图:,我们只需要注意wechatid,这里的 null 代表没有image-20210507142703483

也就是说我们还没有将wechatRobot.exe和微信exe进程连接起来,这时我们需要再次点击新开一个,不过在此之前,先找到下图下断点image-20210507145439018之后我们点击新开一个,断点就断在这个位置,我们在Locals找data的值,找不到的话如图:image-20210507145601653点击放大镜查看,我们发现一个wechatid发送了操作指令16。image-20210507145752578

还记得指令16是什么吗?十进制的16就是十六进制的10,也就是新开一个微信客户端命令image-20210507151056017也就是说,WeChatRobot成功接收到web端的指令了

步骤3 hook端连接微信exe程序

继续执行wechatRobot,我们又遇到一个断点,是我们最开始在InjectDLL下的断点,我们可以看到这里hook端启动了一个新的微信exe

image-20210507152408184这时我们看一下locals里 pi.dwProcessId的值为11488,还记得我们的微信PID是11368image-20210507152618881所以这里我们需要双击Value栏,把dwProcessID改成11368,也就是让hook端hook正在运行的微信exe,而不是如图(11488的微信exe)image-20210507153059775修改后,再次运行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,可以看到加载符号的最后一行就已经有了我们注入的wechatDllimage-20210507162213449

确认dll加载后,我们回到VS,看到断点 第254行,autos或locals里的data变量的值如图右所示

image-20210507162411091我们查看一下操作指令144,打开计算器选择十进制,输入144后点十六进制,如图得到90

image-20210507162911296

image-20210507162958471

找到对应的操作码后我们发现这是把二维码发送给web端,接着我们按F11进入WsServerRecvCallback函数,再按F10一句一句一直运行到第90行,image-20210507164307350然后点击command window,输入? (char *)json回车image-20210507164222087

然后F10,就会发现php直接就接收到了一模一样的消息,而且在二维码在web端也已经显示了出来。如果你在websocket.js 第356行 下了断点,你会发现这是因为网页端收到了php转发来的二维码消息,image-20210507172250461

现在我们已经实现了从微信exe到web端的消息通信,现在只需要在VS里继续运行wechatRobt,在windbg里继续运行微信exe程序,所有作者项目里实现的功能就都能够使用了,已实现hook的功能

步骤4 开始调试wechatdll,进行二次开发

打开VS,打开wechatdll.sln,选择调试 --附加到进程-- 选择已经注入dll的微信exe进程

即可

直接从Web端操作的另一种方法

视频演示