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
    评论
API(Application Programming Interface)是应用程序编程接口的缩写,是一组用于访问操作系统或其他服务的接口函数API 函数通常由操作系统或其他服务提供,并且可以通过调用这些函数来实现相应的功能。API 可以帮助开发者避免重复造轮子,提高开发效率。 API调用过程通常包括以下几个步骤: 1. 包含头文件:在程序中包含相应的头文件,这些头文件通常包含了 API 函数的声明和相关的类型定义。 2. 链接库文件:将程序与相应的库文件链接,这些库文件通常包含了 API 函数的实现代码。 3. 调用 API 函数:在程序中调用相应的 API 函数,并传递相应的参数。API 函数将执行相应的操作,并返回相应的结果。 下面以 Windows 操作系统为例,举一个 API 调用的例子。假设我们要创建一个新的窗口,并显示在屏幕上。我们可以使用 `CreateWindow()` 函数来创建窗口,使用 `ShowWindow()` 函数来显示窗口。具体的调用过程如下: 1. 包含头文件: ```cpp #include <windows.h> ``` 2. 链接库文件: 在 Visual Studio 中,我们可以在项目属性中设置附加库目录和附加依赖项,以链接相应的库文件。比如,我们可以设置附加库目录为 `C:\Windows\System32`,设置附加依赖项为 `user32.lib`,这样就可以链接 `user32.dll` 库文件,以调用窗口相关的 API 函数。 3. 调用 API 函数: ```cpp HWND hwnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW, 100, 100, 640, 480, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, SW_SHOWNORMAL); ``` 其中,`CreateWindow()` 函数用于创建一个新的窗口,并返回该窗口的句柄。我们可以使用该句柄来对窗口行操作,比如调用 `ShowWindow()` 函数来显示窗口。 这就是一个 API 调用的简单示例,通过调用相应的 API 函数,我们可以实现各种各样的功能,比如创建窗口、绘制图形、播放音频、读写文件等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值