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

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


相关推荐
世微 如初4 天前
AP5125大功率LED恒流驱动实战:地摊灯项目从原理图到调试笔记
驱动开发·芯片·led电源驱动·降压恒流ic
ScilogyHunter4 天前
Zephyr串口驱动开发及构建完全指南
驱动开发·uart·zephyr
_Emma_4 天前
【DRM&Graphic】Linux图形与显示框架
linux·驱动开发·图形渲染·显示器
董厂长4 天前
Loop Engineering:停止手动提示,开始设计自动提示的系统
大数据·人工智能·驱动开发·llm
Saniffer_SH5 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
暮云星影5 天前
全志linux开发屏幕适配(二)`HDMI`驱动适配说明
linux·arm开发·驱动开发
charlie1145141915 天前
嵌入式Linux驱动开发——从轮询到中断
linux·开发语言·驱动开发·嵌入式
暮云星影5 天前
瑞芯微rk3566开发FIT Secure Boot
linux·arm开发·驱动开发·安全
暮云星影5 天前
全志linux开发 USB接口设置
linux·arm开发·驱动开发
sukalot5 天前
windows显示驱动开发-CCD DDI的其它技术
windows·驱动开发