windows创建进程的用户态和内核态交互----小话windows(1)
作者:陈曦
日期:2012-6-19 12:28:30
环境:[win7 Intel-based x64 vs2010]
转载请注明出处
Q: 在windows下,调用CreateProcess这个API来创建进程,它内部究竟做了什么?
A: 对于操作系统,一般肯定是分层的。内核将处理最终的创建进程操作,但是它的上层可能有一些模块,进行一些参数合法性判断或者为了可移植考虑的判断。windows同样不例外。看看windows下面内核上面的模块:
不妨先写一个CreateProcess的程序,通过逆向工程得到内部调用的东西。
Q: 如下代码:
可以看出,它正确地创建了进程。
A: 下面我们将找出哪个模块包含CreateProcessA函数。进入VS的命令行工具,
使用如下命令dumpbin.exe /all CreateProcessDemo.exe > d:\dumpbin_createprocessdemo.txt得到所有dump的信息,找到如下信息:
可以在靠近最后的时候发现调用CreateProcessInternalA例程。
Q: 继续查找CreateProcessInternalA例程的内部实现,它最终会调用CreateProcessInternalW来实现。继续查找CreateProcessInternalW的实现,发现它最终会调用NtCreateUserProcess例程(在xp下,会调用NtCreateProcessEx).此例程不在kernel32.dll中,它在哪里?
A: 正如上面的图示描述,它以nt开头,它在ntdll.dll中。同样适用ida打开ntdll.dll, 找到NtCreateUserProcess的实现:
Q: ZwCreateUserProcess是什么,好像和NtCreateUserProcess是一样的?
A: 仅仅在ntdll.dll中来说,依照上面的截图,它们是一致的;可是在内核中,它们不完全一致。Nt开头的例程会进行访问权限和参数合法性判断,而Zw不会,Zw它可以由内核模式代码直接使用;同时,调用Zw开头的例程会将先前的模式改变为内核模式,而使用Nt开头的例程不能。
Q: 刚刚所说的用户模式是如何进入内核模式的?
A: 上面的ntdll.dll中执行依然是用户模式,NtCreateUserProcess通过向eax传入中断号, edx传入7FFE0300H为参数地址来进行系统调用,进入内核模式。它的内部实现为:
因为未找到win7的WRK源代码信息,上面为nt内核的实现。
作者:陈曦
日期:2012-6-19 12:28:30
环境:[win7 Intel-based x64 vs2010]
转载请注明出处