ep1h/alien-shooter-multiplayer

GitHub: ep1h/alien-shooter-multiplayer

通过逆向工程为2003年经典游戏Alien Shooter添加完整多人联机对战功能的C语言项目。

Stars: 19 | Forks: 2

# alien-shooter-multiplayer Alien Shooter 是一款于 2003 年发布的单人等轴俯视视角射击游戏。本仓库包含了对该游戏进行逆向工程及 C 语言开发的成果,实现了游戏的网络对战功能。 ## 导航 - [仓库导航](#Repository-navigation) - [前置条件](#Prerequisites) - [构建](#Build) - [注入到游戏进程](#Injection-in-game-process) - [服务器-客户端架构](#Server-client-architecture) - [演示](#Demonstration) ## 仓库导航 - [/asmp-dll](/asmp-dll) - 客户端源代码。客户端是一个 .dll 库;将其注入到游戏进程中可以扩展游戏逻辑以实现网络对战。 - [/asmp-dll/src/game](/asmp-dll/src/game) - 与游戏交互的 API。包含通过逆向工程获得的数据类型、函数地址和全局对象。 - [/asmp-dll/src/game/types](/asmp-dll/src/game/types) - 游戏类型。 - [/asmp-dll/src/game/addresses.h](/asmp-dll/src/game/addresses.h) - 函数和数据地址列表。 - [/asmp-dll/src/multiplayer](/asmp-dll/src/multiplayer) - 顶层客户端实现和多人游戏逻辑。 - [/asmp-dll/src/multiplayer/client](/asmp-dll/src/multiplayer/client) - 顶层客户端实现。 - [/asmp-dll/src/dllmain.c](/asmp-dll/src/dllmain.c) - 入口点。一切从这里开始。 - [/asmp-dll/src/utils/hook](/asmp-dll/src/utils/hook) - 用于函数挂钩 (hooking) 的组件。 - [/asmp-server](/asmp-server) - 服务器源代码。该服务器是一个 32 位 Windows 可执行文件。 - [/asmp-exe-patcher](/asmp-exe-patcher) - 补丁程序源代码。该补丁程序修改原始的 AlienShooter.exe,使其在启动时自动注入网络对战客户端 (asmp.dll)。详情请参阅 ["注入到游戏进程"](#Injection-in-game-process) 章节。 - [/common](/common) - 服务器和客户端共用的组件和头文件(容器、互斥锁、网络协议头等)。为了避免代码重复并简化构建特定项目部分(服务器/客户端/补丁程序/测试)的 makefiles 逻辑,通用逻辑被放置在此目录中。 - [/common/src/net](/common/src/net) - 底层客户端-服务器源代码。 - [/common/src/utils/containers](/common/src/utils/containers) - 标准容器实现([list](/common/src/utils/containers/list)、[map](/common/src/utils/containers/map)、[FIFO/LIFO 优先队列](/common/src/utils/containers/pqueue)、[FIFO/LIFO 队列](/common/src/utils/containers/queue))。 - [/common/src/utils/mem](/common/src/utils/mem) - 内存分配器。 - [/game](/game) - 修改后的游戏文件。目前包括菜单标记文件 和菜单逻辑描述文件。 - [/test](/test) - 关键逻辑的单元测试。 - [/AlienShooter.exe.idb](/AlienShooter.exe.idb) - IDA 数据库,包含通过逆向工程游戏可执行文件 发现的所有信息。 ## 前置条件 ### OS Windows * 确保已安装 **GCC** 和 **Make**。 * 根据您的安装情况,`make` 命令可能会被称为 `mingw32-make`。如果 `make` 不起作用,请尝试使用 `./mingw32-make` 代替。 ### OS Linux 安装 Make: ``` apt-get install make ``` 安装 Mingw: 对于 32 位系统: ``` apt-get install mingw32 ``` 对于 64 位系统: ``` apt-get install mingw-w64 ``` ## 构建 1. 克隆仓库: ``` git clone https://github.com/ep1h/alien-shooter-multiplayer ``` 2. 导航到项目的根目录。 ``` cd alien-shooter-multiplayer ``` 3. 构建 asmp.dll ``` ./mingw32-make asmp-dll build ``` 构建成功后,asmp.dll 将位于 `asmp-dll/build/asmp.dll` 路径。 4. 构建 asmp-server.exe ``` ./mingw32-make asmp-server build ``` 构建成功后,asmp-server 将位于 `asmp-server/build/asmp-server.exe` 路径。 5. 构建 asmp-exe-patcher.exe ``` ./mingw32-make asmp-exe-patcher build ``` 构建成功后,asmp-exe-patcher 将位于 `asmp-exe-patcher/build/asmp-exe-p4tch.exe` 路径。 注意:补丁程序的名称使用 '4' 代替 'a',因为 Windows 会自动为名称中包含 "patch" 模式的 .exe 文件添加管理员权限运行要求。 ## 文档 要生成项目文档,请使用以下命令: ``` ./mingw32-make documentation ``` 生成后,文档将位于项目的 [/docs](/docs) 目录中。 ## 注入到游戏进程 客户端 可以使用任何 dll 注入器/asi 加载器注入到游戏进程中。然而,为了避免对第三方软件的依赖,并确保对某些游戏函数的挂钩 在正确的时机安装,编写了一个游戏可执行文件的[补丁程序](/asmp-exe-patcher)。 补丁程序在三个位置覆盖了原始游戏可执行文件 的字节: 1. 在距离 AlienShooter.exe 文件开头偏移量 `0x7E670` 的位置(这些是用于节对齐的未使用 .rdata 节字节),写入了要注入的 .dll 的名称 ("asmp.dll")。 2. `0x4FCC` 文件偏移量是注入 .dll 到游戏中的完美位置。在执行该地址的指令时,游戏结构已经初始化,但游戏循环尚未开始。此时,需要跳转到将 asmp.dll 加载到游戏进程中的字节码(此字节码将在下一项中描述)。 | File offset | Original Bytes | Original Asm | Pathed Bytes | Patched Asm | | ----------- | ------------------- | --------------- | ---------------- | ------------- | | 0x4FCC | `89 0D 38 07 49 00` | `mov game, ecx` | `E9 6F 4E 07 00` | `jmp 479E40h` | | 0x4FD2 | | | `90` | `nop` | 3. 在距离 AlienShooter.exe 文件开头偏移量 `0x79E40` 的位置(这些是用于节对齐的未使用 .rdata 节字节),写入了一段字节码,该字节码将包含要加载的 .dll 名称(`0x7E670 | "asmp.dll"`)的 .rdata 节的地址压入堆栈,并调用 WinAPI 函数 __LoadLibraryA__。此外,为了安全起见,在开始时,所有寄存器的值都被保存到堆栈中,在调用 __LoadLibraryA__ 之后,再从堆栈中恢复。 在调用 __LoadLibrary__ 并从堆栈恢复寄存器值之后,应执行来自 `0x4FCC` 的原始字节(这些在第 2 步中被覆盖)。之后,应执行跳转到地址 `0x4FD2`,即游戏逻辑执行的自然延续。 | File offset | Bytes | Asm | Comment | | ----------- | --------------- | ------------------------------------- | -------------------------------------------- | | 0x79E40 | `60` | `pushad` | Save general-purpose registers on stack | | 0x79E41 | `9C` | `pushfd` | Save EFLAGS on stack | | 0x79E42 | `68 70E64700` | `push "asmp.dll"` | | | 0x79E47 | `FF15 68A04700` | `call dword ptr ds:[<&LoadLibraryA>]` | | | 0x79E4D | `9D` | `popfd` | Restore general-purpose registers from stack | | 0x79E4E | `61` | `popad` | Restore EFLAGS from stack | | 0x79E4F | `890D 38074900` | `mov dword ptr ds:[490738],ecx` | Original 6 bytes from `0x4FCC` | | 0x79E55 | `E9 78B1F8FF` | `jmp 404FD2h` | Jump back to `0x4FCC + 6` | 本章描述的所有逻辑均由补丁程序自动化执行。只需运行 `asmp-exe-p4tch.exe` 并将原始 AlienShooter.exe 的路径作为参数。结果,AlienShooter.exe 文件将被修补,原始文件将被保存在旁边并命名为 `AlienShooter.exe.bak`。 **问题**:_为什么不直接在游戏目录中创建例如 AlienShooterMultiplayer.exe 呢?_ **回答**:游戏使用可执行文件的名称来访问注册表中包含游戏配置和许可证信息的键。通过重命名的 .exe 运行游戏将重置设置和许可证。 ## 服务器-客户端架构 服务器-客户端架构分为两部分: ### 1. 底层服务器-客户端 核心服务器-客户端逻辑处理连接、断开连接和连接维护(源代码可在 [/common/src/net](/common/src/net) 找到)。该组件设计为可在其他项目中复用,因为它不包含任何特定于项目的逻辑。 底层客户端不会创建额外的线程来接收或发送数据。相反,它采用状态机在调用 ```net_client_tick``` 函数时对当前状态进行非阻塞处理。这种方法使得发送/接收逻辑能够完全集成到游戏循环中。 ### 2. 顶层服务器-客户端 扩展底层服务器-客户端以提供在线游戏功能。 顶层服务器实现:[/asmp-server](/asmp-server) 顶层客户端实现:[/asmp-dll/src/multiplayer/client](/asmp-dll/src/multiplayer/client) ## 演示 ### 菜单 https://user-images.githubusercontent.com/46194184/227988748-8c160bc6-3c59-44e1-b92a-78d5bff4617c.mp4 ### 游戏玩法 https://user-images.githubusercontent.com/46194184/230725748-09ea9940-c1c2-4e04-9b91-7db1ca6da255.mp4
标签:DLL注入, Hook技术, SSH蜜罐, Windows开发, 二进制分析, 云安全运维, 云资产清单, 内存修改, 内核驱动, 外星人射击游戏, 多人联机, 客户端加密, 客户端-服务器架构, 流量审计, 游戏开发, 游戏模组, 游戏补丁, 游戏逻辑扩展, 端点可见性, 经典游戏, 网络协议, 网络编程, 进程注入, 逆向工程