API函数的调用过程(三环进0环)

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()

他俩无区别,这两种提供

这四个值怎么找的方法,方法不同而已

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值