免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
上一个内容: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

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

