简单谈谈“游戏圈”所谓的神乎其技的行为检测
开始写这些东西只是想说明几件事儿:
1.这个世界有矛,必有盾,相反有盾,也必有矛。世界上没有不透风的墙。
2.有些东西不是传说中的那么神。
3.传说是怎么来的。
![恐怖!]()
游戏圈里很多走上快速发财道路的人对行为检测这个说法不陌生,
从这个词诞生以来,各种封号统一说法行为检测,
然后一直就有人想过各种对抗(什么数值模拟,什么技能模拟),
结果一直没啥明显的效果,
最后悲情的开始宣传行为检测完全是游戏服务器对于数据分析做出来的。
其实真相不是这样的...
![扮鬼脸]()
![扮鬼脸]()
所谓行为检测,其实可以看作几种检测的组合加上一个简单到可怕的监控策略。
首先是程序代码暗桩,不是说这些暗桩 人看不到,只是由于VM的原因,很多人大脑自动忽略了暗桩——在这里重审一下,代码VM化,真的杀伤性强大...
曾几何时一个简单的Flag标记和一小段比较坐标移动记录的代码搞残无数高人,
还曾几何时一个简单的不可见标记的暗桩搞残无数全屏...
由于不知道找不到暗桩,所以开始有人大声宣扬这是行为检测。![酷]()
然后是神秘信息通信动态检测,这里的神秘信息很多,有进程,有窗体,有各种各样的东西(cpuid,mac,bios,硬盘,系统版本,安装过的软件等等一个不能少)![124.gif]()
![124.gif]()
这些东西拿来检测什么呢?主要是判定多开,多账户同一机器登录等等,甚
甚至有的会上传未知进程和运行模块的文件等等东西...
而这一切都可以是一段随时随地到达机器上的shellcode模样的东西(某公司使用的是明文lua脚本,某某公司使用抽象代码——自带解释器??),
于是由于进行逆向分析的人员没有长期监控研究,所以发现不了这种动态检测,
于是被XX后又有一些不愿意继续被坑下去的人就开始加入大叫行为检测的行列。![碌眼]()
最后是一个策略,这个策略就是不进行即时处理,比如一个检测发现问题了,可以等3天后把检测出问题的机器上登录过检测出的问题的帐号统一封号,或者干脆第二天把与检测到的帐号发生交易行为最多的帐号封号...于是又有人大叫行为检测。![伤心]()
说这些到底有木有真正的行为检测,其实是有的,但是基本不多见,也没几个真的大规模应用(自己猜想服务器负担吧~~)![恐怖!]()
![恐怖!]()
![恐怖!]()
![恐怖!]()
第一篇就到这里吧,后面从第二篇,我开始讲讲一些具体的检测code是怎么写的~~
第二篇 http://bbs.pediy.com/showthread.php?t=166298
第三篇 http://bbs.pediy.com/showthread.php?t=166302
第四篇 http://bbs.pediy.com/showthread.php?t=166309
第五篇 http://bbs.pediy.com/showthread.php?t=166492
第六篇 http://bbs.pediy.com/showthread.php?t=166574
第七篇 http://bbs.pediy.com/showthread.php?t=166703
IGS 国际游戏安全组织 站点
1.这个世界有矛,必有盾,相反有盾,也必有矛。世界上没有不透风的墙。
2.有些东西不是传说中的那么神。
3.传说是怎么来的。

游戏圈里很多走上快速发财道路的人对行为检测这个说法不陌生,
从这个词诞生以来,各种封号统一说法行为检测,
然后一直就有人想过各种对抗(什么数值模拟,什么技能模拟),
结果一直没啥明显的效果,
最后悲情的开始宣传行为检测完全是游戏服务器对于数据分析做出来的。
其实真相不是这样的...


