-
-
[讨论]关于其他防止程序获得我们的窗口句柄
-
发表于:
2011-5-30 13:05
10456
-
如题
其中比较简单的一部分,如防止 EnumWindows EnumThreadWindows FindWindow/Ex 等等
这些看雪已经有人做过了,是shadow sdt hook。但是却没有人防的到GetWindow(还是防到了不愿意拿出手?
),如果这个函数防不了,前面所做的工作将都是徒劳~
MJ貌似之前在看雪说过,GetWindow没有进入内核,事实上它是进了的,因为不管是得到最前面的窗口句柄(GW_HWNDFIRST),还是下一个(GW_HWNDNEXT),等等,都得用到WND结构(这个结构不透明的,WRK里也没有,reactOS的定义和windows实际的差距很大,结构里包含了这个窗体的所有信息,里面有个链,是按照x,y,z轴的空间顺序排列窗体的,用于取得first hwnd `next hwnd 这些,还有就是窗口所属关系的链,标识出parent,owner)
而每个窗体的WND是在内核空间的,GetWindow将调用ValidataHwnd验证一个句柄(GetWindow的第一个参数),如果有效将返回一个WND结构指针,而且ValidateHwnd最终还是要进入win32k的……我之前拦截了ValidateHwnd,除非我们能弄到WND结构的正确定义,否则……这种拦截没用的(因为要从ValidateHwnd返回的WND结构中得到句柄,才能判断是否是我们要保护的进程的窗口,否则会出现这种情况,A进程的窗口C, B进程的窗口D,C和D按z轴顺序是前后关系,此时A调用GetWindow(C,GW_WNDNEXT)-->ValidateHnwd(C)->取得下一个窗口句柄,就把D窗口找到了!,咱防不住啊~~)
对了,还有个方法是patch user32.dll , 这个嘛,有兴趣的可以试试啦,因为我觉得实在不是什么好方法,个人意见~ = =
如果大家有什么想法,可以回帖交流下……希望这个函数以后不再是一个保护不了的死角
保护窗口其实也蛮有用的,是吧?
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)