防外挂系列

原创 2004年09月09日 09:43:00

可能有点长,大家耐心点看完,呵呵。

《老子看不惯外挂系列 之 彻底粉碎钩子型外挂》

现在大部分的主流外挂,包括按键精灵,自动做一些动作之类的外挂。
都是通过HOOK进游戏窗口,并且用不同的HOOK类型来完成的,比如对于
网络,通常是通过HOOK消息,把DLL弄到我们的游戏程序中,然后通过
GetProcAddress得到DLL中它们卑劣的函数的地址和真实的函数地址,
然后通过WriteProcessMemory来把我们的函数地址改成他们他们的API
地址。

那么在我们的游戏执行的时候,收到消息就会先触发他们的钩子,等
他们布置好邪恶的陷阱,然后再执行我们的程序。那么,对于这类型
的外挂,该怎么防呢?俗话说得好,以彼之道,还制彼身。所谓魔高
一尺,道高一丈。所谓邪不胜正。所谓天网恢恢。所谓做贼心虚。

恩,WINDOWS的钩子有个特点,就是钩子链,因为对于同一个进程,即
使是同一类型的钩子,能同时有多个,也就是说,对于同一个游戏,开
两个功能相同的外挂也可以。那么,怎么样来决定钩子的顺序呢?所谓
后来者先得,WINDOWS的做法是,最后一个HOOK某个进程的钩子最先执
行。并且振奋人心的消息是,在钩子里面可以控制下一个钩子是否执行。

这个函数是CallNextHookEx,也就是说,如果在某个钩子里面不执行这
个函数的话,钩子链就会在这中断,那么我们的思路就很简单了,在游
戏运行中,开一个进程,每隔一段时间就hook我们的主程序,然后在钩
子里面,不执行CallNextHookEx,这样就可以避免别人的钩子执行。

所谓,仅仅发现敌人还不够,还要消灭敌人。不急,我们来看看如何彻
底把敌人打成粉碎性骨折。恩,要消灭敌人就要复杂一点了,要针对不
同类型的钩子来采取不同类型的方法了,因为敌人的钩子不管怎么做,
无非是出于两种目的,一种是修改数据,另外就是过滤数据。其核心思
想就是我们自己的游戏注册两个钩子,一个总是在钩子链的最底层,另
外一个总是在钩子链的最上层,一比较两个钩子收到的消息,就知道中
间有没有别的钩子了。一但发现有别的钩子,不用想了,肯定是外挂,
最少也用了按键精灵,封号,杀档,想怎么干就怎么干。

当然,敌人也不是这么脆弱的,据说有人用raw socket来截获所有的网
络消息,这个跟钩子无关,这个更底层一些。不过不用怕,俗话说得好,
以彼之道,还制彼身。所谓魔高一尺,道高一丈。所谓邪不胜正。所谓
天网恢恢。所谓做贼心虚。对付拦截raw socket的外挂,将在下一集中
播出,请关注。。

==============================================================
《老子看不惯外挂系列 之 防止拦截网络消息》

这里首先要把敌人分类,对于水平最次的敌人,方法也相应要简单得多。
最次的敌人一般用的方法是自己写一个wsock32.dll放在和游戏相同的目录
下,来替换掉系统的wsock32.dll。对于这种愚蠢的方法,解决的办法有很
多,把load time的载入wsock32.dll改成run time的载入,然后指定一下
路径,就什么问题都没有了。更简单点,运行游戏的时候检查一下当前目录
下有没有wsock32.dll,有的话,那就肯定是外挂钩子了。

比最等级高一点点的敌人,会喜欢用钩子来直接钩,一般的做法是,先通过
GetProcAddress来获取SOCKET API的地址,然后通过WriteProcessMemory的
方法来修改入口地址,将其改成jmp 自己的函数地址。这种方法其实很卑劣
的,所谓无毒不丈夫,我们可以通过修改通用的GetProcAddress的代码来防
止别人拦截SOCKET,这样,直接连防火墙都可以突破了。