所谓行为检测,其实可以看作几种检测的组合加上一个简单到可怕的监控策略。
首先是程序代码暗桩,不是说这些暗桩 人看不到,只是由于VM的原因,很多人大脑自动忽略了暗桩——在这里重审一下,代码VM化,真的杀伤性强大...
曾几何时一个简单的Flag标记和一小段比较坐标移动记录的代码搞残无数高人,
还曾几何时一个简单的不可见标记的暗桩搞残无数全屏...
由于不知道找不到暗桩,所以开始有人大声宣扬这是行为检测。

然后是神秘信息通信动态检测,这里的神秘信息很多,有进程,有窗体,有各种各样的东西(cpuid,mac,bios,硬盘,系统版本,安装过的软件等等一个不能少)


这些东西拿来检测什么呢?主要是判定多开,多账户同一机器登录等等,甚
甚至有的会上传未知进程和运行模块的文件等等东西...
而这一切都可以是一段随时随地到达机器上的shellcode模样的东西(某公司使用的是明文lua脚本,某某公司使用抽象代码——自带解释器??),
于是由于进行逆向分析的人员没有长期监控研究,所以发现不了这种动态检测,
于是被XX后又有一些不愿意继续被坑下去的人就开始加入大叫行为检测的行列。

最后是一个策略,这个策略就是不进行即时处理,比如一个检测发现问题了,可以等3天后把检测出问题的机器上登录过检测出的问题的帐号统一封号,或者干脆第二天把与检测到的帐号发生交易行为最多的帐号封号...于是又有人大叫行为检测。

说这些到底有木有真正的行为检测,其实是有的,但是基本不多见,也没几个真的大规模应用(自己猜想服务器负担吧~~)




第一篇就到这里吧,后面从第二篇,我开始讲讲一些具体的检测code是怎么写的~~
第二篇 http://bbs.pediy.com/showthread.php?t=166298
第三篇 http://bbs.pediy.com/showthread.php?t=166302
第四篇 http://bbs.pediy.com/showthread.php?t=166309
第五篇 http://bbs.pediy.com/showthread.php?t=166492
第六篇 http://bbs.pediy.com/showthread.php?t=166574
第七篇 http://bbs.pediy.com/showthread.php?t=166703
IGS 国际游戏安全组织 站点
上一篇谈了一些东西。
![酷]()
这里开始想说说检测code是怎么写的。这里不讨论进程,窗体这些常见信息的检测。
假设被检测的东西已经完美突破各种暗桩,各种ws的扫描。
![酷]()
本篇就先来一个日了无数纯CALL模型的辅助的检测吧。
下面每篇再多讲一些~
关键性的代码很简单
服务器发个请求XX检测的包过来
本地返回下面代码计算的数据
作用就是计算键盘,鼠标,手柄这类设备有多少秒不操作了~~
这个代码是有很多变形的,比如使用IdleUIGetLastInputTime这个api,
或者通过设备钩子记录最后输入时间(有的游戏甚至用驱动去记录的...)
服务器根据你的操作离开时间长短和进行了那些不可能离开操作的事情来判断...
![恐怖!]()
![恐怖!]()
![恐怖!]()

这里开始想说说检测code是怎么写的。这里不讨论进程,窗体这些常见信息的检测。
假设被检测的东西已经完美突破各种暗桩,各种ws的扫描。

本篇就先来一个日了无数纯CALL模型的辅助的检测吧。
下面每篇再多讲一些~
关键性的代码很简单
服务器发个请求XX检测的包过来
本地返回下面代码计算的数据
代码:
DWORD GetInputAwayTime()
{
LASTINPUTINFO lpi;
lpi.cbSize = sizeof(lpi);
GetLastInputInfo(&lpi);
return DWORD((GetTickCount()-lpi.dwTime)/1000);
}
这个代码是有很多变形的,比如使用IdleUIGetLastInputTime这个api,
或者通过设备钩子记录最后输入时间(有的游戏甚至用驱动去记录的...)
服务器根据你的操作离开时间长短和进行了那些不可能离开操作的事情来判断...



