实战并讲解如何编写一个FPS网络游戏外挂

编程语言:C/C++
需要掌握的知识:1、套接字网络编程
                2、进程注入
                3、HOOK API函数的基础
注意:本章不需要用到汇编相关的知识,简单易懂,为你写游戏辅助指一条路,仅用于学习,不要用于非法用途.

###【申明】

本章只是用于学习制作外挂的原理,该章提到的进程注入方式已经对该游戏失效,可能由于本人在网上免费发布了该辅助的原因,或者反外挂有上传可疑文件机制,导致该注入方法失效,但是如果你可以找到注入游戏的方法,无敌雷挂的功能依然有效。

该外挂的研究时间:2017年12月27日

###【概要】

本章实战讲解如何编写一个FPS网络游戏外挂辅助,在Ring 3注入后,操控网络封包,达到游戏作弊的效果,公布该游戏著名的“雷挂”“无敌”(除个人竞技不能使用)的功能原理。

注:这两个功能的方法都是本人自己研究的成果,虽然雷挂横行,但是也是本人自己研究出来的,该游戏实现**人物无限血(无敌)**的功能,更是无人知晓。

实战并讲解如何编写一个FPS网络游戏外挂_第1张图片

###【1】本次实验的目标游戏:SF特种部队OL

实战并讲解如何编写一个FPS网络游戏外挂_第2张图片

这是一款FPS老游戏了,作者上小学的时候玩的游戏,当时还没有听说过CF,后来国内运营商倒闭了,现在由8090运营商代理。

###【2】游戏的保护系统:

8090特种部队OL用的是nProtect GameGuard驱动级保护。

nProtect GameGuard(简称GameGuard或GG,其驱动程序为GameMon.des)是由韩国INCA互联网(INCA Internet)开发的游戏反作弊的软件。

###【3】首先谈下进程注入:

难题1:首先你必须先找到可以注入游戏进程的方法,像这种驱动级的游戏保护,一般远程线程注入那些常见方法是根本无法成功注入游戏的。

难题1回答:一般情况来讲,要到Ring 0 恢复被保护系统Hook 函数,但是这里我成功得使用了编写LSP(分层服务提供者)组件,注入进了游戏,这是最关键的一步,如果连进程空间都读写不了,就更不用讲研究各种神仙功能了。关于LSP注入,就是让任何使用网络的程序加载网络库时,会在中途加载我编写的LSP的DLL(外挂代码都放在里面呢)。

关于LSP注入:http://blog.csdn.net/aaron133/article/details/78028942

这就是我注入这款游戏的方法,由于网络组件所有网络进程都会加载,所以要排除进程,排除的方法有很多,例如DLL内获取进程名,进行判断,不是就不执行任何代码。

实战并讲解如何编写一个FPS网络游戏外挂_第3张图片

#####好了,现在成功将DLL注入到了游戏,现在的nProtect保护系统把这个DLL当成自己人看待,DLL可以在该游戏进程中执行的任何操作(读写执行)。

###【4】教你如何分析封包的行为:

在上一步中,DLL成功得注入到了游戏进程内,你就可以对该游戏的Ring 3 API函数进行各种的Hook,改变API的执行结果或获取数据信息达到游戏作弊,我在对特种部队OL的各种函数进行Hook时,nProtect驱动级保护未提示出现任何的异常情况。

由于这里使用了LSP注入,所以我可以不用Hook 网络函数(send、recv、sendto、recvfrom等),因为它的网络数据必须经过我的LSP转发达到基础网络组件(TCP/IP的DLL),相当于直接HOOK了以上这些函数,如果你使用其他方式注入游戏的话,需要手动HOOK以上的函数,我觉得应该是没有问题的,然后可以对封包的数据进行分析。

下图是我编写的LSP的DLL对网络函数进行HOOK:

实战并讲解如何编写一个FPS网络游戏外挂_第4张图片

####分析send函数和sendto函数:

一般来说,简单的操作都是明文,来回切换状态就可以知道当发出该封包时,所作出的动作,重要的数据一般使用加密算法,并且不能被修改,一修改就会导致掉线,因为他封包的一部分是整个封包数据的校验码,错了一个位都是坏包,一般这种封包也有唯一性,不能重发的。

对付明文封包:来回切换状态,看一看哪个字节代表着什么动作,进而修改。

对付加密封包:Sleep延迟发包,或假装已经发出去了(让API函数不发实际数据,正常返回0,并将实际发送长度改成需要发送的大小),相当于游戏以为封包正常发出去了,但是其实数据没有到服务器,这两个方法可以做到相当变态的功能了,就看游戏有没有能力去处理这种问题。

我这里说的方法不一定每一个游戏都有效,具体情况,要你自己去测试、研究,因为程序本身就是一条流水线,某一小东西被打乱,都可能会影响到之后的处理。

###【5】关于SF特种部队OL的“雷挂”与“无敌”功能:

####一、雷挂的实现:

说明:SF特种部队OL所说的雷挂,就是卡人物的辅助,开局按F1可以卡人物不动(实际上人家是动的),自己的角色相当于隐身一样,过去杀完人,F2释放人物后,刚才的伤害会被全部打出去,导致的结果就是本章开头的那张效果图一样,全部被杀死。

雷挂的名称是因为外挂使用者经常开局就卡人物,然后使用手雷团灭对方,所以被称为雷挂。

分析:一说到网络游戏的卡人物很容易就可以想到它的原理,因为很多人玩游戏都经历过网络太卡,玩个鸡儿的问题,如果我们故意让某一个发包线程睡眠(Sleep),又不影响到控制画面的主线程,这就有实现雷挂的机会,特种部队OL就有这种机会

实现原理:经研究发现,让执行sendto函数的线程睡眠,并在手动让他醒来时,只要放慢速度发包(原因是封包积累过多,服务器接收不过来,导致只能杀死1、2个人),可以实现雷挂的功能。

实际代码相当简单,只需要以下代码:

实战并讲解如何编写一个FPS网络游戏外挂_第5张图片

上述代码,由于是LSP的HOOK,手动HOOK的话,只需要使用像Sleep、事件对象这种可以控制线程睡眠或醒来的方法,都可以实现。

//由于LSP注入面对系统全部网络进程,表示过滤掉不是特种部队OL的进程,让其他网络进程执行正常的封包操作。
if (!sf)
		return g_NextProcTable.lpWSPSendTo(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags,
			lpTo, iTolen, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);
//用于进程间控制线程睡眠、醒来的事件对象
if (Event)
	WaitForSingleObject(Event, INFINITE);
//当恢复时,线程跑起来后,放慢速度发包,因为封包队列太多,服务器接收不过来的。
Sleep(300);
//让基础服务提供者(TCP/IP)执行发包操作,也就是调用sendto API函数。
return g_NextProcTable.lpWSPSendTo(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags,
		 lpTo, iTolen, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);

####二、无敌(无限血,个人竞技不能使用)的实现:

说明:这是我编写网络封包调试工具后,再实验过程中,发现的可以实现无限血的方法,在这里讲一下实现的方法。

实现方法:每局的开局时,立即让send的包都假装已经发出去了(不发包,伪造为已发送出去),然后过1、2秒,恢复正常,这时候,就无敌了,谁都打不死你,而你可以打死别人。

####要说的就那么多,主要的还是去实践,注入是最关键得一步。

你可能感兴趣的:(Windows网络编程,C/C++,系统硬件与系统)