这里的技术难点在于,我们不能用类似WriteProcessMemory的方法来写内存
因为我们不知道究竟外挂是哪个进程,所以我们需要修改WINDOWS的代码段,
这样讲理论上是不可能的,可惜WINDOWS自己给自己留了个后门,在kernel.dll
里面,UINT AllocCsToDsAlias(UINT),通过把API的代码段的选择符传给它,
可以返回一个可以写的数据段的选择符,然后把新的选择符和API的入口地址
加在一起,就可以得到一个可以写的代码段的指针。

国内好多取词软件和全屏翻译软件都是用的这个原理,具体的例子如下:
比如GetProcAddress这个API,在kernel.dll里面,我们要做针对它的通用
钩子就应该按照以下的步簇:
typedef UINT (WINAPI* FOO)(UINT);
FOO AllocCsToDsAlias;
HMODULE hKernel = GetModuleHandle("kernel");
AllocCsToDsAlias = (FOO)GetProcAddress(hKernel, "AllocCsToDsAlias");
FARPROC entry = GetProcAddress(hKernel, "GetProcAddress");
WORD offset = (WORD)(FP_OFF(entry));
UINT selector = AllocCsToDsAlias(FP_SEG(entry));
BYTE *addr = (BYTE *)MK_FP(selector, offset);

然后就可以往addr这个地址写5个BYTE的东西,第一个BYTE是jmp,不同的CPU
可能会不同,之后的一个DWORD是你的函数的地址。。

这样,可以通过保存两份addr的数据来做到钩子的开关,当钩子打开的时候,
所有的GetProcAddress的调用都会调到我们的函数,这个时候可以通过检查
如果有人想GetProcAddress wsock32.dll里的东西,我们就干掉它。。

同样,如果有人通过开启socket这个API的SOCK_RAW参数来调用RAW SOCKET监
视网络,我们也可以通过上面的方法来做到先入为主,看谁在监视我们的网络
传输。

===================================================================
《老子看不惯外挂系列 之 还是得从社会风气入手》

其实查外挂的原理和捉病毒的原理一样,只是现在做外挂的技术还不成熟。
当做外挂的技术和防外挂的技术在同一条线上的时候,想从技术上防住外挂
是不可能的。

其实是无奈,杀毒软件的做法是出来一种新的病毒,在第一时间内公布其特
征码,然后更新所有的客户端,看到这种特征的,就杀。其实查杀外挂也该
如此,其实CS的Cheating-Death就是这个原理,不管出了什么新的外挂,CD
总是在第一时间内更新,然后客户端也就傻傻的只要一看到有这个特征的东
西就把它干掉。其实仔细想想,这是个很好的主意,从外挂开发商的动机来
分析。他们之所以要开发外挂,估计炫耀技术是一方面,更重要的还是想赚
钱,或者用来挂机之类的,既然要赚钱,或者挂机,就必然会被其他玩家发
现或者举报,这个时候应该做的就是尽快的下载一份外挂,或者根据其行为
研究其特征,并在防外挂的特征码上记下一笔,其实不用太复杂,最简单的
做法就是记住其外挂窗口的名称,然后只要看到这个外挂窗口,做些处理就
好了。

那么这样一来,关键的技术就落在如何设计查外挂这个结构上了,首先客户
端需要的是一个查外挂引擎,和一个外挂特征库,根据引擎和特征库生成一
个固定的版本号,然后每次登陆的时候就用这个版本号,跟服务器上的版本
号对比,如果不一样的话,则从服务器自动下载最新的查外挂引擎和外挂特
征库。

这样虽然不能将外挂赶尽杀绝,却能比较大的限度上围剿使用外挂的风气,
相信使用外挂的玩家也只是想更好的玩游戏,只不过动的念头有些歪了,但
其出发点仍是好的,只要在他使用外挂的时候多些阻拦或者诱导他不使用外
挂,这样效果就会好很多。设想一下,谁愿意每天等一个外挂的更新,而不
去玩他很想玩的游戏呢。这样一来,制作外挂的人也会逐渐减少,从而进入
一个良性循环。