第二篇中谈到了对纯CALL的辅助软件的一种检测手段,索性接着乱谈这种辅助的检测手段。
不过这里谈谈暗桩模式的检测,堆栈遍历逐层找返回的EIP相信很多人都会。
不过在某些Call的地方插入下面这样的代码,比如游戏逻辑的发包call的加密call里面
于是悲情又出来了~![恐怖!]()
![恐怖!]()
![恐怖!]()
第三篇内容就这些吧,还有几个有意思的检测和暗桩的方法等继续讲~~
不过这里谈谈暗桩模式的检测,堆栈遍历逐层找返回的EIP相信很多人都会。
不过在某些Call的地方插入下面这样的代码,比如游戏逻辑的发包call的加密call里面
于是悲情又出来了~



代码:
WCHAR wzCallerName[MAX_PATH];
PVOID dwRetArray[62];
DWORD dwRetCount;
BOOL bNeedLogStack = TRUE;
dwRetCount = RtlCaptureStackBackTrace(2,50,dwRetArray,0);//用api是不好的,可以自己实现的说~~
if (dwRetCount)
{
for(DWORD xIndex=0;xIndex<dwRetCount;xIndex++)
{
if (CheckExcepAddr((DWORD)dwRetArray[xIndex]))//排除部分白地址
{
bNeedLogStack = FALSE;
break;
}
}
if (bNeedLogStack)
{
for(DWORD xIndex=0;xIndex<dwRetCount;xIndex++)
{
GetCallerModule((DWORD)dwRetArray[xIndex],wzCallerName);//获取地址模块名称
ReportToSrv((DWORD)dwRetArray[xIndex],xIndex,wzCallerName);//把信息写入定时返回服务器的数据体里,嘿嘿~
}
}
}
第三篇内容就这些吧,还有几个有意思的检测和暗桩的方法等继续讲~~
接续上篇 第三篇~
先补充点检测技巧
很多人会注意到检测扫描中的进程,模块,窗口的扫描(大部分写检测的人都觉得这些就ok了),但是不会注意到可以通过扫描本地TCP连接信息来检测——比如某辅助会连接固定登录验证服务器(ip?端口?),于是服务器上添加一个扫描特征,完爆之,以后只要是这个服务器的辅助直接就是不解释封号...
接着进行本篇的部分,上次继续讲了通过call的辅助的检测,这次就不讲它了,我换个话题,讲讲一直以来被很多人推崇的模拟设备操作的辅助的检测。![恐怖!]()
![恐怖!]()
![恐怖!]()
首先对后台模拟按键的检测
有两种后台模型,一种是消息的,不过估计现在已经绝种了,是个游戏公司开发都会dinput了。
一种是dinput里做手脚,两者检测方式一样,直接用GetKeyState结合GetForegroundWindow爆菊花(通过其他方式获取按键状态和窗体位置层次信息一样可以哦)——检测出来不封号,直接服务器留个记录,等那天高兴了再封。
接着就是纯前台的SendInput或者驱动(NTIO也算是驱动吧)模拟的,这种其实很不好检测,在32位系统里通常是通过内核hook来进行处理的,但是对于64位系统或者重载内核绕过hook的情况则需要一些新的小技巧就是记录按键点击的相对坐标,一般模拟辅助的点击坐标都是非常稳定的,然后通过一组特征来检测,不过这里已经涉及超出本篇的内容了——必须抓到样本才可以了。
第四篇有点水,第五篇尽量就来点不水的内容。
先补充点检测技巧
很多人会注意到检测扫描中的进程,模块,窗口的扫描(大部分写检测的人都觉得这些就ok了),但是不会注意到可以通过扫描本地TCP连接信息来检测——比如某辅助会连接固定登录验证服务器(ip?端口?),于是服务器上添加一个扫描特征,完爆之,以后只要是这个服务器的辅助直接就是不解释封号...
接着进行本篇的部分,上次继续讲了通过call的辅助的检测,这次就不讲它了,我换个话题,讲讲一直以来被很多人推崇的模拟设备操作的辅助的检测。



