怎样防止投票系统 防止刷票检测到我在使用外挂

1238人阅读
由于HTTP协议是明文传输,很容易通过抓取HTTP包获取游戏内交互的逻辑和数据,请问如何能有效地防止外挂程序?
总的说来,道高一尺魔高一丈,外挂不可能100%被杜绝,只能通过不同的手段来防止大部分的外挂,具体可以从以下几个方面考虑:
1. 协议层加密
以flash客户端为例,在与后端做数据通信时,可采用amf协议,它虽然也是基于http协议,但是对传输的内容做了加密。当然,amf协议是透明的,所以该方法只能干掉一部分只知道用httpwatch/firebug等查看明文http包传输工具的小白。
如果需要继续增加门槛,可以自定义加密协议。但由于客户端需要知道解密方式,所以客户端本身也需要做好加密。关于flash本身格式的加密解密是另一个比较大的话题,在此就不展开赘述了。
2. checksum校验
客户端发送数据时增加一段checksum校验码,服务器端根据相应的算法进行校验,如果校验不通过则返回错误。与(1)一样,只要破解了客户端就可以知道checksum的校验算法。因此一方面需要注意客户端的安全,另一方面checksum生成算法需要不定期更换。
3. 通过任务策划来防治
外挂主要是代替人工来做些重复性的工作,这样玩家可以不操作电脑也能在游戏中获得收益。外挂的出现一般都是和利益有关,最好的治理方式是引导而不是打压,因此我们可以在产品设计方面做些降低外挂的工作:
1)降低长时间重复性任务所获得收益,或者同一种获得收益的任务随时间的增加收益减少。
2)游戏本身提供一些类似外挂的功能:比如自动打怪等辅助工具。
4. 定期检查数据
通过排行榜等数据统计,可以通过发现一些异常的数据来检测是否有外挂存在
5. 深入玩家内部,了解外挂行情
这个是客服们的工作,与技术关系不大,但有时能起到意想不到的作用。
防治外挂,首先要了解外挂,知道它有哪些主要功能,具体是怎样运作的,然后针对外挂的一般特性做抓捕脚本,我自己的经验大致总结有以下几点:
稳定周期性:外挂另外一个特点是周期性比较强,一般的设定是每隔XX秒执行XX操作,如果外挂是规律性的周期的话,有一个很容易抓捕的办法,就是每次同样的请求时都在session中记录下当前时间与上一次请求时间,两者的差值如果在多次请求中保持不变,基本上就能判定是外挂了,但是外挂现在很智能,周期是浮动的,比如周期设定为1分钟,浮动值设置为5秒钟,那么两次请求周期就是55秒-65秒,浮动值也可以手动设定,这样的话,这种方法就失效了。这种方法适用于基础级的外挂。请求次数多:外挂为了定期监测一些数据变动,会频繁的发送一些请求,所以在请求数量上要比正常玩家的操作多很多倍,服务器端可以设置计数器,记录每个玩家每小时的请求次数,每小时筛选出来一批大于平均请求数N倍的玩家(N可以按实际需要设置),这些玩家记录为“疑似外挂”的情况。这也适用于单个某个请求的统计,比如getUserInfo这类查询类的请求。设置外挂钓钩:外挂主要的特性是“自动化”,也就是按照预先指定的模拟指令来模仿客户端的操作。我们可以让游戏真实的客户端在每天的某几个时段在外挂常用功能的请求中加入特殊参数,服务器端通过判断是否有此参数或参数的值是否正确来判定此请求是否外挂发出,据此记录该玩家为“疑似外挂”。这种方法的特点是:钓钩参数(我起名叫“钓饵”)时有时无,外挂作者不容易捕捉到此钓饵数据,不容易被破解,但由于客户端和服务器端的时间会有不同步的情况,所以有一定误抓的可能性。外挂的处理:处理外挂一定不能一发现就踢掉或提示验证码等等,这会让外挂捕捉到你的处理方式,应该是以记录+打分的方式,记录每一次“疑似外挂”的行为,每种行为按照疑似程度设置不同的分值,然后按照总的分值制定一个分值标竿,大于这个分值的,按运营手段处理,封禁也好、不定期弹出验证码也好。总的原则就是“非即时性”,让外挂作者不易察觉到你的抓捕机制,从而增加外挂升级更新难度。
其他针对游戏设计以及游戏生态的外挂功能也有相应的抓捕方式,不过还是那句话“道高一尺魔高一丈”,外挂做的越来越像客户端,原生的客户端一升级版本也有可能被误抓为外挂,所以我认为,抓外挂的手段中,辨别请求来源是很难的,这是游戏中外挂不好处理的主要原因。
看了前面几个兄弟的回答,从技术角度上已经很完备。
简单从产品和运营层面上说说我的经验,希望给大家点启发。第一次回答问题,有不当的地方,请大家尽情喷。
在之前的工作中,认识不少做外挂的朋友,也得知某些游戏外挂一年的销售额可以达到1200万人民币。
巨大商业利益的背后,是外挂团队极强的技术能力,对于网络协议加密,通过研读汇编语言去进行破解,是很常见的形态。从某种意义上说,与外挂的斗争,仅仅依靠技术手段,是无法取胜的。所以在各位所说的技术方案的基础上,应该制定一些策略。
外挂作为依附于游戏产品的衍生品,目前都有及其明确的商业目的,主要盈利模型:
1,通过收取玩家的月卡费用进行收费;
2,通过出售给金币工作室进行收费。
而我们的游戏设计首先能够设法杜绝工作室打金币的行为,使得第二个用途失效。这个做法是策划和运维的范畴,不同游戏类型有不同的做法,在此不做详细说明。
与外挂斗争,首先要确认几个关键的前提:
1,外挂的收入严重依赖一个前提,就是外挂的长期适用性,若经常不能使用,则无法保有付费用户。
2,外挂的利润率与外挂本身的更新难度、维护难度以及开发成本有直接的反比关系,因此当开发我们的外挂成本更高时,他们会倾向于去找一个难度更低的产品。
3,外挂团队一般小而精干,换言之,个人水平高,但人数有限;
4,外挂通常会降低用户的使用门槛并且尽量的做自动化。
5,外挂可能会利用游戏漏洞。
所以斗争的有效办法有以下几类:
1,疲惫法。不断地用小版本更新,来更改通讯加密的密钥,使得外挂制作者需要不断的破解,而相应外挂也会随着其破解能力的不同产生长短不一的失效期;
2,内挂法:游戏设计中涵盖外挂的大部分能力,适用于强PK MMO游戏;
3,考试法:对于长期进行枯燥循环的玩家,强制要求输入验证码,这种方式相对设计难度低,对于小外挂团队有效(大的外挂团队会开发识别算法甚至使用客服人肉回答);
4,隐形惩罚法:对于判断出是工作室使用的外挂,采取强制降低掉率的方式,使其很难盈利;
5,举报法:鼓励玩家举报外挂玩家,判断后加以惩罚。
当然,最好的办法是产品设计之初就考虑到外挂问题,使其不可能发生,这就是个很大的话题了,可以专门写本书,不详细说了:)
楼上的都说的很好,的checksum校验可以校验自身程序防篡改、的基于行为的识别方法、的二进制类似AMF协议的自定义协议方法。反外挂是我在公司的一项主要工作,一直没时间总结。来晚了,请不啬赐教。
外挂按实现技术分为“模拟类外挂”、“内部CALL调用外挂”、“脱机外挂”。
“模拟类外挂”是外挂的鼻祖,靠发送或伪造按键消息到游戏客户端,模拟人的手工操作。实现技术分为Ring3层(应用层)、Ring0层(内核层)两种。
Ring3层通过Windows应用层API(SendMessage、PostMessage、keybd_event、mouse_event、SendInput,keybd_event和mouse_event会调用SendInput)向客户端消息队列发送键盘鼠标消息实现的。
Ring0层通过调用内核未导出函数 KeyboardClassServiceCallback、MouseClassServiceCallback实现的,其实这两个函数是Windows端口驱动在获得键盘鼠标硬件输入后往上传递给类驱动的两个回调函数(何为端口和类驱动需要补驱动和内核知识了:))。也就是正常情况下操作系统也是这样实现的。广州开发的“梦幻昆仑”游戏的一款很火的外挂“易坤辅助”就是这样实现的,从何而知?逆向工程又派上用场了。
防御的方法使用HOOK(替换原始函数),当外挂调用应用层API时,判断SendMessage、PostMessage、SendInput的目的地是否为我们的游戏客户端、发送源是哪个进程,若是系统或常用软件进程则放过,不是则阻止(做得好的话还需要判断一下发送的是否为按键消息)。
当外挂调用两个内核未导出函数时,在我们的HOOK函数中判断是哪个函数调用的,貌似这点不用汇编较难实现,汇编[ebp+4]即为调用者代码的下一句地址,再跟实际操作系统调用的函数地址对比,若一样则放过,不是则认为是外挂在模拟。这个方法也是我反“梦幻昆仑”的“易坤辅助”所用的方法,而现用的HProtect未做到这点。显然不能说我技术比他牛,HProtect做的工作n*n多。但“梦幻昆仑”一直被这样打着辅助旗号的伪善工具吸吮着。
“内部CALL调用外挂”是稍后出来的技术,通过逆向工程反汇编、反编译分析游戏内部函数调用逻辑。比如:XXX游戏使用attack()函数对怪物进行攻击,外挂编写者分析出这个攻击函数后,就用这个函数作为外挂的打怪功能。由于需要精通汇编和逆向分析技术,所以较模拟类外挂实现起来较难,此类外挂也较少。
防御的方法要使用加密壳对客户端程序进行保护,或程序中运用反调试、暗桩(与丛杰的“非即时性”报告检测差外挂原则类似)。这样就可以一定程度上的抵御外挂作者对程序逻辑的分析,但会脱加密壳、反反调试的人大有人在(中国从来不缺少人才)。不过使用“虚拟机壳”+代码乱序+多态变形+深层次的反调试(可以利用自己挖掘的漏洞)可以吓到90%的外挂编写者,外挂编写者不是畏惧技术难度搞不定,卓越的程序员从来不觉得哪项技术难,而是花时间与游戏保护(反外挂程序)周旋的成本比外挂带来的价值大。
“脱机外挂”是难度最大的一种外挂,外挂开发者需要完全分析出游戏客户端与服务器的通信逻辑,达到不使用官方游戏客户端,自己通过发送接收数据与服务端交互。但把通信数据加密和签名认证过程,足以让脱机外挂开发者雪上加霜。加密算法选用成熟的对称加密算法:3DES、AES、TEA等,密钥协商使用非对称加密算法或Diffie-Hellman。因为对称加密算法较快,加密大量通信数据需用此;非对称加密比对称的慢几十倍,传送个小数据量的对称加密用到得密钥合适。其实更简单的方法是配置上李老师做得加密框架。
有人可能会问到,用非对称加密算法传送对称加密用的密钥,不也需要客户端配置好公钥、服务端配置好私钥吗,这样通过逆向技术也动态跟踪内存,不就可以拿到对称加密用到的密钥了吗? 答案是使用前面提到的加密壳对客户端游戏加密,这样增加分析难度,甚至完全放弃。当然后续是要自己开发加密壳的,这样用起来也相对放心。
我们公司大都游戏是Flash的网页游戏,使用AMF协议通信,外挂都是“脱机外挂”。显然我们是没做加密工作的,要想杜绝大部分外挂,通信数据加密、Flash客户端用软件混淆是必须的。
以上谈了谈3类外挂的开发技术以及防御策略,然而不仅仅局限与这3种。楼上的基于数据挖掘的行为分析、关键数据效验自身发送
checksum、定期发送暗桩数据、类AMF的二进制协议自实现一定会作为后期的反外挂技术的重点。
另外,除了技术手段,需要结合游戏前期的设计、深入玩家(外挂作者)内部以及运用法律抄外挂编写者和运营工作室的老巢等对外挂实施全面打击。
说点自己的看法,大家表喷哈。
基于php实现的后端,flash客户端的二进制请求包通过C++连接层转发到后端的php进行处理;对于这类型的游戏,因为客户端代码会很容易被还原,无论怎么加密都没用,只能尽量加一些阻碍,让我们的防御措施不那么容易被看到。
个人觉得比较好的方式是通过代码混淆的方式,增加代码被破解后的可读性来增加阻碍,有两种方式:
1.编译前混淆,这种方式混淆效果较好,但是对于一些协议方面的编解码写法有限制,比如像我们有通过xml格式可以直接转成一个as3对象的写法,就不大好用这种方式。
2.编译后混淆,对已生成的执行文件进行加密和混淆,这种方式就比较方便,对于任何代码实现方式都没有限制。
目前市面上很多游戏都没有做这个方面的事情,所以都很容易拿到完整的可读性较强的源代码,修改编译错误后还可以在本地IDE上编译出来可运行的客户端;但是对于混淆后的游戏,要想完全拿到可读性较强源代码还是要花些时间的。
通常的防外挂的手段是协议加密、数据包校验和运营手段,但在实际项目实施过程中协议加密很容易增加服务器负载,数据校验和也很容易被模拟,根据之前做外挂的经历很多挂都使脚本录制包,这种校验和也很难防,基于HTTP的游戏如果浏览器端是FLASH实现,不防试试自己实现一个二进制的协议,服务端通过PHP端解析,二进制协议有一个比较好得特点是分析协议比较复杂,内容需要破解协议,相对破解明文协议二进制要复杂的多,而且基于二进制的协议加密简单,同时协议本身可以增加防外挂的协议帧,只需对防外挂的协议帧加密就可以了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:547517次
积分:8460
积分:8460
排名:第1768名
原创:250篇
转载:199篇
译文:16篇
评论:95条
(1)(1)(1)(2)(1)(13)(22)(8)(4)(11)(12)(3)(20)(2)(1)(9)(23)(8)(2)(3)(5)(7)(8)(19)(7)(7)(3)(2)(5)(6)(14)(15)(11)(15)(21)(8)(25)(26)(8)(25)(24)(5)(18)(3)(32)查看: 1475|回复: 5
你们真的能检测出游戏外挂么?至少我是被冤枉了。
才气贡献度精华
江边小龟, 积分 330, 距离下一级还需 270 积分
江边小龟, 积分 330, 距离下一级还需 270 积分
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
我是一名5开女玩家前段时间“被商牟”进了苦行
其实我觉得我很冤枉,后面会讲到,先讲重点
我一点点的辛辛苦苦把5个号加起来有2000点的苦行刷完
刚刚刷完,什么都还没做,
然后10月1号我登陆的时候发现号又进了苦行!!!!
我去查询,竟然说我用外挂!!!
天地良心!!我的号都是我自己一点一点的刷出来的!!!!绝对没有使用外挂!!!
而且我是名普通玩家我以玩游戏为乐趣!!
根本不会去为了赚点游戏里面的游戏币去使用外挂!
我去查了下登陆IP,发现9月30号有个7分钟的登陆时间的IP是在湖北武汉!!!
我压根不在武汉,而且之前的登陆IP也都不在武汉!!
为什么我的号在武汉登陆了!!
这算是被盗么?
总而言之我觉得我很冤枉非常非常的冤枉,
天地良心,我绝对没有使用外挂
至于你说电脑里其他的软件会不会误报成外挂我就不知道了
总之我的苦行都是我自己一点一点刷出来的
我电脑里没有集线器,没有喊话器,总之你说的外挂我都没有
我也从来不会为了一个游戏搞什么外挂
我去申诉了
但是结果让我很失望,
工作人员坚决说我用了外挂
还说查询到了数据
我觉得很可笑
因为我真的没有用外挂
你查到的数据到底是怎么查到的呢
我会继续申诉,
希望版主重视帮我洗刷冤屈
我不想平白无故的刷1200个苦行
承认自己没有做过的事。
之前被商牟我也觉得有点冤枉
我5开原因只是为了能够组队方便
同宿舍的朋友在另一个区5开
3个月出了800元的菜(职业牟利能出这么点?)
然后就把我们一条网线的所有号都进了苦行
他的号怎么样我不知道
我的号有锦衣有坐骑
没事跑跑储备还帮帮里的人免费杀剧情
结果被苦行
我从来没有出过一分钱的游戏币
我的钱都是每天捉鬼和跑储备还有做活动来的
存了很久很久打算给自己买套好装备的
这个我就认了,毕竟网线里有朋友卖过游戏币
但是说我用外挂的我真的无法接受
希望能还我清白。
才气贡献度精华
江边小龟, 积分 330, 距离下一级还需 270 积分
江边小龟, 积分 330, 距离下一级还需 270 积分
我想知道你们是靠什么来检测出用没用外挂的。
才气贡献度精华
桃瓷瓷ι.
& &楼主你好。兔子建议您再申诉一次。 因为外挂的问题我们这边也查询不到,还是只能让技术人员查询一下。
我就是萌呼呼的小豹子
热门活动:||||||||||
才气贡献度精华
江边小龟, 积分 330, 距离下一级还需 270 积分
江边小龟, 积分 330, 距离下一级还需 270 积分
谢谢版主~版主终于回我了
好兴奋好激动好欢天喜地~
我会继续申诉到底
因为我真的没用外挂
才气贡献度精华
清水小虾, 积分 6, 距离下一级还需 94 积分
清水小虾, 积分 6, 距离下一级还需 94 积分
牟利的定义是什么,卖梦幻币么?那么为啥那么多人收?
我的号在3号被定义为外挂,然后我申诉,GM也说不出所以然了,接下去就变成牟利了,我只能呵呵了。
有人收才有人卖,牟利的定义真心都是GM自己定义的吧。
才气贡献度精华
清水小虾, 积分 75, 距离下一级还需 25 积分
清水小虾, 积分 75, 距离下一级还需 25 积分
桃瓷瓷ι.
& & 建议走法律途径解决,如果确实侵犯了你的正常游戏权利,可以提出赔偿,你现在跟他们申诉没用的,网易鸟都不鸟你,你只有去告他们,他们才会重视,才会把你的事放心上
Powered by<专注网络游戏工作室赚钱项目攻略!
当前位置: &#62;&#62;
&#62;&#62; 正文
日 18:35:19&&分类: 游戏工作室建立
最近腾讯大封号,并且严打,不少作者都跑路了,这个行业还真是难做!今天闲来无事,跟朋友们聊聊网络游戏防封号的事儿。也是做游戏工作室的最想解决的一个大问题。有那么一句话叫作“如果能不封号,任何游戏都赚钱,呵呵”万事无绝对,没有百分百的防封技术,但也没有不存在游戏工作室的网游,只是从一个程序员的角度闲聊一下防封方法,不鼓勿喷!一,服务器数据库上记录些什么1,帐号信息: 充值记录,元宝消费,登陆时间,ip地址,mac码等。2,角色信息: 物品获得记录,金钱,宠物交易记录等。所以有很多时候被,并不是发现了你用了脚本或外挂,而是官方在后台数据库搜索匹配条件找到而已。二,游戏检测外挂方法1,服务器上有些游戏会对数据包进行严格检查,有些不会。不过服务器上的对数据包的检验都很严格,数据的真实性都是以服务器上为准。对于不加密的数据包,即使你发现了,也别高兴太早,如果游戏真的火了,把加密弄上也就一周左右的工作时间,而且更换加密方式也很快,现在封包挂不是个出路了。2,客户端上主要检测力度很多公司都不一样,像TX,网易这些公司就很严格,很多小公司干脆是祼奔,其实只要游戏赚钱了,检测外挂肯定会多少加上点。说下我所知道检测方法:(1)对关键api Hook进行保护,网络相关send recv,(2)dll注入检测可能是hook loadlibrary,也可能是定时检测进程模块(找到非法模块就退出)(3)对于用od进行调试客户端,似乎都没有彻底的办法,一般就是加些花指令,加壳做些干扰,不过这也足以挡住大部分水平不够的作者(4)很多游戏都会对PE,OD,按键精灵,简单游等进行检测,主要是枚举窗口名字,进程名字。(5)按键类外挂检测,对于后台脚本主要是用GetCursor,GetForegroundWindow,检测窗口位置和鼠标位置是否正确,还有些是对WM_ACTIVE消息进行处理(神武就是这么干),对于前台脚本除了把鼠标弄偏移外,也就没有什么更好的办法了,不过这个偏移对普通玩家也很不友好,也影响游戏公司留存玩家。(6)对于有些人说检测鼠标点击位置的重复度,这个多半是他们自己的猜想,这样做很容易造成误封。三,现在个人觉得目前最好的辅助方式是,图像识别加鼠标移动和点击call结合起来,或者hook GetCursor,GetForegroundWindow等后台相关api,图像识别,任何游戏都不可能检测得到,而且现在的图像识别方式也已经很成熟,可以做到识别人脸程度。&&&& 四,外挂脚本开发语言:简单的功能,可以用按键TC,易语言,个人不看好按键,语法扩展性差,也容易被针对。推荐c++和python或者lua脚本语言结合起来,c++实现具体功能,注入,远程call,后台,前台消息发送,按键模拟等。脚本层语言负责写具体的逻辑就可以。基本上我所了解的游戏检测方法与防封号策略也就这些了,大神们见笑了。说的对也好,错也罢,请批评教育,不接受侮辱谩骂。
此文&&原创,转载请注明地址:
标签:&&&&&&&&
昵称(必填)
记住我,下次回复时不用重新输入个人信息
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
Post: 10:23:34
狗逼一条,天朝就是有这种垃圾网游界才这么烂
Post: 11:26:47
防封主要两个方面 一《服务器数据特征》也是你的行为数据产生的特征二 《客户端检测》 就是他的客户端 对于汇编大牛 二 是非常容易搞定 一个游戏汇编大牛 几个月就把他的客户端给逆向了 什么取MAC 硬盘信息 操作系统 找到他调用API的地方直接给他NOP掉或者让他取到假的信息就行了
第一个是关键
Post: 16:20:43
你是个懂行的。。。。
Post: 16:22:57
其实我有一套完全防封的理论和方案,但只可惜我不会写软件,如果有程序员(要求起码有过写call外挂的经验)和我合作,我一定能让他赚到钱
Post: 17:14:56
给个游戏防封的成功案例出来分析下
Post: 17:14:06
能不能自己开发一个挂
Post: 21:52:38
阅。完全同意
Post: 20:35:45
图像识别确实不容易封号,但是也不好用啊!
【相关文章】 20:16:28 9:34:36 17:37:25 17:44:11 12:9:7 12:27:22 17:13:2 17:5:31 18:6:58 10:35:19
站内搜索_游戏工作室项目
网游工作室_猜你喜欢
网游工作室_最热文章
备案号: 辽ICP备号-1
【NBE游戏工作室】我们一直被采集,但从未被超越!和NBE一起做吧。痛,并快乐着!!!查看: 1963|回复: 15
规避网络游戏的外挂检测机制
阅读权限40
在线时间10 小时
积分主题听众
技法精湛来自于日积月累
论坛严禁灌水,一律永久封禁!</
规避网络游戏的外挂检测机制
你们有些人可能已经知道,很多游戏公司(译注:就是指暴雪)最近对“黑客”采取了严厉措施。他们全方位地实现了基于用户态(userland)的检测机制,手段从非常简单到极其复杂的都有。我在过去几周里花了大量的时间,试图找到一种通用的规避检测的方法。从某种意义上来说,我们面临的处境和游戏公司很像:你只需找到他们的游戏系统的一个缺点就可以加以利用,而他们必须把系统设计得毫无漏洞;同样,在我们隐藏自身躲开他们的检测代码时,他们只要发现一处失误就可以抓住我们,而我们要把系统设计、实现得完美无缺。下面的文章是我在这方面的尝试。它肯定不是完整或者完美的,但我想这是朝着这个目标迈进的第一步。
II-已加载模块的检测
这里假设我们要往目标(译注:指游戏进程)加载一个模块(大部分外挂或者bot的做法)。我们必须对两种不同的情况加以区分,它们都可能导致恶意模块被检测出来。这两种情况是:注入时和其他时间(译注,指外挂加载时和外挂工作时)。
基本上每种DLL注入法都会在某处调用LoadLibrary。因此如果你想捕捉模块,一种简单的检测办法是截获LoadLibrary(或者LdrLoadDll,或更底层的Native API)。
这个问题有两种解决方法。第一种也是最简单的一种方法是把模块名称随机化。由于很多合法软件往系统里所有进程注入DLL(Trillian, AIM, 热键软件,等等),合理的检测系统不会使用“白名单”设计(这种检测方法确认只有那些验证过的模块可以加载,而把那些没在白名单上列出来的统统看成恶意模块),因此他们只能用黑名单,这就使得随机化模块名称是对付这类检测的完美、可行的解决方案。
我实现的另外一种方法是换一种做法来注入DLL,我称之为“手工映射”(manual mapping)。第一眼看上去,去模拟windows的PE loader是一件令人沮丧的事-你很难把每件事情都做正确。但其实它也没那么难,我的ManualMap(附录)代码就是干这个用的。我知道对ManualMap还可以做很多很多改进-事实上我自己有一个改进很大的版本-这个只是一个概念验证(proof of concept)的东西。
模块被注入到正在运行的进程后,有两种办法可以检测到它。第一种是扫描模块链表或者对那些你认为是外挂的模块调用GetModuleHandle(译注,看GetModuleHandle是否返回NULL)。对付这种检测的办法是利用CloakDll(附录)之类的工具把你的模块从链表中去掉。或者用ManualMap,这样你的模块从一开始就不会被加到链表中。我认为第二种做法好一些,但他们差不多是一样的。
第二种检测已加载模块的方法就聪明多了。它的做法是枚举系统中的所有内存页面(内存页面是1024字节对齐的,所以这其实很容易做),然后检查不良代码的特征码。应对措施是做一个改进的dll loader,把内存页面的边界到实际数据的起始偏移随机化(译注,也就是说不把DLL加载在页面边界处,而是离边界有一个随机的偏移)。然而,我觉得更好的方法是创建两个新的空白页面来包住你的模块,然后用VirtualProtect给这两页设上PAGE_GUARD标志。标有PAGE_GUARD位的内存在访问时会产生一个异常,你可以用未处理异常过滤器(unhandled exception filter)、向量化异常处理(vectored exception handling)或者KiUserExceptionDispatcher hook(我推荐后者)捕捉这些异常,这样碰到扫描时你就有机会做一些处理来避免检测代码抓到你。
III-Hooks,Patches和CRC检查
值得让人一用的外挂基本上都会以某种方式修改游戏代码。但是修改代码是非常容易被检测到的,到现在也没有人能对这个问题提出一个可行、通用的解决方案。我恐怕也不敢号称我已经完全解决了这个问题,但我发现了一个让它变得驯服点儿的办法。
我提出过一种不用修改任何目标进程代码就能hook函数的方法,唯一的缺点是你只能同时hook4个函数。我的做法是利用调试寄存器(即硬件断点),你可以在附录的CHook类中看到我的实现。由于调试寄存器检测起来相当容易,任何人只要用CONTEXT_DEBUG_REGISTERS来调GetThreadContext就可以发现它,随便一个异常处理例程都会拿到一个包含调试寄存器的上下文结构(context structure),等等。解决办法是hook住NtGetContextThread、NtSetContextThread和KiUserExceptionDispatcher。当然啦,你得用一些patch来hook这些API。由于颇有一些防病毒/防广告/防火墙软件也hook这类函数来“增强系统的整体安全”,所以检测系统如果仅仅因为你改了这些系统dll就认为你作弊也是不大可能的。这意味着你可以安全的hook这4个函数,用不着担心被检测。
即使他们也许不会仅仅因为在系统模块中发现了这些hooks就抓你,但它们还是给检测留下了一点线索-他们可以通过定位你在系统模块中的hooks,分析patch的跳转指令看它跳到了哪里,然后对hook处理过程做一下CRC就足以把你认出来。
这又有两种解决办法。一种是利用int 3断点指令来做hook,然后捕捉异常(如果看的够仔细的话你会发现这在我的CHook类里也实现了)并把异常重定向到合适的hook处理过程-你需要用标准的jmp patch来hook KiUserExceptionDispatcher(这有点和我们的目标矛盾),或者用两种标准的SEH(结构化异常处理)形式之一。
还有一种办法,我觉得要好的多,虽然实现起来有点儿困难。其实也没什么花头,就是写一个hook处理过程的变形引擎,在真正有用的指令之间填充NOP等效指令(NOP等效指令是指mov eax, eax之类的指令。译注:push eax, pop eax这样的也是)。这样,对你的函数做CRC检查就行不通了。我现在还没有这么做,不过以后我可能会写些PoC代码(译注:PoC即Proof of Concept)。
最容易的一种做法是从shellcode那里来的。我敢肯定你们都知道,为了避开IDS签名(译注,IDS=Intrusion-detection system),shellcode通常是加密的,带一个动态解密的loader。用汇编给运行时解密代码写一个简单的变形引擎是很容易的,通过在不同的指令之间放置NOP指令,并且让****在每次加、解密时随机变化,你可以把创建签名的任何企图变得非常困难-即使不是不可能的话,而且不会牺牲多少性能。
调试寄存器在其他很多方面也是相当有用的,你可以用它hook内存读写和指令读取,这意味着你可以为内存修改做一个回调函数(用在内存数据监测上很理想,这意味着你再也用不着轮询了)。对调试寄存器的完整描述可以在附录中找到。
另外一点要考虑的是,他们可能都不检测你的API hooks,简单的用原始数据patch回去就能让你的hooks无效。这种方法实现起来不难,而且有足够的可移植性-因为不同的Windows版本中大多数API的开始几个字节是不会经常改变的-游戏公司是有可能这么干的。要对付这个问题,我们得意识到一点,就是在对进程映象的代码段进行写操作之前,必须调用VirtualProtect临时改变它的页面属性。因此,截获NtProtectVirtualMemory就可以防止他们轻易的覆盖掉你的辛勤劳动成果。
总而言之,注入一个模块并设置4个不可检测(在ring3级别上)的hooks是可能的。也许在某些地方会有漏洞,但我所说的基本原理应该是能到达这个效果的。以上是我对在用户态创建反检测系统的所有尝试。我知道你们肯定有能力在我描述的基础上加上你们自己的见解,我也真诚的希望你们会这么做。这个解决方案不像很多正在搞game hacking的人想的那样是一个秘密的安全体系,也和那些闭源软件开发商的做法不一样。游戏黑客比别人懂得更多,应该知道这一点,因为你们全都是玩逆向工程的。你们活着就是为了击败那些通过晦涩的手段来实现的系统安全。。。自己不要掉进同样的陷阱。
联系我时,请说是在 外挂海论坛 上看到的,谢谢!
上一篇:下一篇:
阅读权限30
在线时间6 小时
积分主题听众
佩服佩服!
阅读权限30
在线时间6 小时
积分主题听众
OMG!介是啥东东!!!
阅读权限30
在线时间5 小时
积分主题听众
无回帖,不论坛,这才是人道。
阅读权限50
在线时间19 小时
积分主题听众
围观 围观 沙发在哪里!!!
阅读权限30
在线时间1 小时
积分主题听众
阅读权限20
在线时间1 小时
积分主题听众
我也是坐沙发的
阅读权限80
在线时间27 小时
积分主题听众
前排支持下
阅读权限30
在线时间4 小时
积分主题听众
看帖是一种习惯,不过我回帖也是一种习惯 更是一种美德
阅读权限10
在线时间2 小时
积分主题听众
向楼主学习
Powered by Discuz! X3.2
Comsenz Inc.

我要回帖

更多关于 如何防止贴吧系统删贴 的文章

 

随机推荐