- 概述
API在某个头文件中定义,被封装在某个DLL中,而这个DLL会进一步被封装在ntdll.dll中(它里面的API叫native api),比如,ReadFile在ntdll.dll中就对应着ntReadFile;然后这个API会通过sysenter的方式进入内核层。
那么,比如对于CreateFile的执行参数,必须告知内核,而这些参数就被封装在IRP中。IRP是一个结构体,它封装了应用层传下的命令和数据。
驱动拿到IRP并进行处理,并把处理结果返回给应用层。
现在随意附加到一个进程当中,看看它的CreateFile调用。
先用windbg连上虚拟机:
然后break下来,执行命令。加载完符号表之后,使用!process 0 0 命令列出所有进程信息
我们附加到explorer.exe,使用命令:
下面使用命令, bp Kernel32!CreateFileW或者bp Kernel32!CreateFileA对CreateFile下断点,如果报错:
我们只需要执行一遍.reload 或者 .reload /user命令即可。
然后F5运行,使虚拟机“复活”,不一会就会断下,此时就离ntdll!NtCreateFile不远了,这时再给ntdll!NtCreateFile下断点,复活虚拟机后不一会就能断下了:
但是,此时我们无法通过F11进入syscall,为了查看更底层的函数,我们只能给更底层的函数下断点:
然后再运行:
此时,我们再尝试往下跟踪,进入IopCreateFile,用kv命令查看一下堆栈调用:
这里,以nt!开头的就是Ring0级的API。
时间: 2024-10-09 18:01:23