就好象如今写病毒,并不如当年那么流行了。。-。-

==================================================================

在游戏研发中如何有效防止外挂程序

由于HTTP协议是明文传输,很容易通过抓取HTTP包获取游戏内交互的逻辑和数据,请问如何能有效地防止外挂程序? 总的说来,道高一尺魔高一丈,外挂不可能100%被杜绝,只能通过...
  • MeetLunay
  • MeetLunay
  • 2014年03月26日 10:37
  • 2249

一招叫你对付微信抢红包外挂

本文为浪里个男【个人微信:love2094520】原创文章。 原创不易,转载请务必注明! 【文章末尾我教大伙一键屏蔽微信红包插件!!!】 过年期间抢红包,...
  • loveysgg
  • loveysgg
  • 2016年02月04日 23:30
  • 4737

新鲜出炉的12306防挂脚本,有需要的拿走

一年一度的“抢票运动会”又开始了,期间12306网站承受的压力越来越大,极不稳定。随着人们对互联网越来越熟悉,导致大量刷票软件的用户量猛增,大量的访问将12306快压垮了,以至于使用12306自家的刷...
  • xiaoxian8023
  • xiaoxian8023
  • 2017年01月03日 10:54
  • 2609

游戏中防止加速的一种方法

关键字:游戏 服务器 客户端 防外挂加速 游戏当中有些动作要求必须间隔一定时间才能执行,比如跑步等动作。如果仅在客户端限制的话往往都被加速器(外挂)所破坏。本文假定客户端必须间隔400毫秒的数据包...
  • guestcode
  • guestcode
  • 2014年02月09日 12:40
  • 5506

输入输出外挂总结

明明在C语言中有scanf()、printf(),C++中有cin、cout,为什么我们还要用输入输出外挂呢? 这个问题很明显,一定是因为这些输入输出函数功能过于强大而导致效率低,(很多时候,功能越强...
  • f_zyj
  • f_zyj
  • 2016年05月22日 05:06
  • 5400

DEDECMS织梦内容管理系统安全设置(防范网站注入挂马)

“dede”太脆弱了,早不用早解脱”,“DEDE安全吗,怎么总是被入侵挂马? ”,“天,怎么回事,又被挂马了”经常能碰到这样的抱怨。不“人云亦云”这是无忧主机(www.51php.com)一贯的观点。...
  • forest_fire
  • forest_fire
  • 2016年03月21日 11:11
  • 1875

关于外挂新手最常见的30个问题

概念篇 1、什么是外挂它是怎样定义? 外挂是指某些人利用自己的电脑技术专门针对一个或多个网络游戏,通过改变网络游戏软件的部分程序,制作而成的作弊程序。这是一个让游戏公司痛恨、玩家分派、作者成就...
  • whatday
  • whatday
  • 2014年04月03日 22:30
  • 7036

游戏外挂基本原理及实现

1、游戏外挂的原理    外挂现在分为好多种,比如模拟键盘的,鼠标的,修改数据包的,还有修改本地内存的,但好像没有修改服务器内存的哦,呵呵。其实修改服务器也是有办法的,只是技术太高一般人没有办法入手...
  • liujiayu2
  • liujiayu2
  • 2015年05月12日 18:57
  • 4314

简单的 windows外挂程序

在windows应用中,有时候需要拦截送给别的程序的鼠标
  • sguox002
  • sguox002
  • 2014年09月22日 08:57
  • 2044

常见JS挂马方法及如何防止网站被黑客挂马?

最近有朋友说自己的网站平时并未作弊,文章也都是原创的,更新很稳定。可不知道为什么网站突然就被各大搜索引擎降权了,一直找不到原因。最后发现是网站被挂马了,导致网站被连累了。在此,借助seo思维博客的平台...
  • z10160
  • z10160
  • 2013年09月22日 08:02
  • 2195
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:防外挂系列
举报原因:
原因补充:

(最多只允许输入30个字)