首先对后台模拟按键的检测
有两种后台模型,一种是消息的,不过估计现在已经绝种了,是个游戏公司开发都会dinput了。
一种是dinput里做手脚,两者检测方式一样,直接用GetKeyState结合GetForegroundWindow爆菊花(通过其他方式获取按键状态和窗体位置层次信息一样可以哦)——检测出来不封号,直接服务器留个记录,等那天高兴了再封。
接着就是纯前台的SendInput或者驱动(NTIO也算是驱动吧)模拟的,这种其实很不好检测,在32位系统里通常是通过内核hook来进行处理的,但是对于64位系统或者重载内核绕过hook的情况则需要一些新的小技巧就是记录按键点击的相对坐标,一般模拟辅助的点击坐标都是非常稳定的,然后通过一组特征来检测,不过这里已经涉及超出本篇的内容了——必须抓到样本才可以了。
第四篇有点水,第五篇尽量就来点不水的内容。


尽量不水~~
开篇先来一种检测小trap,HANDLE检测,这个检测主要是枚举句柄然后检测的东西比如隐藏的进程,特殊的被打开文件之类等东西,有时候也用来检测是否存在多个自身(基于对某些特别句柄的检测...)



接着进入本篇的内容,本篇说2个检测,也是不太常见的,和比较冷门。
第一个是对脱机类型的辅助的检测,服务器上记录累计在线时间长度(比如累计在线3天,1周,2周等),在总时间达到某个值的时候发送一个特殊数据给客户端,客户端抓住特殊数据后返回特殊返回结果。看似简单的东西,但是效果很好很强大。举一反三一下,还可以是账户角色等级,比如角色到达70级了,发检测...甚至是邮寄物品的次数啊,角色身上的钱数啊,好多可能的判断标准,所以效果很好,又很难被解决。



第二个是对非脱机的一个检测,这个检测很有意思,就是通过Windows自带的pnp即插即用接口去获取当前监视器的产品id(目前都是WMI方式的了,很少用SetupApi),然后返回给服务器。这里举一反三一下,其实还可以检测鼠标连接状态,键盘连接状态等等,甚至有的同事想出来如果存在摄像头则拍照取回判断是否存在人脸等等...
补充一下:
对于非脱机的辅助还有一种比较好的特殊手段,就是发个GM聊天信息给可疑的游戏玩家。


