首页
社区
课程
招聘
[旧帖] [求助]ring3 API参数和对应的ring0函数的参数 0.00雪花
发表于: 2009-8-7 15:38 4509

[旧帖] [求助]ring3 API参数和对应的ring0函数的参数 0.00雪花

2009-8-7 15:38
4509
比如ZwQuerySystemInformation

char* pBuf = 0x56565656;
ZwQuerySystemInformation(16, pBuf, 100000, NULL);

nt!ZwQuerySystemInformation:
80501ac0 b8ad000000      mov     eax,0ADh
80501ac5 8d542404        lea     edx,[esp+4]
80501ac9 9c              pushfd
80501aca 6a08            push    8
80501acc e890090400      call    nt!KiSystemService (80542461)
80501ad1 c21000          ret     10h

或者其他类似的有OUT性质的函数的参数。
ntdll.dll在调用内核的时候eax放服务号,edx放函数的参数、
然后内核直接取函数的参数。

我的问题是如果ring3提供的参数是错误的。像上面buf是不存在的。
内核对应的ZwQuerySystemInformation如何防止这样的错误的?
初学内核。谢谢大家解答

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
就是ring0函数的函数对ring3的函数的参数是如何处理的?
有复制了一份
然后处理后,再复制给ring3?
而不是直接处理的。如果在ring0就直接处理的话。就挂了。
2009-8-7 15:47
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
3
你这个问题要分为两点:
1. 调用时压栈的那些参数
在转进内核后,调用SSDT中的相关函数,都是重新push一次参数再call
2. 如果参数是缓冲区指针,如何判断指针的有效性
SSDT表对应的函数中,使用ExGetPreviousMode判断该调用是来自用户态还是核心态
如果来自用户态,则对这些指针参数进行验证。
具体验证过程是使用try_except结构,try中使用ProbeForRead/ProbeForWrite判断该用户态指针是否可读或可写
如果不能则抛出异常,由try_except结构注册的异常处理函数捕获异常,从而设置返回值代表相应的错误。
应该注意的是,ProbeForRead对0x00000001这样的用户态无效指针进行检测,并不会抛出异常,所以不单单ProbeForRead,对用户态缓冲区的整个读写过程都必须置于try_except结构之中。

不过win32k.sys中的那些,据说有一些函数对参数的检查就是有疏漏的,有一些函数只检查调用是不是由csrss.exe发起的,如是则认为可信任,因此有些XX的方法,对csrss.exe进程进行注入之后就可以搞怪了。
2009-8-7 22:33
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
非常感谢楼上的回答。thx
2009-8-7 23:56
0
游客
登录 | 注册 方可回帖
返回
//