内核编程学习笔记(005) “天空很蓝”的5个教训

某游戏的双开驱动虽然说是简单,本人在做这个工具的时候,蓝屏死机了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  

eax0

就是说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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值