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 小时前
502-002_Linux驱动开发模块化编程
linux·驱动开发·模块化编程
wixzjsh13 小时前
i.MX6ULL LCD 驱动开发实战:从引脚到时钟的完整配置
驱动开发
路溪非溪18 小时前
Linux中环境变量的问题总结
linux·运维·开发语言·驱动开发
2401_862880822 天前
LCD 显示与触控屏驱动开发
驱动开发·嵌入式硬件
Doraemomo2 天前
Linux内核驱动开发——中断与定时器
linux·运维·驱动开发
@嵌入式扫地僧2 天前
ECC 编程智能体嵌入式适配实战:ESP32/RK3588 驱动开发提效 60%+ 指南
驱动开发·嵌入式开发·代码优化·ai辅助开发·编程智能体
EatFan3 天前
GitHub Trending 三连观察:AI 编码智能体进入“周边生态”竞争阶段
人工智能·驱动开发·github·mcp·superpowers·github trending·spec kit
sukalot3 天前
Windows 驱动实例分析系列:libwdi 驱动分析 - examples 篇(三)
windows·驱动开发
额额额对了3 天前
嵌入式 ADC 从入门到实战:基于 i.MX6ULL 的裸机驱动开发
驱动开发·嵌入式硬件·arm
Code Man3 天前
实现 Android 字符设备驱动
android·驱动开发·lineageos