x86游戏逆向之实战游戏线程发包与普通发包的逆向

网游找Call的过程中难免会遇到不方便通过数据来找的或者仅仅查找数据根本找不到的东西,但是网游中一般的工程肯定要发给服务器,比如你打怪,如果都是在本地处理的话就特别容易产生变态功能,而且不方便与其他玩家通信,所以找到了游戏发包的地方,再找功能就易如反掌了。

在游戏逆向过程中,通常会遇到下面几种情况的发包。

1.在主线程直接发包

游戏某功能-->组包-->加密-->发送

2.在线程中发包

Thread1:游戏某功能-->组包-->加密-->写缓冲区

Thread1:死循环->读缓冲区是否有内容->发送

主线程发包的话伪代码大致如下:

 

bool GameFunc(...)

{

if(xxx)

{

......

......

......

send(x,x,x,x);

}

}

线程发包大致伪代码如下:

 

char g_szBuf[4096]={0};

bool GameFunc(...)

{

if(xxx)

{

......

......

......

//打开互斥

WriteProcessMemory(...,g_szBuf......);

}

}

DWORD WINAPI ThreadProc(LPVOID lpParameter)

{

char szTmpBuf[4096]={0};

while(1)

{

//打开互斥

if(strlen(g_szBuf)!=0)

{

memcpy(szTmpBuf,g_szBuf);

ZeroMemony(g_szBuf);

}

//关闭互斥

send(....,szTmpBuf....);

ZeroMemony(szTmpBuf);

Sleep(10);

}

}

当然。。以上代码肯定有错误,大概就是表达个意思,就是一个是直接组好包就发 一个是在线程里面发

1.主线程发包

在游戏里面如何分辨是不是主线程发包?

首先肯定是跳转到3大发包函数,send , sendto ,WSASend 分别下段。 如果下断点马上就断下,那么基本就是线程发包了。除此之外,是主线程发包的可能性比较大了。

这种情况下,bp ws2_32.send下好断点后,只要Crtr+f9多跳几层,每层都打好断点就很容易判断出功能函数了

2.线程发包

那么线程发包是什么情况呢?

就是在发包函数上下断点马上就断下,而且断的非常的频繁,基本就可以确定是线程发包了。

找线程发包的主要步骤如下:

找到真正的发包函数, 找到包内容的位置。 再跟包内容的写入位置,基本就可以找到正确的明文包了。

接下来具体分析线程发包,跳出线程发包有两种方法,如果游戏发包不频繁,建议使用第一种方法,如果游戏发包异常多,建议使用第二种方法

下面的演示以天龙八部私服和官服分别演示,因为天龙八部私服发包不频繁所以用来演示第一种方法,具体操作就是 进游戏有下send断点,然后对数据包下硬件访问断点,我们去游戏选怪,硬件断点断下后,删除我们下的断点,然后Ctrl+f9一层一层返回,每次返回的CALL都下个断点,然后让游戏跑起来,跑起来后我们再选怪,对断下的地方进行分析

进游戏后 使用bp ws2_32.send下段,然后选怪,可以看到,立马就断下来了

断下来后,我们右键data参数,跳转到内存窗口

在内存窗口对这个内存首地址下断点,然后去游戏里面选怪

选怪后游戏立马又断下来,这时候我们跳到上一层,下断,再跳再下断,多下几个。然后让游戏跑起来,再选怪

然后断下来了,这就是选怪Call了。EAX就是怪物的ID,其他参数都可以获取到。这个Call就找到了

接下来是第二种方法:

为什么会产生这种方法呢?因为有的游戏发包太频繁了,你下好硬件断点后根本来不及操作就被游戏断点断下来了,所以不得已使用这种方法。

前面都是一样,下send断,然后对send的data参数下硬件断,这里会发现它一直断,不管你有没有做动作都一直断

这就有点烦,不好继续找,不要着急,我们来看看上面说的线程发包的流程

Thread1:游戏某功能-->组包-->加密-->写缓冲区

Thread1:死循环->读缓冲区是否有内容->发送

比方说你是游戏的程序员,你要实现组包,或者加密的时候如果是以下代码:

 

......

......

......

组包\加密

......

......

......

你是会把它们封装成一个函数还是把这段代码到处复制?应该是封装一个函数方便一点吧?

既然是这样,那就说明,你往数据缓冲区写包数据的时候之前肯定会调用某个公共函数,那我们只要分析硬件断点断下来的时候堆栈里面有没有公共函数就行了,然后我们去最外层的公共函数分析。我们下好硬件断点,然后分析一下有没有公共调用。

010ee852这个地址2个不同的包都调用了,说明这个有可能是公共函数。我们去这个函数下个断试试。

这个地址断是断下来了,可是比较频繁,但是根据观察 esp+8的值一直都在变动,我们下条件断点,过滤掉我们没有做动作就断下来的

设置好条件断点后 去游戏选怪,发现立马断下来了

然后我们Ctrl+f9往上一层跟,没跟几层发现一个似曾相识的函数

怎么样 简单吧!

原文链接:https://bpsend.net/thread-99.htm

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
汇编语言x86是一种低级编程语言,用于编写底层计算机程序。拼图游戏是一种益智游戏,玩家需要将拼图中的碎片按照预定的位置和方向正确拼合。下面是使用汇编语言x86实现一个简单的拼图游戏的示例。 首先,我们需要一个终端窗口(比如命令提示符窗口)来显示拼图的状态和交互信息。我们可以使用汇编语言编写一个程序来实现这个窗口。 然后,我们需要创建一个拼图的初始状态,这表示所有的拼图碎片的位置和方向。我们可以在内存中分配一段空间来存储这个拼图的状态,并使用汇编语言编写程序来初始化这个状态。 接下来,我们需要实现一个输入系统,以接收玩家的操作指令。这可以是通过键盘输入,然后使用汇编语言编写程序来读取和处理输入。 玩家可以使用方向键来移动和旋转拼图碎片。当玩家按下方向键时,我们可以编写汇编语言程序来更新拼图的状态。 同时,我们还需要一个绘图系统,将拼图的状态显示在终端窗口中。我们可以使用汇编语言编写程序,将拼图的状态转化为在终端窗口上的字符和颜色。 最后,我们需要一个判断系统,来判断当前拼图的状态是否已经完成。我们可以编写汇编语言程序来检测拼图的状态,并在拼图完成时给予玩家相应的提示。 通过使用汇编语言x86,我们可以实现一个简单的拼图游戏。当然,这只是一个简单的示例,实际上,实现一个完整的拼图游戏还需要考虑更多的细节和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪碧透心凉_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值