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

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


相关推荐
恒锐丰-罗生18 小时前
国产电机驱动 SS6635E|宽压大电流单通道 H 桥芯片全面总结
驱动开发·嵌入式硬件·硬件工程
又见情义1 天前
RK3568 Android13 千兆网口适配实战-RTL8211F
android·驱动开发·嵌入式硬件
编程圈子2 天前
电机驱动开发学习25. 弱磁控制与全速域增益调度
驱动开发·学习
T型码农要学习2 天前
eMMC_命令整理
linux·驱动开发·emmc
恒锐丰-罗生2 天前
率能半导体 SS6840 单通道 H 桥电机驱动芯片深度解析
驱动开发·嵌入式硬件·硬件工程
恒锐丰-罗生3 天前
国产 H 桥驱动 SS6289|18V/4A 有刷电机驱动芯片性与应用分析 内置采样 + 多保护,门锁 / 机器人优选器件
驱动开发·嵌入式硬件·硬件工程
hkNaruto3 天前
【AI】规范驱动开发(SDD)团队实践指南 v2
人工智能·驱动开发
维多利加5143 天前
RK3588刷机救砖记录(晨芯时代)
驱动开发
做一个AK梦3 天前
测试驱动开发-TDD
驱动开发·tdd
恒锐丰-罗生4 天前
SS8103 芯片解析:45V 同步整流降压半桥恒流驱动控制器 大功率光源国产优选 告别低灰闪烁!
驱动开发·嵌入式硬件·硬件工程