某游戏的双开驱动虽然说是简单,本人在做这个工具的时候,蓝屏死机了n次,为了自己的电脑着想,特此把经验给记录下来。
①寄存器没有平衡或平衡写错,低级错误打自己嘴巴。
②页面保护欺骗逻辑与运算写错,低级错误。
and eax,not 00010000h
or eax,00010000h
③对于SSDT里的Nt函数 整个操作系统都随时有可能会调用到,并不是只有自己心目中某程序想的时候才会用,就像NtCreateMutant,开始hook了后随便写,结果天空很蓝,这就是为什么要做过滤了(天真的我还想直接把这个函数返回一个空值,其中什么都没有做,真的很危险啊)。
④SSDT hook在还原前切勿卸载驱动,由于函数代码是在驱动上的,不还原又卸载了,不好意思天空很蓝,SSDT表中指向的函数系统找不到了,就像④里说的NtCreateMutant,系统经常会调用来创建互斥对象。
⑤空指针
在NtCreateMutant 里面有这么一个 parameter :
IN POBJECT_ATTRIBUTES ObjectAttributes
在WDK帮助里:
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES;
ObjectName这一项可以做一个判断来做过滤。
本人想都没想直接
DbgPrint("ObjectName %wZ/r/n",ObjectAttributes->ObjectName);
一秒种不到,蓝屏,好了,天空很蓝啊
Access violation - code c0000005 (!!! second chance !!!)
ssdtHookP!MyNtCreateMutant+0xb:
f8dcc41b 83780800 cmp dword ptr [eax+8],0
eax为0
就是说ObjectAttributes->ObjectName本来就是空指针
所以要判断!
if(ObjectAttributes->ObjectName)
天空依然很蓝很蓝~~
事实上就这样写就行了if(ObjectAttributes)就可以过滤了,试了n次,教训啊
对于返回结果:
#define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS)0x40000000L)
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
ntstatus.h真的好东西,一个头文件就可以看出所有返回的nt状态了
之前看到的xor eax, eax 就是强制返回 STATUS_SUCCESS。