|
发表于 2012-4-1 18:49:03
|
显示全部楼层
多年之前,有个垃圾软件,故意引起4和5代码的蓝屏,我做过拦截
HookKebugCheck PROC @dwBugCheckCode:DWORD
.if @dwBugCheckCode==4 || @dwBugCheckCode==5
if DEBUG
invoke DbgPrint,CRLFTXT("检测到蓝屏操作,蓝屏代码:%08X,此行为已经被驱动程序阻止!"),@dwBugCheckCode
endif
mov eax, STATUS_ACCESS_DENIED
ret
.endif
;模拟压入堆栈,否则会导致堆栈不平衡而无法返回,使用STDCALL调用约定
;push .... ;压入参数n
;push xxxx ;压入参数2
;push zzzz ;压入参数1
push @dwBugCheckCode ;压入参数1
push offset @F ;压入返回地址,注意由于前面的5字节执行了函数帧创建操作,因此到跳转为至的所有指令绝对
;不可操作堆栈,也不可使用CALL指令,所有的压栈操作要在创建函数帧之前完成,且不能使用CALL
;这里最后压入返回地址,以便使得函数能得以返回
RealKebugCheck INLINE_HOOK_TAIL_EX <,,lpKebugCheck,,INLINE_HOOK_HEAD_SIZE,,>
@@:
ret
HookKebugCheck ENDP
|
|