admin管理员组

文章数量:1616675

游戏启动的一般架构

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

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

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

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

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

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

首先看命令行

发现直接打开是失败的

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

改一下命令行 发现寄了

再改回来发现也不能启动

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

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

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

直接附加断下

 

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

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

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

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

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

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

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

time1 - time2 就是了esi就是time1  

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

 把这个字符串传入

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

多开的实现:

.

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

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

 

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

ret过去后发现他又 WaitForsingleObject来减少引用计数

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

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

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

本文标签: 流程游戏