找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4|回复: 4

寻微渐进-拆解韩服55端-3

 火... [复制链接]

5590

主题

4万

回帖

17万

积分

神功绝世

积分
170048
发表于 1 小时前 | 显示全部楼层 |阅读模式
上篇我们说到通过DebugConfig.txt用来拆解客户端,这次我们更进一步收集信息,为后续铺路。在这个系列开篇我们曾经涉及过这里

为什么我说这个地方比较经典和重要呢!因为这个地方涉及到整个客户端和服务端交互的内核,驱动客户端有两类协议,ENUM_CMDPACKET系列和ENUM_NOTIPACKET系列,这点你点开off_9C94E8 跟 off_9C92D0 也是可以确定的,而这个方法你可以理解是客户端分发协议的入口,拿住了这里就能接管所有协议流向。它的调用者来自于客户端的套接字类,此类内部封装了recv(tcp协议交互)用来和服务端进行通讯,上层负责拆包和防止粘连,这个方法负责解密封包。为了方便分析,我们将sub_40C5C0命名为OnServerResponse,sub_418400命名为OnServerNotify。不过这里需要的注意到的就是sub_7DC5D0,这个方法内部会读取一个缓存区,每次读取缓存区一个字节,然后将缓存区指针往后推,为了理解起见,我们将其命名为Packet_ReadByte,缓存区对象命名为g_PacketReadPtr,那么伪代码就变成了

如果你用ida看g_PacketReadPtr的交叉引用,会发现还有不少其他的方法,读取2字节数据,读取4字节数据,读取指定缓存长度,实际上都是客户端对协议包字段拆解的二次封装,都进行相关命名即可,这些交叉引用还有个地方注意一下sub_7DC5C0,这里是设置缓存区指针的地方。其调用者也是在我们截图1这个方法里面,这个方法比较长,我分开贴伪代码

跳过无用代码

为了方便我们模拟端通讯调试封包,我们需要用dll hook掉 XorRorCipher,它的内部是这样的

没什么多说的,直接patch 007B6000这个地址,函数尾部指令是C3 说明无需考虑堆栈平衡,直接用C3即可,当然如果你也可以选择不patch这个方法,自己分析这个方法补齐在你的服务端也不是不行,见仁见智吧。
做完这些你直接写一个tcp服务端就可以正常和我们客户端通讯了,接下来如何让客户端主动连接到我们自己的服务端呢!这点我们可以根据第二篇文件中读取DebugConfig.txt的方法进行上层追溯,看看它是如何区别本地调试模式和网络通讯模式的,于是我们来到另一处位置00409880,打开伪代码看拉到最后,为了方便理解我命名了一下

你可以看到这两个分支点,我们只需要关注第一处圈起来的地方,只要你能正确伪造环境,就能直接让我们客户端连接到我们所指定的服务端了,通过动态追码 发现首要需要保证命令行存在10个或以上的参数即可进入第一层判定,命令行分割符号为? 然后在00409880的头部,我们可以看到有分支点设置g_bDebugMode的值,我们不能让它设置g_bDebugMode为true,让其满足第二层判定。所以经过一顿操作猛如虎,把命令行弄出来就完事了,12?127.0.0.1?7601?test?abcdef?0?60?50000?500?0?0?0?0
基本上到了这里,客户端该处理的工作就已经全部做好了,如果不出意外。此时的你应该可以通过自己写的服务端正常和客户端通讯了。
有了DebugConfig_ParseAndLoad(DebugConfig.txt)拼接躯干,有了DispatchGamePacket(协议分发)拼接神经,下一篇,我们再说说如何找到脑子[表情:捂嘴笑]
阿荣社区欢迎你(bbs.vul7.com)
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层
[表情:真棒]看不懂,但是牛
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
有没有一种可能,现在可以 mcp一把梭
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
手搓服务端吗?[表情:真棒]
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
[表情:真棒]顶
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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