找回密碼
 立即注册

防挂算法

[複製鏈接]
udbwfnai 發表於 2010-12-12 12:18:21 | 顯示全部樓層 |閱讀模式
现在大部分的主流外挂,包括按键精灵,自动做一些动作之类的外挂。 都是通过HOOK进游戏窗口,并且用不同的HOOK类型来完成的,比如对于网络,通常是通过HOOK消息,把DLL弄到我们的游戏程式中,然后通过 GetProcAddress得到DLL中他们卑劣的函数的地址和真实的函数地址,然后通writeProcessMemory来把我们的函数地址改成他们他们的API地址。% z/ @: d' q/ W, R$ B% h

( T2 h& ?9 J0 P! T) n那么在我们的游戏执行的时候,收到消息就会先触发他们的钩子,等他们布置好邪恶的陷阱,然后再执行我们的程式。那么,对于这类型的外挂,该怎么防呢?俗话说得好,以彼之道,还制彼身。所谓魔高一尺,道高一丈。所谓邪不胜正。所谓天网恢恢。所谓做贼心虚。
; b) [9 o% ^( z2 R9 x( G- q. X; k; N- G) J1 X1 T
恩,WINDOWS的钩子有个特点,就是钩子链,因为对于同一个进程,即使是同一类型的钩子,能同时有多个,也就是说,对于同一个游戏,开两个功能相同的外挂也能够。那么,怎么样来决定钩子的顺序呢?所谓后来者先得,WINDOWS的做法是,最后一个HOOK某个进程的钩子最先执行。并且振奋人心的消息是,在钩子里面能够控制下一个钩子是否执行。; Z. U3 T: R0 F# `

' \# \) g" W5 h, {4 @+ W这个函数是CallNextHookEx,也就是说,假如在某个钩子里面不执行这个函数的话,钩子链就会在这中断,那么我们的思路就很简单了,在游戏运行中,开一个进程,每隔一段时间就hook我们的主程式,然后在钩子里面,不执行CallNextHookEx,这样就能够避免别人的钩子执行。 + S6 l, `* `6 e  K7 k" `) l' Y# w' r
4 j" Z+ J, Z& p7 Q9 {( l# _9 B  ]
所谓,仅仅发现敌人还不够,还要消灭敌人。不急,我们来看看怎样彻底把敌人打成粉碎性骨折。恩,要消灭敌人就要复杂一点了,要针对不同类型的钩子来采取不同类型的方法了,因为敌人的钩子不管怎么做,无非是出于两种目的,一种是修改数据,另外就是过滤数据。其核心思想就是我们自己的游戏注册两个钩子,一个总是在钩子链的最底层,另外一个总是在钩子链的最上层,一比较两个钩子收到的消息,就知道中间有没有别的钩子了。一但发现有别的钩子,不用想了,肯定是外挂,最少也用了按键精灵,封号,杀档,想怎么干就怎么干。, f3 V9 z8 ]0 B
当然,敌人也不是这么脆弱的,据说有人用raw socket来截获任何的网络消息,这个跟钩子无关,这个更底层一些。但是不用怕,俗话说得好,以彼之道,还制彼身。所谓魔高一尺,道高一丈。所谓邪不胜正。
7 r+ U# Z5 a/ u& t5 c3 B这里首先要把敌人分类,对于水平最次的敌人,方法也相应要简单得多。最次的敌人一般用的方法是自己写一个wsock32.dll放在和游戏相同的目录下,来替换掉系统的wsock32.dll。对于这种愚蠢的方法,解决的办法有很多,把load time的载入wsock32.dll改成run time的载入,然后指定一下 / `: O3 b8 E: \6 }; x
路径,就什么问题都没有了。更简单点,运行游戏的时候检查一下当前目录下有没有wsock32.dll,有的话,那就肯定是外挂钩子了。
* B/ z" Z/ X! D8 {9 n1 B8 |
+ y8 ~1 q8 J. _* ^, \) y# D. j5 N! `比最等级高一点点的敌人,会喜欢用钩子来直接钩,一般的做法是,先通过GetProcAddress来获取SOCKET API的地址,然后通过WriteProcessMemory的方法来修改入口地址,将其改成jmp 自己的函数地址。这种方法其实很卑劣的,所谓无毒不丈夫,我们能够通过修改通用的GetProcAddress的代码来防止别人拦截SOCKET,这样,直接连防火墙都能够突破了。
8 s% k$ f' X# k& Q6 K3 l
4 ]2 p7 C, ~7 ~5 s这里的技术难点在于,我们不能用类似WriteProcessMemory的方法来写内存因为我们不知道究竟外挂是哪个进程,所以我们需要修改WINDOWS的代码段,这样讲理论上是不可能的,可惜WINDOWS自己给自己留了个后门,在kernel.dll里面,UINT AllocCsToDsAlias(UINT),通过把API的代码段的选择符传给他,能够返回一个能够写的数据段的选择符,然后把新的选择符和API的入口地址
7 Z( o( {- @( ?& O0 X) v5 W1 T  Y加在一起,就能够得到一个能够写的代码段的指针。 4 G8 b) y9 W) U9 W- s8 h
1 ^" r& b6 `- y" Y) X: S. H1 E
国内好多取词软件和全屏翻译软件都是用的这个原理,具体的例子如下: " z! U, `" C  h
比如GetProcAddress这个API,在kernel.dll里面,我们要做针对他的通用 4 j2 y& o* p5 V% L
钩子就应该按照以下的步簇: typedef UINT (WINAPI* FOO)(UINT);
5 F! z  w- Z! e$ ]% W5 U7 P7 u1 d2 f1 w! y$ b& [( ~& s& P9 I
FOO AllocCsToDsAlias;
" X1 C: Y! u3 k# w6 z5 R
, V- Q9 M8 I4 T8 ^8 qHMODULE hKernel = GetModuleHandle("kernel");
4 |6 [# |  x& A* t2 ?' \8 O. ^7 |
" O2 W! b3 R/ j' IAllocCsToDsAlias = (FOO)GetProcAddress(hKernel, "AllocCsToDsAlias");
/ c4 l# K& z& e, P6 K2 h1 O; J% D! s7 o
$ `! `5 y' z" _: }& XFARPROC entry = GetProcAddress(hKernel, "GetProcAddress");
# V" @7 \8 Y4 x( P# P1 k9 H  W' `" D4 \$ ?5 |, J
WORD offset = (WORD)(FP_OFF(entry));   a4 o7 N+ g9 T7 Z, [. D* r
' E* r3 h4 k; R
UINT selector = AllocCsToDsAlias(FP_SEG(entry));
6 }) Q) ?0 j# j* T" H
! p; `/ T8 W. tBYTE *addr = (BYTE *)MK_FP(selector, offset);
5 o3 E! n9 _; i' D# }0 p. h7 O然后就能够往addr这个地址写5个BYTE的东西,第一个BYTE是jmp,不同的CPU可能会不同,之后的一个DWORD是您的函数的地址。
  g: E) r. M. g4 s+ r( z6 L, z1 J
4 w, }% P1 s% a+ [这样,能够通过保存两份addr的数据来做到钩子的开关,当钩子打开的时候,任何的etProcAddress的调用都会调到我们的函数,这个时候能够通过检查 假如有人想GetProcAddress wsock32.dll里的东西,我们就干掉他。。4 `$ A2 d0 v+ I4 n9 \7 c6 D3 x

1 x+ \! D$ f. h! E4 d$ d" T  l同样,假如有人通过开启socket这个API的SOCK_RAW参数来调用RAW SOCKET监视网络,我们也能够通过上面的方法来做到先入为主,看谁在监控我们的网络传输。
3 J2 t0 y( V. r5 L, W+ Y/ N
1 c4 d7 P: T4 E7 o其实查外挂的原理和捉病毒的原理相同,只是现在做外挂的技术还不成熟。当做外挂的技术和防外挂的技术在同一条线上的时候,想从技术上防住外挂是不可能的。 7 ?8 w/ }, M5 H" R
, ?+ {( {4 w( [$ G7 x& L# x( {
其实是无奈,杀毒软件的做法是出来一种新的病毒,在第一时间内公开其特征码,然后更新任何的客户端,看到这种特征的,就杀。其实查杀外挂也该如此,其实CS的Cheating-Death就是这个原理,不管出了什么新的外挂,CD总是在第一时间内更新,然后客户端也就傻傻的只要一看到有这个特征的东西就把他干掉。其实仔细想想,这是个很好的主意,从外挂研发商的动机来分析。他们之所以要研发外挂,估计炫耀技术是一方面,更重要的还是想赚 钱,或用来挂机之类的,既然要赚钱,或挂机,就必然会被其他玩家发 现或举报,这个时候应该做的就是尽快的下载一份外挂,或根据其行为   I3 r9 l# S# l* \+ ~: y; t
研究其特征,并在防外挂的特征码上记下一笔,其实不用太复杂,最简单的做法就是记住其外挂窗口的名称,然后只要看到这个外挂窗口,做些处理就好了。 . w# V8 a0 e1 t% ?0 S

; U$ ^' `1 W9 i; y( i. h那么这样一来,关键的技术就落在怎样设计查外挂这个结构上了,首先客户端需要的是个查外挂引擎,和一个外挂特征库,根据引擎和特征库生成一个固定的版本号,然后每次登陆的时候就用这个版本号,跟服务器上的版本号对比,假如不相同的话,则从服务器自动下载最新的查外挂引擎和外挂特 4 g$ I* Y: Z/ k7 v- r$ P
征库。 / }) t- E; q6 d

0 G9 S* w" _) N6 {这样虽然不能将外挂赶尽杀绝,却能比较大的限度上围剿使用外挂的风气,相信使用外挂的玩家也只是想更好的玩游戏,只但是动的念头有些歪了,但其出发点仍是好的,只要在他使用外挂的时候多些阻拦或诱导他不使用外挂,这样效果就会好很多。设想一下,谁愿意每天等一个外挂的更新,而不
3 ?& M( b$ |) e& g: s) t+ o去玩他很想玩的游戏呢。这样一来,制作外挂的人也会逐渐减少,从而进入一个良性循环。
& d& o% f% ?4 k( J) ~5 I) A; a! A! v+ v. V4 p
就好象如今写病毒,并不如当年那么流行了。。-。-
4050917 發表於 2010-12-21 19:31:03 | 顯示全部樓層
NB   狠人!!
回復

使用道具 舉報

13100800456 發表於 2011-3-2 12:59:06 | 顯示全部樓層
非常给力!!非常给力!!非常给力!!
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

QQ|Archiver|Mobile|Disable|About|Facebook|Discord|叛逆家族論壇

GMT+8, 2025-11-3 17:24

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回復 返回頂部 返回列表