游戏启动流程的逆向分析与多开的实现

游戏启动的一般架构

  1. 登录器程序 启动游戏主程序 游戏中完成登录
  2. 登录器完成登录 传送token至游戏客户端 游戏根据token 登入账号
  3. 客户端直接启动

为什么不能直接启动呢?而必须要通过登录器来启动?

网络游戏面对很多的情况。

  1. 游戏的版本,登录器启动的情况下就可以验证一下版本 版本不行就可以更新一下,自己更新自己是不太好,当然也有一种就是热更新,但是热更新中间也是有跳板来做的,更新的文件,如果是更新这个程序,热更新也是很难去操作的
  2. 主程序可能会被别人破坏 如果是做了硬件补丁 登录器可以把文件读一下,发现crc32或者摘要跟记录的不一样,就拒绝启动,并提醒修复一下,不让直接启动,所以主程序里也有验证的机制 所以分析这个东西的时候,第一要分析登录器是怎么启动的,启动前做了什么操作,还要分析为什么不启动,其实当我们手动打开程序的时候,其实是已经启动了,只不过后面又退出了  why?
  3. 登录器里输入账号密码的情况,除了要分析启动是怎么启动的,还要分析登录是怎么登录的比较low的 就是登录器启动的时候 把账号密码传递给 主程序(很少)大部分都是登录器会和服务器进行通信,这个时候就会把账号和密码传递给服务器,服务器这个时候就会验证,不通过就告诉你账号密码不对,通过的话,就返回一个字符串,是一个过的东西  叫token,相当于一种凭证,把这个token传递给主程序,主程序拿到这个token又会找服务器,服务器生成了token肯定是有记录的,知道账号密码,直接就在游戏里把账号密码给它了(近几年的架构) 
  4. 直接启动,一般是ui的操作

一般这些都是进程间的通信,进程间通信一般用的也就这几种

  1. 命令行   (用的最多的)可能会做一些限制性的东西来排除人工手动的操作
  2. 油槽管道  (稍微隐蔽一点)通过api还是能看到
  3. 共享内存      (很隐蔽)这是最难做的 最终还要从内存的读写去看
  4. 消息队列     (特别少)
  5. 信号量互斥量   

首先看命令行

发现直接打开是失败的

游戏启动流程的逆向分析与多开的实现_第1张图片

 不过把用登录器启动的命令行复制下来 发现启动成功了。

改一下命令行 发现寄了

再改回来发现也不能启动

发生变化的点就是 时间 或者这个应用程序没关闭有什么隐藏的东西还在和游戏通信

这样就来看下为啥启动不了。

这个弹窗一看就是用messagebox 来弹出的

直接附加断下

游戏启动流程的逆向分析与多开的实现_第2张图片

 游戏启动流程的逆向分析与多开的实现_第3张图片

发现 是从这个mov过来的  那肯定是有个跳转跳来了

分析模块 看看是从哪里跳来的

游戏启动流程的逆向分析与多开的实现_第4张图片

 发现了这个GetTickCount 发现这个函数来获取时间 这下就知道了。。

原来是因为时间的问题
然后做了某一个计算

但在cmp eax,1D4C0才使用了它  转下10进制发现是120000 也就是 120秒这下就真相大白了。。

命令行有一个包含时间的数据,

 这个差值超过120秒就拒绝启动

time1 - time2 就是了esi就是time1  

游戏启动流程的逆向分析与多开的实现_第5张图片

前面又有一个这个函数来获取命令行 那肯定就是这一串了

 把这个字符串传入

这个函数 基本可以确定是转数字   

多开的实现:

.

因为这个游戏只能打开三个客户端首先猜测是 信号量

首先对其入口点注入阻塞住 ,然后附加 断下信号量函数

游戏启动流程的逆向分析与多开的实现_第6张图片

 

 发现创建了个信号量 名字是GameLogicSemaphoreBG 初始是3 3 
也就是说初始引用计数是3 最大是3

ret过去后发现他又 WaitForsingleObject来减少引用计数
游戏启动流程的逆向分析与多开的实现_第7张图片

那只需要找个地方直接ReleaseSemaphore来恢复就行了

直接初始化模块初始化的时候加上这几句就完了

​​​​​​​HANDLE Event = OpenSemaphoreA(SEMAPHORE_ALL_ACCESS, FALSE, "GameLogicSemaphoreBG");
    if (NULL == Event)CreateSemaphoreA(NULL, 3, 3, "GameLogicSemaphoreBG");
    ReleaseSemaphore(Event, 1, 0);
    return TRUE;

你可能感兴趣的:(C++测试角度,c++,windows)