12.Windows驱动-R3到R0的系统调用

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

上一个内容:11.Windows驱动-双机调试

我们使用C++调用了一个函数,这个函数是怎样从3环进入到0环的?

首先双击下图红框

写下图红框的代码,这里通过ReadProcessMemory函数的调用过程来了解3环是怎样进入0环的

然后把MFC设置为启动项目

这里使用的是x64,这里注意x86也就是32位程序在x64系统上运行和x64也就是64位程序的程序在x64系统上运行是存在差异的,x86程序运行的时候有一个转换的过程,这个过程有点复杂这里先不写,然后这个内容使用xp、win7查看比较符合新手,但是这俩系统太老了,写了也没啥用,直接就用最新的系统Win11来搞

然后右击重新生成

然后右击选择打开所在的文件夹

如下图

然后来到下图蓝框的目录,双击下图红框运行程序

运行后

然后打开x64dbg附加它,附加后按F9让运行继续运行(如果是已暂停状态下)

找到我们的程序,双击进行附加

然后点击下图红框任意位置

然后按CTRL+G,输入ReadProcessMemory函数名,点击确定

然后就跳转到了ReadProcessMemory函数

这个ReadProcessMemory函数在kernel32.dll中也就是kernel32模块里,现在的过程首先进入kernel32.dll,然后进入ReadProcessMemory函数

然后双击下图红框,设置断点

设置断点后点击确定,触发断点

触发断点,再双击下图红框取消断点(不取消也行,但是要养成取消的习惯)

取消断点后按F7就进入到了下图红框位置,这时注意进入了kernelbase.dll模块

可以看到下图红框,ReadProcessMemory函数里会调用一个NtReadVirtualMemory函数,现在的过程首先进入kernel32.dll,在kernel32.dll里调用ReadProcessMemory函数就进入了kernelbase.dll里的ReadProcessMemory函数,然后进入NtReadVirtualMemory函数

然后按F8,来到下图红框位置

然后按F7进入NtReadVirtualMemory函数

NtReadVirtualMemory函数在ntdll.dll模块里,现在的过程首先进入kernel32.dll,在kernel32.dll里调用ReadProcessMemory函数就进入了kernelbase.dll里的ReadProcessMemory函数,然后进入NtReadVirtualMemory函数就来到了ntdll.dll里

下图红框有个3F,这个3F是ssdt(系统描述符表),它里面有Windows所有api(函数),它有两个表一个专门存放ui界面相关的函数,一个专门存放日常我们调用的函数,这里的3F就对应的ReadProcessMemory,ssdt它很重要后面会细写

然后还可以看到一个syscall(快速调用指令),它不是汇编指令是一个特权指令,通过它就可以进入到0环,进入0环后的事情后面会写,现在只是3环到0环的过程,现在的过程首先进入kernel32.dll,在kernel32.dll里调用ReadProcessMemory函数就进入了kernelbase.dll里的ReadProcessMemory函数,然后进入NtReadVirtualMemory函数就来到了ntdll.dll里,然后调用了syscall

然后一直按F7,就回到了ReadProcessMemory函数里,来到了下图红框位置,到这ReadProcessMemory进入0环就结束了

总结:

1.通过点击确定按钮调用了我们模块里的ReadProcessMemory函数

2.然后进入了kernel32.dll里的ReadProcessMemory函数

3.然后通过按F7进入ReadProcessMemory函数,就进入了kernelbase.dll里的ReadProcessMemory函数,

4.然后在ReadProcessMemory函数里调用了NtReadVirtualMemory函数就来到了ntdll.dll里

5.在NtReadVirtualMemory函数里进行了3F,然后执行syscall进入0环

接下来再换一个函数,OpenProcess函数,这里通过OpenProcess打开记事本的句柄,然后重新生成(注意把上方的x64dbg结束附加,如果不会结束附加就把x64dbg关了,否则没办法重新生成)

重新生成完,运行程序,使用x64dbg附加,然后输入OpenProcess进行跳转

然后来到OpenProcess,还是设置断点,触发断点,F7进入OpenProcess函数

如下图红框它也是在kernel32.dll模块里

按F7后也还是进入了kernelbase.dll模块里

然后它调用了NtOpenProcess函数

它也是进入到了ntdll.dll中,然后它的符号是26然后调用syscall

总结图:这个图就是调用流程和所属模块,看不懂跟局上方的步骤走一遍,走一遍必然可以看得懂


相关推荐
dump linux1 小时前
Linux DRM GPU 驱动框架详解
linux·驱动开发·嵌入式硬件
被遗忘的旋律.2 小时前
Linux驱动开发笔记(二十四)——(上)IIO + icm20608驱动
linux·驱动开发·笔记
猫猫的小茶馆2 小时前
【Linux 驱动开发】一. 搭建开发环境
linux·汇编·arm开发·驱动开发·stm32·嵌入式硬件·mcu
智源研究院官方账号3 小时前
技术详解 | 众智FlagOS1.6:一套系统,打通多框架与多芯片上下适配
人工智能·驱动开发·后端·架构·硬件架构·硬件工程·harmonyos
猫猫的小茶馆3 小时前
【Linux 驱动开发】二. linux内核模块
linux·汇编·arm开发·驱动开发·stm32·嵌入式硬件·架构
持戒波罗蜜14 小时前
ubuntu20解决intel wifi 驱动问题
linux·驱动开发·嵌入式硬件·ubuntu
技术摆渡人1 天前
第一卷:【外设架构】嵌入式外设移植实战与连接性故障“考古级”排查全书
驱动开发·性能优化·架构·安卓
技术摆渡人1 天前
专题二:【驱动进阶】打破 Linux 驱动开发的黑盒:从 GPIO 模拟到 DMA 陷阱全书
android·linux·驱动开发
乔碧萝成都分萝1 天前
二十四、Linux如何处理中断
linux·驱动开发·嵌入式
松涛和鸣1 天前
59、 IMX6ULL按键驱动开发:轮询到中断的实现
linux·服务器·c语言·arm开发·数据库·驱动开发