首页
社区
课程
招聘
Hook BlockInput
发表于: 2005-9-10 20:33 6277

Hook BlockInput

2005-9-10 20:33
6277
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期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
很久没见了,SoftWorm兄
2005-9-10 21:25
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
jingulong已经把所有的东西分析的很透彻了,就只有那点东西,对于R3级的一般HOOK,还比较好检测,实在不行就事先把代码抓出来,用的时候再把可能变化的数据添入就是了,但对于R0级的就没辙了。但单对BlockInput而言,我觉得用直接HOOK的方法可能不好,因为是有返回值的,只要事先设计好,再用返回值解码或做些无聊运算,就可以了。就算可以通过HOOK获得每次调用的位置,但不解决任何问题,还是要腿着把代码走一遍。
    我一直认为对于老大级的人物,任何形式的反跟踪都是不堪一击的,所以采用了以拖为主的策略,因为老大级的都很忙啊。谁的耐心都是有限的,随着时间的流逝说不定大多数人都会放弃(有忍者修为的除外^_^)。反跟踪所用的API都被帖出来了,也就没多大用了,但还有超长的花指令和海量RDTSC。我觉得在调试时对于画指令的识别是有一定限度的,如果长度超过几百行一般就认不出来了。RDTSC是虫海的关键,但也是不稳定的元凶,使用方式有3,1是根本没有什么意义,对付那些有RDTSC恐惧综合症的,或者是用ANTIRDTSC的;2是最一般的使用,实现的方式有好多种,只要不单步过就没事;3是做了点小手脚,防止那些不跟踪代码,只靠API断点进行快速分析的。在加上一些小段的解码,在人在心情不好时很容易被忽略,等发现不对时又要再回去把虫海趟一遍,不细心的话就会跑上几次,到那时眼睛就会成为新的问题。
    总之是要改的地方不少,想高速脱壳应该不太现实;每次的反跟踪有固定的,但大多数还是随即放置的,不明白的话该走不过去还是走不过去,脱文的意义不太大;盗版0。7X的入口,没有明显伪装的痕迹,有自己特点的位置又离的太远,应该不会被作成PEID的扩展签名。
2005-9-11 07:43
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
4
最初由 q3 watcher 发布
但单对BlockInput而言,我觉得用直接HOOK的方法可能不好,因为是有返回值的,只要事先设计好,再用返回值解码或做些无聊运算,就可以了。就算可以通过HOOK获得每次调用的位置,但不解决任何问题,还是要腿着把代码走一遍。


BlockInput的返回不就是个bool值吗?

Jingulong的列表中,有2条我不大明白,q兄能否解释一下 ?

8 EnableWindow
10 ReadProcessMemory

ANTIRDTSC是什么? 如果在ring0实现,壳也能对付吗?

我现在不打算脱壳,只想让程序在OD下跑起来。q3 watcher干脆做个
好事,在检测到debugger后弹个MessageBox,提示一下原因,也可方
便学习,善莫大焉。

2005-9-11 08:49
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那可能是我理解的问题,我是在设计的固定位置放下几次解锁,使返回值是1,乘个数解码,其他情况下应该是0也乘个数,然后对后面的东西进行一下无聊的加减什么的.
EnableWindow定鼠标。
ReadProcessMemory读取内存特征码。
有父进程校验.因为和瑞星的内存杀毒有冲突,可能是反DUMP使瑞星打不开进程了,为了保护自己,防止我同学拿去加木马,就限制的严了一点,应该回导致捆绑机失效,以服务形式加载的木马不能启动.
至于海量rdtsc对一般人应该是有用,你可以实验一下那段ANTIRDTSC代码:)要是被秒了也不丢人,能冲破重重阻碍的都是高高手,能让他们出手是一种荣幸.
2005-9-11 09:41
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
BlockInput的下场就是象小花一样...杀无赦...
2005-9-11 14:33
0
雪    币: 214
活跃值: (100)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
高手论剑
2005-9-12 16:45
0
雪    币: 233
活跃值: (130)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
学习
2005-9-12 16:53
0
雪    币: 598
活跃值: (282)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
9
junk code用处大大得
2005-9-13 11:26
0
游客
登录 | 注册 方可回帖
返回
//