下一篇,准备讲一些关于多开的检测。
PS:如果需要讲一些其他的检测,请在本帖跟帖说明就行了,但是本人不针对任何游戏进行任何阐述,只能对某种检测进行一些解释和说明。
接续第五篇,上回说,这篇主要讲讲多开检测。
先来看看一般我们知道的多开检测有哪些
1.窗口和进程
2.各种各样的互斥体系(Event啊,Mutext啊,信号量啊,冲突域啊,Atom锁啊,pipe啊,本地端口啊,MapView啊,LPC啊,还有用RPC COM的,甚至有用特殊Cookie的~)
3.游戏保护的通信(![恐怖!]()
)
这三种就是常见的一般全宇宙都知道的~
那么这里也不再多说了,接着我来讲讲少数的
1.硬件id记录
2.服务器ip记录
这两种现在也逐渐被重视了,所以也不是我想说的。
我这里提一个很少有人注意到的东西::GUID![酷]()
关键API:CoCreateGuid
流程:首先读取本地保存记录(可以是临时注册表或者临时文件或者游戏保护公共内存或者交互式Set的Cookie——Cookie这种模型有时间再细说)里的GUID,如果没有就生成一个,然后保存一下;如果有则提取GUID投递给服务器...
服务器上判断不同账户登录的GUID出现重复次数,根据CoCreateGUID重复可能性的说法同一个GUID最多同时存在2个...(系统重启前游戏保存的GUID一般是不消失的...)
下面是解答 某位同学提出的 内存检测的时间了
内存检测有多种:
常见的是检测HOOK,这个很常见,基本都知道。
接着是检测模块或者代码,这个也是很常见的。
接着是检测游戏信息完备的,这个其实很多都做,但是做的好不好都不好说。
我来谈的也是这种检测 信息完备的,做法有很多种,
最常见的就是用复制多个角色对象,然后对比对象,这种比较麻烦的是服务器刷新数据,你要刷新多个对象数据。比较简单的方法,就是把对象的属性表(这种检测一般都是开发商提供代码的前提下才能进行的)在每次关键操作后计算一个HashStamp发给服务器(服务器上也有角色属性而且也支持Buffer叠加的情况下才ok..)然后就不用说什么了。
还有一种比较取巧的办法就是角色按照等级各种属性有个最大属性值(装备按照id属性也存在最大值,举例,1级的角色最大HP是300,装备加成最大是200,于是最多只有500的HP超过500就悲剧吧~),某一项数值超过最大属性极限时就向服务器发个包,服务器返回一个当前服务器上的角色信息,然后本地再次对比,然后再通知服务器是...![酷]()
![酷]()
就讲到这里,最后说一下关于VM的问题,归根揭底很多检测都是要调用API的,所以只要顶住API的调用,必然可以发现检测的秘密,所以为了保住检测的秘密,API现在很多都是reload和抽取的~~![狂笑]()
![扮鬼脸]()
下一篇,讲讲 网页游戏怎么做检测的。
从头看起 第一篇位置:http://bbs.pediy.com/showthread.php?t=166288
PS:如果需要讲一些其他的检测,请在本帖跟帖说明就行了,但是本人不针对任何游戏进行任何阐述,只能对某种检测进行一些解释和说明。
先来看看一般我们知道的多开检测有哪些
1.窗口和进程
2.各种各样的互斥体系(Event啊,Mutext啊,信号量啊,冲突域啊,Atom锁啊,pipe啊,本地端口啊,MapView啊,LPC啊,还有用RPC COM的,甚至有用特殊Cookie的~)
3.游戏保护的通信(

)这三种就是常见的一般全宇宙都知道的~
那么这里也不再多说了,接着我来讲讲少数的
1.硬件id记录
2.服务器ip记录
这两种现在也逐渐被重视了,所以也不是我想说的。
我这里提一个很少有人注意到的东西::GUID

关键API:CoCreateGuid
流程:首先读取本地保存记录(可以是临时注册表或者临时文件或者游戏保护公共内存或者交互式Set的Cookie——Cookie这种模型有时间再细说)里的GUID,如果没有就生成一个,然后保存一下;如果有则提取GUID投递给服务器...
服务器上判断不同账户登录的GUID出现重复次数,根据CoCreateGUID重复可能性的说法同一个GUID最多同时存在2个...(系统重启前游戏保存的GUID一般是不消失的...)
下面是解答 某位同学提出的 内存检测的时间了
内存检测有多种:
常见的是检测HOOK,这个很常见,基本都知道。
接着是检测模块或者代码,这个也是很常见的。
接着是检测游戏信息完备的,这个其实很多都做,但是做的好不好都不好说。
我来谈的也是这种检测 信息完备的,做法有很多种,
最常见的就是用复制多个角色对象,然后对比对象,这种比较麻烦的是服务器刷新数据,你要刷新多个对象数据。比较简单的方法,就是把对象的属性表(这种检测一般都是开发商提供代码的前提下才能进行的)在每次关键操作后计算一个HashStamp发给服务器(服务器上也有角色属性而且也支持Buffer叠加的情况下才ok..)然后就不用说什么了。
还有一种比较取巧的办法就是角色按照等级各种属性有个最大属性值(装备按照id属性也存在最大值,举例,1级的角色最大HP是300,装备加成最大是200,于是最多只有500的HP超过500就悲剧吧~),某一项数值超过最大属性极限时就向服务器发个包,服务器返回一个当前服务器上的角色信息,然后本地再次对比,然后再通知服务器是...


