Ring3转入Ring0跟踪

通过反汇编跟踪一个API函数从Ring3层到Ring0层的具体执行过程,有助于我们加深对相关内核Hook技术的理解。
我们可以使用OD打开notepad.exe程序,对CreateFileW下断后,可以发现,有这样一行代码:
CALL DWORD PTR DS:[<&ntdll.NtCreateFile>>; ntdll.ZwCreateFile
也就是说,CreateFileW(Win32API)实际上是调用了ntdll中的NtCreateFile(或ZwCreateFile)函数。
使用微软自带的Dependency工具查看ntdll中的NtCreateFile和ZwCreateFile函数,可以发现,两个函数的入口地址是一样的,也就是说,两个函数可以看成是同一个函数。
Ring3转入Ring0跟踪_第1张图片
继续反汇编跟踪,可以发现NtCreateFile调用了如下函数:
MOV EAX,25    //SSDT表索引号,对应的十进制=37
MOV EDX,7FFE0300
CALL DWORD PTR DS:[EDX]
RETN 2C
继续反汇编,我们发现CALL DWORD PTR DS:[ 7FFE0300 ]实际上是调用了ntdll.KiFastSystemCall,反汇编窗口中跟随KiFastSystemCall,便有了如下几行代码:
MOV EDX,ESP
SYSENTER
RETN
通过调用SysEnter(软件中断)指令,Windows系统将会捕获这个调用,然后进入Ring0层,并调用内核服务函数NtCreateFile。
在进入Ring0层之后,操作系统会根据索引号(eax的值)在系统服务描述表中查找对应的表项,比如,通过Kernel Detective可以知道SSDT表中,索引号为37对应的服务名为NtCreateFile,当前地址为:0x80574E0B,系统会根据这个地址调用相应的系统服务函数,并把结果返回给ntdll.dll中的 NtCreateFile 。
Ring3转入Ring0跟踪_第2张图片

版权所有,迎转载,但转载请注明: 转载自  曾是土木人

你可能感兴趣的:(内核)