网游找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参数,跳转到内存窗口https://bpsend.net/thread-99.htm

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

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

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

接下来是第二种方法:

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

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

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

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

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

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


......

......

......

组包\加密

......

......

......

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

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

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

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

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

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

怎么样 简单吧!

x86游戏逆向之实战游戏线程发包与普通发包的逆向的更多相关文章

  1. DirectX12 3D 游戏开发与实战第八章内容(下)

    DirectX12 3D 游戏开发与实战第八章内容(下) 8.9.材质的实现 下面是材质结构体的部分代码: // 简单的结构体来表示我们所演示的材料 struct Material { // 材质唯一 ...

  2. 【读书笔记《Android游戏编程之从零开始》】20.游戏开发基础(游戏数据存储)

    对于数据的存储,Android 提供了4种保存方式. (1)SharedPreference 此方法适用于简单数据的保持,文如其名,属于配置性质的保存,不适合比较大的情况,默认存放在手机内存里 (2) ...

  3. 【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)

    在一款游戏中,除了华丽的界面 UI 直接吸引玩家外,另外重要的就是游戏的背景音乐与音效:合适的背景音乐以及精彩的音效搭配会令整个游戏上升一个档次. 在 Android 中.常用于播放游戏背景音乐的类是 ...

  4. Unity 4.2.0 官方最新破解版(Unity3D 最新破解版,3D游戏开发工具和游戏引擎套件)

    Unity是一款跨平台的游戏开发工具,从一开始就被设计成易于使用的产品.作为一个完全集成的专业级应用,Unity还包含了价值数百万美元的功能强大的游戏引擎.Unity作为一个游戏开发工具,它的设计主旨 ...

  5. 【逆向&编程实战】Metasploit中的安卓载荷凭什么吊打SpyNote成为安卓端最强远控

    文章作者:MG1937 QQ:3496925334 CNBLOG:ALDYS4 未经许可,禁止转载 前言 说起SpyNote大家自然不陌生,这款恶意远控软件被利用在各种攻击场景中 甚至是最近也捕获到了 ...

  6. 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了

    地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图

  7. 丢沙包游戏(或杀人游戏)的C语言实现

    丢沙包游戏(或杀人游戏)用C语言实现: 游戏简述: 杀人游戏(或者丢沙包游戏),设定一些人(人数为:num)一起玩游戏,从某个指定的人(设定为:start)开始轮流扔沙包,扔沙包人的下一个人为1,每隔 ...

  8. 使用cocos2d 2.1制作一条河游戏(4): 主要的游戏逻辑BaseLayer设计

    前段时间一直忙着.没有时间更新博客.今天,仍然需要一段时间才能实现对游戏的一小部分,最后打动他. BaseLayer.h: #import <GameKit/GameKit.h> #imp ...

  9. python小练习:使用循环和函数实现一个摇骰子小游戏。游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“大”,3<=总值<=10为“小”。然后告诉玩家猜对或者是猜错的结果。

    python小练习:使用循环和函数实现一个摇骰子小游戏.游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“ ...

  10. Unity 2D游戏开发教程之游戏精灵的开火状态

    Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 “开火”就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌 ...

随机推荐

  1. Windows编程----进程:命令行参数

    什么是进程的命令行参数 每个进程在启动(双击exe启动.cmd命令行启动或者由其他程序通过CreateProcess启动)的时候,都会有一个命令行参数给它.命令行的参数以空格区分.这个命令行总是不为空 ...

  2. openpyxl 写入字典

    def write(self,data_path, sheetname,value): index = len(value) workbook = openpyxl.Workbook() sheet ...

  3. JetBrains goland、pycharm、webstorm、phpstorm 对比两文件内容是否一致

    对比文件 JetBrains goland.pycharm.webstorm.phpstorm 对比两文件内容是否一致 第一种 打开文件,按住键盘上的CTRL键,然后鼠标右键,点击菜单中的" ...

  4. MongoDB 复制集机制及原理

    复制集的作用 MongoDB 复制集的主要意义在于实现服务高可用. 它的现实依赖于两个方面的功能: 数据写入时将数据迅速复制到另一个独立节点上 在接受写入的节点发生故障时自动选举出一个新的代替节点 在 ...

  5. Audio DSP 链接脚本文件解析

    上篇文章(智能手表音乐播放功耗的优化)讲了怎么优化音乐场景下的功耗,其中第二点是优化memory的布局.那么在哪里优化memory的布局呢?就是在本文要讲的链接脚本(ld)文件里.作为audio DS ...

  6. unigui显示websocket服务端向客户端发送信息【15】

    用WebSocket从服务端直接发送消息给all客户端. 1.在ServerModule 放TUniThreadTimer 2.timer event: procedure TUniServerMod ...

  7. 🎀SpringBoot启动创建系统托盘及功能

    简介 SpringBoot启动时,创建系统托盘,提供打开主程序及退出功能. 实现 启动类添加构造函数 public TjtoolApplication() { initUI(); } private ...

  8. 通过 Python 在PDF中添加、或删除超链接

    PDF文件现已成为文档存储和分发的首选格式.然而,PDF文件的静态特性有时会限制其交互性.超链接是提高PDF文件互动性和用户体验的关键元素.Python作为一种强大的编程语言,拥有多种库和工具来处理P ...

  9. UTC时间与正常时间相互转换的shell脚本

    UTC时间转换的shell脚本 前言 摸鱼感想 昨天被UTC时间,系统时间的转换的代码绕得有点晕, 最后,不饶了,我当天的任务是搞一个嵌入式测试而已!!!开摆! 于是在网上找了半天没找到合适的时间转换 ...

  10. 微信小程序/H5 调起确认收款界面

    微信小程序/H5 调起确认收款界面详解(附代码+平台兼容处理) 场景:用户点击「收款」按钮后,系统调起微信收款组件,用户确认后完成转账或收款流程.该能力广泛用于现金营销.二手交易.佣金报酬.企业赔付等 ...