就讲到这里,最后说一下关于VM的问题,归根揭底很多检测都是要调用API的,所以只要顶住API的调用,必然可以发现检测的秘密,所以为了保住检测的秘密,API现在很多都是reload和抽取的~~


下一篇,讲讲 网页游戏怎么做检测的。
从头看起 第一篇位置:http://bbs.pediy.com/showthread.php?t=166288
PS:如果需要讲一些其他的检测,请在本帖跟帖说明就行了,但是本人不针对任何游戏进行任何阐述,只能对某种检测进行一些解释和说明。
接续上篇,本篇讲讲 网页游戏怎么检测辅助。
网页游戏由于没有客户端能力,所以检测做起来很麻烦,很多操作无法像普通游戏那样随心所遇的去做。而且由于网页游戏本身设计上可能考虑的不周全,从而导致辅助很容易出现(有的网页游戏甚至是可以用CE修改充值的钱数...)。
先讲一下关于网页游戏内存修改的检测,一般是把即时数据发送给服务器做验证,或者干脆服务器负责重要计算,目前没啥好的检测方法。![124.gif]()
![124.gif]()
接着讲一下页游对于封包的检测,FLASH页游基本都有封包的,所以封包修改的辅助也是存在的,大部分页游对于封包修改都无解,不过有一种比较靠谱的封包检测是封包数据自签名...算法MD5+RSA...![恐怖!]()
![恐怖!]()
最后来说一下页游对于各类辅助的检测能力
1.输入模拟类,目前无解。
2.Hook封包并修改,目前有sighash方案。
3.本地内存修改,目前靠客户端和服务器的数据对比,也是发包的...
4.Flash解析hook修改,目前无解,因为页游本身环境局限...
页游的麻烦主要是被浏览器局限住了,本身代码运行全面受限,不能做很多事情。
相比之下微端要好很多。
本篇完成,也是这个系列的最后一篇了,其他更系统更细节的内容就不再做谈论了。
其他东西,如手游啊,设备网游啊(Wii,PSN,xbox上的网游...),这些游戏的检测基本都很类似的说~
![恐怖!]()
![恐怖!]()
![恐怖!]()
从头看起 第一篇位置:http://bbs.pediy.com/showthread.php?t=166288
网页游戏由于没有客户端能力,所以检测做起来很麻烦,很多操作无法像普通游戏那样随心所遇的去做。而且由于网页游戏本身设计上可能考虑的不周全,从而导致辅助很容易出现(有的网页游戏甚至是可以用CE修改充值的钱数...)。
先讲一下关于网页游戏内存修改的检测,一般是把即时数据发送给服务器做验证,或者干脆服务器负责重要计算,目前没啥好的检测方法。


接着讲一下页游对于封包的检测,FLASH页游基本都有封包的,所以封包修改的辅助也是存在的,大部分页游对于封包修改都无解,不过有一种比较靠谱的封包检测是封包数据自签名...算法MD5+RSA...


最后来说一下页游对于各类辅助的检测能力
1.输入模拟类,目前无解。
2.Hook封包并修改,目前有sighash方案。
3.本地内存修改,目前靠客户端和服务器的数据对比,也是发包的...
4.Flash解析hook修改,目前无解,因为页游本身环境局限...
页游的麻烦主要是被浏览器局限住了,本身代码运行全面受限,不能做很多事情。
相比之下微端要好很多。
本篇完成,也是这个系列的最后一篇了,其他更系统更细节的内容就不再做谈论了。
其他东西,如手游啊,设备网游啊(Wii,PSN,xbox上的网游...),这些游戏的检测基本都很类似的说~



从头看起 第一篇位置:http://bbs.pediy.com/showthread.php?t=166288


浙公网安备 33010602011771号