记得最早那个脸蛋N开那个的第一个检测就是IP和MAC地址扫描,服务器拿到两个一样的ip/mac地址就会把你踢掉(N开用AheadLib劫持生成代码,早期是拿来做IP查看器的,所以刚好很容易hook iphlpapi.GetAdapterInfo,通过这个函数随机一下游戏获取的IP地址和MAC地址这个检测就过了)
后来变成扫描模块(EPROCESS -> PEB -> _PRB_LDR_DATA) + 特征码(这个处理比较简单,在PEB里头把N开DLL进行断链,游戏通过常规方式就枚举不到N开DLL,自然也不会有特征码扫描。当然那个源码预留的Rand函数所实现的效果是一样,只是Ldr断链有不需要更新的好处)
当时脸蛋还存在一个问题就是窗口类名/标题的随机化,那个就跟源码里头差不多在themida解压代码后,CreateWindow执行两次后进行hook及 Randomizer,为什么是两次,因为第一次和第二次分别对应登陆窗口和加载窗口,第三次才是创建游戏窗口。至于为什么蛋蛋大神采用返回地址往上暴搜来判断Client %d字符串我是没整明白哦^o^大概是为了不需要更新才弄得吧。
时隔几年后再来论坛乍一看TM居然已经是xg3保护了。
xg3稍微了解一点 是在agp框架基础上建立起来的,北京的代工。时隔太久也记不起来 其中多开和征途的HProtect的一个多开检测是一样的,蛮猥琐的 好像扫的内核的一个什么东西 键盘还是鼠标相关的一个东西 就当时有听vxk提过 但是太久远了想不起来 不知道跑跑上有没有。
我这有一个暴力的思路 方法很老,但很高效,大牛们基本玩透了。首先抛掉脸蛋OpenMutex再CloseHandle两次消对象引用的这种方式,改用驱动中hook ObCreateObject函数,直接拦截该游戏进程所有根据Object-type派生出对象的Objectname进行修改,或者你可以区别出几类需要拦截的Object-type派生的Object,基本上很难被检测,但是很有效果。采用这种方式根本不需要关闭什么互斥体,在游戏进行Mutant对象遍历或者调用OpenMutex的时候它就开始找不到指定objectname的对象的,因此每个客户端都可以正常建立一个完全不同的随机名互斥体,实现共存,也比较通用。XG3和HS显然是不一样的,现在圈子上N开代码有点老,都是针对游戏+HS两个多开检测用的,并没有XG3的处理部分。
希望这能对你有所帮助
传统方法都是关闭互斥体等等,能被检测到的位置太多了
[ 此帖被小枫工作组在2015-12-28 10:26重新编辑 ]