- UID
- 619
- 帖子
- 18470
- 积分
- 12945
- 阅读权限
- 100
- 注册时间
- 2005-7-10
- 最后登录
- 2015-6-18
- 在线时间
- 2847 小时
  
|
大千世界,无所不容
幽幽星际路,深深游戏情!
======================================================》》》好诗!!!!!
我们来学习星际内涵性的东西。
这里要涉及到的是:
怎样编写星际作弊器与反作弊器?
怎么为QQ做星际皮肤?
怎样做一个星际音乐版的WINAMP?
怎样做星际屏幕保护?
怎样开发星际新的软件:例如W.Z.Q是如何编写他的彩色ID作弊器的?ZHMWWL又是如何开发彩色ID作弊器的PLUS版本的?
如何架设星际战网,又如何编写星际综合注册表?
如何编写星际APM查看器?
。。。。。。
太多的东西,需要我们去钻研,对吧!
废话少说,现在开始,先写 星际作弊相关的文章吧!
要写一个星际作弊器当然不是很容易,这些工作只适合有足够耐心的朋友!不过看看别人是怎么写出来的,也是一种享受,不是么?
当然,星际作弊器研究需要有实例分析才好,我在本文中会涉及到四个的作弊器与2款反作弊器的分析。
他们是:
作弊器部分:
我最推崇的世界第一的作弊器:星际霸主(作者中国湖南 W.Z.Q,星际彩色ID作弊器的原作者,也是我最近千辛万苦,苦口婆心,使用万千心机才拜到的师傅,当然,他是比较牛比的一种人,至少1。他集成了1.08-1.13F所有的作弊器功能到同一个作弊器中,2。他开发了不要钱就做兵的作弊器,3。他的作弊器我到现在没有完全破解掉。哦,作弊器,具体在www.sb.com/sc查看其状态)
inhale 最有用的MAPHACK,多步操作类作弊器,作者dt,是目前最牛比的作弊器编写者之一,任何版本的星际均有其对应的inhale。
AnnihilationX2,这个作弊器提供加钱加气功能,当然,我猜想我师傅W.Z.Q作弊器加钱加气功能的思想应该来源于这个作弊器,不过其实,我要说,这里不得不提到dt,因为这个作弊器是利用他开发的Damnation.exe(这是一个外挂程序,利用它可以制作很多简单的外挂式作弊器)外挂到星际上的。所以我不得不承认dt牛比!
Game Timer,一种星际计时工具,原理稍微比较简单。
反作弊器部分:
108b scanti-hack10:某国产108b反作弊器。
Damnation666.exe:名字一看就很熟悉吧,其实这也是dt开发的,我再次说一次:这样的人能不牛比么!?
好了,走入正题!
要编写一个游戏的作弊器,必须得对一个游戏有一个深入的了解,这不是你是星际高手就可以解决的问题,你得必须想办法成为超级高手,当然我认为的中国星际超级高手有fangshixiong, zhmwwl, w.z.q….等等,PJ,LX,66等如今只能为列高手吧。
那么我们先了解一下星际的工作原理(这里插一段广告:我问我师傅:师傅呀,你的作弊器原理是什么,他说:没什么,就是农民孵化。我想了6个小时,终于明白了,终于拨开云天见白日了<其实我傻了>,我又问他:你是怎么编写星际作弊器的,他回答说:我看星际代码,我知道 他是如爬虫那样看星际的汇编代码学习的!我又想了6个小时,终于又拨开云天见白日了<我蒙了>,当我给他我那天不小心到一个网站淘<怎么淘,我偏不告诉你>的星际2源码时,他哭了,原来天上真会掉馅饼,还一掉就一箩筐)。
老和尚提醒您:广告也精彩,5秒后精彩马上回来!(我靠,扔西红柿你就得了,谁他吗这么缺德,扔砖头!)
我个人比较崇尚破解与反作弊,因此先从反作弊讲起吧!
反作弊原理基本有2种:一种是侦测已知作弊软件的特征(如现在的杀毒软件一个模式),然后组织它运行;另一中是尝试让作弊不那么有效,并防止作弊者获取信息来防止作弊。在大多数情况下,作弊因此被阻止。例如现在CS里的Cheating-Death反作弊器。
侦测作弊的观念
侦测作弊听起来简单——如果你注意到某人正在作弊,你就骂他婊子,几吧,或者直接退出,更有甚者拔猫,让对方卡40秒,而反作弊器侦测到了就直接t人。
问题在于没有一种普遍的,可靠的方法去把作弊软件和别的正常的软件区分开。因此,反作弊软件被迫以已知作弊软件的特征为线索搜寻作弊者。服务器端的反作弊软件正是这样工作:一旦发现某个作弊软件,就把它的使用者踢掉。
此方法的问题在于作弊软件的作者很容易就可以修改他们的作品,使其变得不一样。同样,如何编写自己的作弊器的信息很多,所以新作弊软件层出不穷。要与之对抗,反作弊软件采用更新已知作弊软件列表的方法。当一个新作弊器公布后,列表立即更新。现在服务器端的反作弊软件使用不间断更新的作弊器列表,发现一个,踢掉一个。
可见,这并不是一个特别好的方法。事实上,这方法相当不可靠,因为它需要一个重要的条件为补充——惩罚。通常的惩罚是在服务器上禁止某玩家。言外之意是即或无法抓住所有作弊的人,你至少能阻止以往作弊的人进入服务器。这也能告诫试图作弊的人。现在反作弊软件拥有不断更新的作弊软件列表和作弊者名单,一旦发现有作弊器或有过去曾作弊的人存在,它就踢掉他。
你或许认为这的确可行,但事实上不太有效。问题在于如果你在一个服务器上禁止了某人,他们只需进入另外的服务器即可。目前有一些全球作弊者数据库正在运作,其中一个甚至整合进了反作弊软件。然而,许多问题出现了:这样做合法吗?数据库由谁维护?作弊者的名字在数据库中保留多久?如果某人没有作弊却被放进数据库,怎么办?如果你不知情但你的孩子或朋友在你的机子上尝试作弊器,怎么办?反作弊软件出错导致错误的侦测怎么办?如果一个服务器要禁止某人,而另一个却不希望如此,怎么办?谁将负责判断这一切的一切?
所有这些问题都对作弊者数据库的功能性和公平性提出了质疑:可能出错的地方很多,维护也很消耗精力。综上所述,侦测作弊的概念瑕疵百出,必须更新。
《星际争霸》是如何工作的
那么如何不侦测作弊软件的特征就能阻止作弊?要明白这点,必须首先了解一些《星际争霸》(以下简称SC)多人游戏运作的原理。当你玩SC的时候,你的电脑成为一个客户端(Client)。客户端负责收集你的键盘和鼠标指令,并绘在屏幕上。客户端和服务器相连。服务器注意所有客户端的状态。它发给客户端信息,告诉它每个人的每个兵,每个建筑,没条指令,在哪里,在做什么。
客户端由两部分组成,引擎和客户端MOD。引擎处理和服务器的连接,在屏幕上绘图,并获取键盘和鼠标输入的信息。MOD部分处理和你玩的某个特定游戏相关的事情。每个游戏都有自己的MOD。如果你装了SC,那么就会有一个SC的MOD,也就是有一个引擎。如今流行的星际MOD制作,也就是制作新的SC引擎。这些引擎可以驱动使用星际其它的文件。
引擎和MOD互动使你机子上的游戏顺利运行。大多数作弊软件的原理是他们把自己楔入引擎和MOD之间。引擎和作弊器“对话”,作弊器再把信息传递给MOD。同样,MOD和作弊器“对话”,作弊器再传给引擎。引擎和MOD仍然相关联,表面上看一切都好,其实两者实际上在通过作弊软件“交流”。这些作弊软件通常被叫做“客户端钩子”(”clienthooks”)。
既然作弊软件栖身于引擎和MOD之间,它可以做它想做的任何事情。常见的事情是在屏幕上画出额外的信息,或是让你瞄得更准。但是它同样可以让你像个白痴一样转着圈跑,丢掉你的武器,或者自杀。完全取决于作弊软件的作者想做什么。
另外一种正在变得流行的做法是把作弊软件伪装成3D驱动程序(OpenGL或D3D)(这对以后的星际2是有用的,但对目前的星际基本无效)。当游戏引擎以为一切正常时,作弊程序正分析渲染数据,然后再把它传给真正的驱动程序。(它把自己“裹wraps”在真正的驱动程序外围。)虽然作弊器用此方法得到的信息不如直接介入引擎和MOD之间获得的信息多,但是也足够分析出正被绘制的任何目标的位置。同传送鼠标和键盘倳件的程序连接起来,此类作弊软件也能有很高的效率。他们更难被阻挡,因为介入引擎和驱动程序之间的途径比介入引擎和MOD之间要多得多。这些作弊软件通常被称为“包装工”(“Wrapper”)。
防止作弊
有两个基本的问题需要解决。第一个是引擎提供给MOD有关其他玩家位置的详细数据。第二是必须和引擎绘图的做法一致。
MOD确实不需要知道每个兵的确切位置。它仅仅需要知道一个兵大概在什么位置。为了有效作弊,作弊软件例如maphack需要知道玩家的准确位置。如果引擎并不告诉MOD玩家的准确位置,而是只告诉大概的位置,maphack将会失效,例如以前108b流行的Starcrap1.0版就只能提供该玩家大概在哪里,并在你屏幕上显示一个小蓝点而以,现在的maphack作弊器基本能完全准备的知道每个兵,建筑的具体位置,甚至连兵站里正在生产什么兵都能准确知道。
第二个问题是要和引擎绘图的方法一致。当然,涉及到具体图形的一般与3D游戏相关,这里不罗嗦!
当然,反作弊原理介绍差不多了,开始介绍作弊器原理了,然后,我们会实例分析如何破解、分析一个具体的作弊器,并手把手的学会利用我的补丁编写一个小小的星际作弊器!
前言
如何编写游戏作弊器
本文包含了当今Win9x/Me/2000/xp平台下游戏作弊器的大部分流行甚至可以说“先进”的技术,相信您通过本文的指引,定能写出一款属于自己的游戏作弊器。 (SE: 本文所述的技术适用于 Windows 95/97/98/Me/2000/Xp)
在正式开始前,我将假定您已经具备了如下的阅读条件:
1. 具备在32位Windows 下使用 C/C++ 编程的基本知识(SE:最好是VC),大致了解 Windows的结构及基本原理。 (你想学么,你真的想学么,如果你真的想学,你别问我,我现在不会用vc,连c都只会编写hello,并且一次编译还通不过)
2. 可供查询的Windows编程资料,如MSDN和著名的《Windows 核心编程》等。 (这2种教材我都没看过,但我知道是好东西)
3. 使用过游戏作弊器,推荐使用星际霸主
游戏作弊器的基本工作原理
所谓游戏作弊器,主要是通过修改游戏程序的内存数据或存盘文件来修改游戏中的相关数据,使之达到“无敌”等效果。 当然,涉及到网络以后当然只是修改游戏程序的内存数据啦,存盘文件你想把Boexer的录象改成你自己的例如xiaol,并在游戏中显示呀,那很容易,我曾经就把julyzerg改成我自己,发给我的qq好友,他们都说我牛比!
游戏作弊器主要分为两类:单一游戏的作弊器和通用游戏作弊器。顾名思义,前者只能修改特定的游戏,此类作弊器也叫“无敌引导程序”或“游戏作弊器”;而后者则能够以“不变应万变”,可以修改大多数的游戏。相比之下,前者是后者只留下修改功能的“简化版”。
总的来说,游戏作弊器主要的功能便是反复搜索并筛选某一特定内存地址并将其按照固定的周期修改为特定的值(所谓的“锁定”),当然,将“内存”换为“文件”便可以以同样的方式搜索文件了。
搜索和筛选是如何实现的呢?假如我们已经可以访问游戏的内存,我们将游戏的内存分块读入一个缓冲区,然后借由下面的函数搜索:
//在一个内存块中搜索内容
//成功返回位置
//失败返回-1
//(SE:现在我发现这个顺序查找函数完全可以用 STL 的 std::find() 函数取代,原因是写文章的时候我还不太了解 STL
int MemFind(int iStartPosition, LPBYTE pDestBuffer, int iDestBufferLength, LPBYTE pPatternBuffer, int iPatternBufferLength)
{ signed int iFoundPosition, i;
iFoundPosition = -1;
if(iStartPosition > iDestBufferLength)return -1;
for(i = iStartPosition; i < (iDestBufferLength + 1); i++)
{
if(memcmp(&pDestBuffer, pPatternBuffer, iPatternBufferLength) == 0)
{ iFoundPosition = i;
break;
}
}
return iFoundPosition;
}
由于游戏在内存或文件中保存的数据是二进制格式,因此,当我们搜索一个为123的整数时应用如下的格式:
int nPattern = 123;
dwOffset = MemFind(nStartPosition, pDestBuffer, nDestBufferLength, (LPBYTE)(&nPattern), sizeof(nPattern))
同样,可以这样搜索浮点类型:
float rPattern = 123;
dwOffset = MemFind(nStartPosition, pDestBuffer, nDestBufferLength, (LPBYTE)(&rPattern), sizeof(rPattern))
由于内存中肯定会存在许多相同的数据,所以第一次我们肯定会搜索到许多地址,而真正我们要找的地址一定包含在其中。所以,我们建立一个临时文件将这些地址保存起来,并设置“有效”标志,如下代码所示:
struct CTempItem
{ DWORD dwAddress;
BOOL bEnable;
};
CTempItem item;
item.dwAddress = ?????????;
item.bEnable = TRUE;
fwrite(&item, sizeof(item), 1, fp);
接下来,当用户进行第二次搜索时,将这些保存在临时文件中的数据取出来,先看item.bEnable若等于FALSE则跳过,否则读取item.dwAddress所指示的游戏内存,并于用户第二次输入的数值相比较,若发现相同,则设置item.bEnable = TRUE;若不同设置item.bEnable=FALSE,表示废弃。完成之后,再次把item写回文件,当所有item分析完之后,我们就完成了第二次搜索。再接下来,bEnable=TRUE的地址还有很多,则仍然用第二次搜索的方式反复搜索,直到剩下1-2个地址为止。 (SE:应用读写缓冲区,即成批地读写,可以大大加快速度)
由以上介绍可以看出,游戏作弊器的搜索分为2个阶段:第一次搜索和第2、3、4……次搜索,游戏作弊器在第一次搜索出的很多地址中分析出与用户输入的数据始终相同的地址。当我们有了目标地址,就可以按照用户的意愿定时或手动方式写入用户指定的数据,这便是游戏作弊器的基本原理。
当然,这只是基本原理,当具体编写作弊器将遇到许多具体的技术困难,以下章节将为您一一解答。
如何访问游戏程序的内存
当我们的作弊器运行于Windows时,首先遇到的问题便是如何访问游戏的内存。
首先,在访问游戏的内存前我们还必须获得游戏进程的句柄,这可以通过ToolHelp函数获取系统中当前运行的所有进程的列表和各进程的ID,经由用户选择之后通过OpenProcess函数来获取。若您的作弊器运行于后台,而前台是游戏的话,可以在用户按下“弹出”热键时使用GetForegroundWindow函数获取游戏窗口的HWND,再使用GetWindowThreadProcessId转换成游戏进程的ID,再使用OpenProcess函数获取游戏进程的句柄。
有了游戏进程的句柄之后,便可以使用Windows提供的ReadProcessMemory和WriteProcessMemory这两个API来读写游戏的内存了。但是,在Windows9x中每个进程均拥有各自独立的1GB虚拟地址空间,而在Win2000/XP下更是达到了2GB。显然,搜索这样大的地址空间是不现实的,而且游戏也仅仅用了其中的几十到几百MB。所以,我们需要使用VirtualQueryEx这个函数来查询哪些是已经分配的地址,哪些是未用的地址。以下查询与搜索相结合的示范代码:
DWORD dwBaseAddress;
SYSTEM_INFO si;
GetSystemInfo(si);
dwBaseAddress = si.lpMinimumApplicationAddress;
while(dwBaseAddress < si.lpMaximumApplicationAddress)
{
mbi.BaseAddress = (LPVOID)dwBaseAddress;
ProcessMem.Query((PVOID)dwBaseAddress, &mbi);
VirtualQueryEx(hProcess, (LPVOID)dwAddress), mbi, sizeof(mbi)
dwBaseAddress = (DWORD)mbi.BaseAddress + mbi.RegionSize;
if(mbi.State != MEM_COMMIT || mbi.AllocationProtect != PAGE_READWRITE); //跳过未分配或不可读写的区域
{
continue;
}
//搜索这块内存区域
}
资源:请到 http://wan.ni.ne.net下载我写的一个很“简陋”的游戏作弊器——GameProbe的源程序。
如何实现热键
热键的原理很简单,使用全局键盘HOOK就可以了,鉴于这方面的资料较多,具体的Hook使用方法请参阅MSDN或相关资料。
如何实现暂停游戏
这是游戏作弊器必须具备的一项功能了,若不暂停游戏,搜索之前数值很可能会改变,从而造成找不到数据的现象。暂停游戏的办法有很多种,主要有:
1. Debug法,这种方法利用DebugActiveProcess这个Windows API将游戏作弊器作为游戏的调试程序,游戏作弊器可通过Windows提供的调试倳件(DebugEvents)来获取游戏的各个线程的句柄。但此法有一个缺点就是不能在关闭游戏前关闭作弊器,否则Windows将会自动终止游戏的运行,运用此方法的典型是FPE2000。
2. 通过使用ToolHelp系列函数获取游戏进程的所有线程,并使用公开的OpenThread这个API来获得各线程的句柄并使用SuspendThread 和 ResumeThread来暂停或恢复游戏的运行,目前大部分程序运用此法。(BTW:著名的 GameMaster使用的是CreateProcess并通过Suspend游戏主线程的方法暂停游戏的,很显然,若游戏采用了多线程,此方法是欠妥的。)
但恼人的是Win9x下并没有OpenThread这个API,不过我们可以通过一个未公开的使用 TCB 的方法在Win9x下替代OpenThread而获取线程的句柄,从而达到了暂停游戏运行的目的。您可以到 http://www.windrun.com/ 下载Ligtest前辈编写的PauseProcess程序的源代码来学习,或者下载我的 TestPopup。
如何在游戏中弹出自己的界面
这个问题可以和热键问题一并解决:众所周知,Windows是一个消息驱动的32位操作系统。在Windows中,所有正在运的进程都有一个独立的2GB的虚拟地址空间,进程之间相互不可见。Windows的绝大多数API与消息是不能跨越进程的。
“Hook”在Windows中主要是用来截取消息的,形象说,就是用来“钩” 消息的。Hook实际上是一个处理消息的程序段,每当特定的消息发出,在没有到达目的窗口前,Hook函数就先捕获该消息,即Hook函数先得到处理消息的控制权。而且如果你把Hook实现在DLL文件中,那么Hook函数将会自动被系统映射到会处理那个特定消息的窗口所在的进程虚拟地址空间中。例如,你可以用Hook来捕获系统中所有的键盘输入消息(WM_KEYDOWN)来实现对电脑使用者的输入进行记录(关于Windows进程管理与Hook 的详细用法,请参阅MSDN与相关资料)。
微软的 DirectX 为Windows下的游戏带来了华丽的声光效果。但是由于DirectX采用直接访问硬件的方法提高多媒体与游戏程序的速度,因此导致了人们误以为在DirectX(确切地说是DirectDraw)下不能显示普通的Windows对话框。
幸运的是,DirectX 是支持GDI的,也就是说游戏程序可以用常规的方法在DirectX下显示对话框(在微软 DirectX 8 SDK 中有名为“FullScreenDialog”的例子)。所以现在我们的问题变为:如上所述,如何让我们的程序进入游戏的程序的内部并显示对话框。
这似乎是一个很棘手的问题。但是,有了上面所讲的Hook情况就大为不同了。我们知道既然Hook可以映射到别的进程内部,那么只要将显示对话框的函数以及对话框资源包括在Hook DLL 中不就可以调用DialogBox() 了吗?完全正确!我们用 SetWindowsHookEx() 为系统设置一个键盘消息Hook,系统会自动将这个DLL映射到游戏的进程中。每当有键盘消息,我们只要判断是不是我们所设定的热键,如果是就调用 DialogBox() 显示对话框即可。 (SE: 还有一种方法可以把 DLL 插入别的进程,那就是利用 RemoteThread 远线程,具体程序请参阅上文提到的 PauseProcess 程序。)
您可以参阅我的TestPopup程序,就演示了在DirectX下弹出界面、暂停游戏、热键等功能。
如何调整游戏速度
游戏通常是通过timeGetTime、GetTickCount等几个与时间相关的API来控制速度的。因此,我们只要抢在游戏调用这些API之前调用它们,并修改返回值,便可以调整游戏的速度了。具体的程序可以参阅我的 SpeedMan,您可以免费下载它的源程序。SpeedMan 使用了《Windows核心编程》所提供的 CApiHook 类来拦截 timeGetTime 等 Windows API。
抓图功能
抓图功能很好实现。具体就是先暂停游戏,再通过使用GetForegroundWindow函数获取游戏窗口的HWND,最后DC就可以获得Bitmap格式的屏幕图像了,至于如何保存成文件,或转换为Jpeg(可以使用IJLib)等,则不在本文讨论范围里了。
结束语
相信您通过阅读本文,已经大致了解了游戏作弊器的关键技术了吧?希望本文能助您写出更新、更好的游戏作弊器。
哈哈,再此申明:能看完上面文章的,我会说:你傻了!??
还是实例分析来的快!
那上面的理论连我自己都不看,我的理论就是:使用作弊器,并分析她!!!
Now,就是现在,开始搞事! |
|