💂 个人主页: 你的小甜欣.~_CSDN博客
🤟 每天更新/学习教程/WEB安全/内网渗透/二进制安全/逆向工程/等文章,大家可以持续关注
💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦。
💅 有任何问题欢迎私信,看到会及时回复!
系统调用的学习
上文回顾
上篇文章分析得到:
1.3环进0环的两种方式,分别是中断门和快速调用,CPU支持快速调用,那么_KUSER_SHARED_DATA 结构体的 SystemCall 属性指向的函数是 KiFastSystemCall,执行 KiFastSystemCall,使用快速调用的方式进0环;如果不支持,那么SystemCall 指向的函数是KiIntSystemCall,执行 KiIntSystemCall,使用中断门的方式进0环。
2.快速调用不需要访问内存,而中断门需要读TSS和IDT表
3.int 0x2e 和 sysenter 指令进0环后,分别调用了两个函数 KiSystemService 和 KiFastCallEntry。
4.原来的寄存器存储到了_KTRAP_FRAME 结构体里,3环API参数指针通过EDX传给0环。
上篇文章分析结果,两个函数最后执行同一段代码,如图
图中标记的是407781函数,之后是执行的相同代码部分,7781函数在_KiFastCallEntry函数内部。图片太大没法截图全部。
KiSystemService / KiFastCallEntry 填充_KTRAP_FRAME 后续部分
这两个函数虽然入口不同,但是填充完 _KTRAP_FRAME 后,就会执行相同的代码。
预备知识:
eax中存储的系统服务号 0BAh