kernel32.dll(ReadProcessMemory)只是简单调用了
ntdll.dll(NtReadProcessmemory)
.text:7C92D9E0 public ZwReadVirtualMemory
.text:7C92D9E0 ZwReadVirtualMemory proc near ; CODE XREF: LdrFindCreateProcessManifest+1CCp
.text:7C92D9E0 ; LdrCreateOutOfProcessImage+7Cp ...
.text:7C92D9E0 mov eax, 0BAh ; NtReadVirtualMemory
.text:7C92D9E5 mov edx, 7FFE0300h
.text:7C92D9EA call dword ptr [edx]
.text:7C92D9EC retn 14h
.text:7C92D9EC ZwReadVirtualMemory endp
可以发现.text:7C92D9EA call dword ptr [edx]这个[edx]实际上是有特殊的含义的
我们先了解一个结构体
1、_KUSER_SJARED_DATA
1)在User层和kerner层分别定义了一个_KUSER_SHARED_DATA
用于User层和Kerner层共享某些数据
2)他们使用固定的地址值映射,_KUSER_SHARED_DATA结构区域在USER和Kerner层地址分别:
User层地址为:0x7ffe0000
Kerner层地址为:0xffdf0000
特别说明
虽然指向的是同一个物理页,但在User层是只读的,在Kerner层是可写的
在0x300位置有一个systemcall
0x7ffe03000到底存储什么
支持sysenter/sysexit 指令 支持:ntdll.dll!KiFastSystemCall()
不支持sysenter/sysexit 指令:ntdll.dll!KiIntSystemCall()
如何判断cpu是否支持sysenter/sysexit 指令
当通过eax=1来执行cpuid时,处理器的特征信息放在了ecx和edx寄存器中,其中edx包含了一个sep位(11位),
该位指明了当前处理器是否支持sysenter/sysexit(1支持0不支持)
3.进0环需要更改哪些寄存器?
1)cs的权限由3变0,意味着新的cs
2)ss与cs权限永远一致,需要新的ss
3)权限发生切换,堆栈也要发生切换,需要新的esp
4)进0环后的代码的位置,需要eip
ntdll.dll!KiFastSystemCall()
ntdll.dll!KiIntSystemCall()
他俩无区别,这两种提供
这四个值怎么找的方法,方法不同而已