说道按键盒子,就要从外挂说起了
如今外挂分为4大类 1.系统模拟挂 2.内存挂 3.分包挂 4.硬件挂
1 系统模拟挂 对于消息函数的利用,基本都在SSDT SHADOW里,游戏保护也基本钩了消息类函数
2 内存挂 无非就是找CALL,并内联汇编调用之,注重点就是过保护,找CALL,与对战平衡了
3 分包挂 解析分包函数,有的游戏是明文的,这样的话直接用参照发就可断定数据结构
上面所说 三类都是在系统之上实现的,前提都少不了要过游戏的保护,虽然现在出来各种HOOK框架基本实现通杀所有游戏,如kifastcallentry通杀ssdt与shadow,绕过法通杀所有没有自校验的hook 与inline ,OB等,但是通用性还是不好保证,因此有了硬件挂的出世
4 硬件挂 其实也是一种模拟挂了,主要负责模拟鼠标键盘的操作,当然要做更加智能的还是需要自写驱动与下位机通信,不过也可以以硬件代替,与智能小车的识别算法比起来就太过复杂了,这里不多加讨论
好了,下面说道重点 ,按键盒子的原理,利用与USB通信芯片,按照USB协议与操作系统本身的人体学输入设备驱动进行通信,从而从硬件上控制操作系统鼠标与键盘,这种意义上的硬件挂是绝对无法查出的
本人本身准备的硬件设备有1 89C52 2 最小系统 3 PDIUSBD12芯片 4 USB口,串口
难点在于以下几个地方
1 当操作系统受到USB口的D+ D-电平信号时会像0地址发送复位信号,这里需要初始化本身设备。
2 之后就需要根据操作系统返回的各种信息发送回各种描述符,5大类描述符,若干小描述符,还有HID描述符,这一步之后就告诉系统本设备需要加载什么驱动
3 之后就可以根据报告描述符与操作系统本身驱动进行交互,来控制鼠标,键盘的操作
部分源码如下
#pragma OPTIMIZE(9,speed)
void CMD(uint8 ControlCode,uint8 movesize)
{ uint8 sendBuf[4]={0,0,0,0} ;
switch(ControlCode)
{
case left:{sendBuf[1]=-movesize;break;}
case right:{sendBuf[1]=movesize;break;}
case up:{sendBuf[2]=-movesize;break;}
case down:{sendBuf[2]=movesize;break;}
case leftclick:{sendBuf[0]=0x01;break;}
case rightclick:{sendBuf[0]=0x02;break;}
}
D12WriteEndpointBuffer(3,4,sendBuf);
Ep1InIsBusy=1;
KeyUp=0;
KeyDown=0;
//#pragma asm
//fast funciotn call
//#pragma endasm
}
#pragma OPTIMIZE(0,size)
注意点:为什么按键官方说按键挂不会被封,从严格意义上来讲,不实现图色功能的话只用到了操作系统本身的驱动,也就是微软的官方驱动,这样的话,本设备只算是一个鼠标或者键盘,也就有了那句话,除非游戏封鼠标,否则检测不出,当然要使用了更加智能的功能,就必须借助驱动或者应用层软件,这样还是给游戏厂商提供了检测的机会
至于按键盒子扩展的地方,就是它本身实现了一套驱动,进行了快速图像识别,进而向下位机发送坐标偏移,这样更加智能化的实现了硬件挂,,至于本身的写入程序也不需要我的从串口写入,应该是他们本身带了一个存储设备,里面存放了按键脚本,之后插入电脑之后自动解释执行,也就省去了擦写芯片的麻烦,因为大家都知道,一个单片机擦写寿命大概是上千次,而按键官方则声明没有限制。
说了那么多,下面提供代码吧,开发环境是 keil 4 .另外以前一直手懒没有注册论坛,最近才发现不能回帖,希望论坛管理人员可以给个注册码
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)