首页
社区
课程
招聘
内核直接调用NTUSERFINDWINDOWEX失败
发表于: 2011-10-11 20:26 6811

内核直接调用NTUSERFINDWINDOWEX失败

2011-10-11 20:26
6811
NtUserFindWindowEx(
        IN ULONG hwndParent,
        IN ULONG hwndChild,
        IN ULONG pstrClassName,
        IN ULONG pstrWindowName,
        IN ULONG dwType
);

利用Hook Shadow观察NTUSERFINDWINDOWEX发现,如果用FindWindow查找标题窗口句柄,不是查找类名,NTUSERFINDWINDOWEX五个参数,只有pstrWindowName参数有数据,hwndParent=0,hwndChild=0,dwType=0,pstrClassName数据为NULL,但是pstrClassName参数有地址值,pstrClassName和pstrWindowName的地址值都是用户层的,在内核层直接调用NtUserFindWindowEx会反回0,经测试无论在用户层传什么参数,调用都失败,参数传入正确,和HOOK到的数据一样,地址也一样,pstrClassName和pstrWindowName用的都是用户层地址,也对另三个参数测试过,都失败,我又试了其它的函数,比如NtUserGetDC,能调用成功,NtUserFindWindowEx就失败,有没有高手能解答下是什么原因,这个网址有介绍说解决了,但是我无法实现,怎么测试都是失败的 http://hi.baidu.com/fuyzz/blog/item/5db0adfcf1c19afafc037fdd.html

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 75
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
首先是参数的输入: 内核调用
HWND NtUserFindWindowEx(
    IN HWND hwndParent,
    IN HWND hwndChild,
    IN PUNICODE_STRING pstrClassName,
    IN PUNICODE_STRING pstrWindowName)

在函数实现里有  ProbeForRead(strClassName.Buffer, strClassName.Length, sizeof(BYTE));
        ProbeForRead(strWindowName.Buffer, strWindowName.Length, sizeof(BYTE))

检查参数地址有效性
2011-10-12 11:32
0
雪    币: 122
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
问题解决,NtUserFindWindowEx的声明多了一个参数造成一直失败,5个参数HOOK的话能成功没出错,由于函数的声明是很早以前不知从哪得来的,所以没怀疑到声明上面
2011-10-12 21:53
0
游客
登录 | 注册 方可回帖
返回
//