Hook BlockInput
看Jingulong脱q3 watcher的unpackit,提到BlockInput。以前没有注意过这个
api,于是想看看。
从MSDN可以查到,这个API来自User32.dll。在2000/XP下可以用Ctrl-Alt-Del解除。
自己写了几句测试,其影响似乎是全局性的,所有的程序都不响应了。unpackit
可能还做了别的破坏,有时似乎Ctrl-Alt-Del也不管用了。
q兄专门威胁了一下想hook的,就不在ring3下试了。反汇编这个api:
77D6935A > B8 36110000 mov eax,1136
77D6935F BA 0003FE7F mov edx,7FFE0300
77D69364 FFD2 call edx
77D69366 C2 0400 retn 4
直接调用system service,服务号为0x1136,所以应该是win32k.sys实现的,
对应函数地址在KeServiceDescriptorTableShadow内win32k.ServiceTable
的0x136项。只要将这里hook就行了。
这是win32k.sys的system service代码:
.text:BF92D98A __stdcall NtUserBlockInput(x) proc near
.text:BF92D98A
.text:BF92D98A arg_0 = dword ptr 8
.text:BF92D98A
.text:BF92D98A push esi
.text:BF92D98B call EnterCrit()
.text:BF92D990 push [esp+arg_0]
.text:BF92D994 call _BlockInput(x)
.text:BF92D999 mov esi, eax
.text:BF92D99B call LeaveCrit()
.text:BF92D9A0 mov eax, esi
.text:BF92D9A2 pop esi
.text:BF92D9A3 retn 4
.text:BF92D9A3 __stdcall NtUserBlockInput(x) endp
这是hook代码:
ULONG IsBlocked = 0; // 标记,是否已调用过BlockInput(true)
//
ULONG NTAPI
NewNtUserBlockInput(IN ULONG fBlockIt)
{
// 不必调用原api
if(fBlockIt)
{
if(IsBlocked)
{
return 0; // 已经Block了
}
else
{
IsBlocked = 1;
return 1;
}
}
else
{
IsBlocked = 0; // 清标记
return 1;
}
}
再试试,ok了。
另外,我改造的OD逃不过unpackit的检测,q3 watcher兄能否交流一下?
我实在没时间跟壳
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)