计算机从3环到0环要学些什么,Windows系统调用中API从3环到0环(下)

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

Windows系统调用中API从3环到0环(下)

这篇文章分为上下两篇,其中上篇初步讲解大体轮廓,下篇着重通过实验来探究其内部实现,最终分析两个函数(快速调用与系统中断),来实现通过系统中断直接调用内核函数。

一、INT 0x2E进0环

.text : 77F070C0            // 之前调用该函数时 mov eax, 0x115,向eax传入一个函数号

.text : 77F070C0                 lea     edx, [esp + arg_4] // 当前参数的指针存储在 edx中

.text : 77F070C4                 int     2Eh; // 通过中断门的形式进入到内核中

1)在GDT表中查看0x2eh

在保护模式的门这一节中,我们了解到当发生中断时,操作系统会查找idt表,根据中断号在idt表中找到中断门描述符,从中断门描述符中读取CS:EIP的信息。

之后,SS EIP 通过搜索GDT表,该表中存放着各个TSS描述符(每个进程一个TSS,内核一个TSS,TSS存放各种寄存器用于任务切换),来查找内核的 SS ESP。

如图:我们通过windbg来查找出该地址 gdt+2e*8

bb9b30e984ac80913d8cc5bd85be9362.png

根据中断门描述符属性将 83e8ee00`00082fee 拆分拼接之后可知SS:08 / EIP:83e82fee

9937b3d5c96f64dbebcff9afd255f13d.png

2)查看 EIP:83e82fee 这个函数

kd> u 83e82fee

nt!KiSystemService:

83e82fee 6a00            push    0

83e82ff0 55              push    ebp

83e82ff1 53              push    ebx

83e82ff2 56              push    esi

83e82ff3 57              push    edi

83e82ff4 0fa0            push    fs

83e82ff6 bb30000000      mov     ebx,30h

83e82ffb 668ee3          mov     fs,bx

该 nt!KiSystemService函数是真正的内核函数,并不是ntdll.dll模块下,其存在于ntoskrnl.exe / ntkrnlpa.exe中(根据分页模式不同选用不同的程序)

二、通过 systenter进入0环

MSR寄存器存着进入内核的 CS、ESP、EIP的寄存器的值,SS=IA32_SYSENTER_CS+8。

8949e70ad57dfefb051c25632120b527.png

1)windbg查看这个MSR寄存器的值

rdmsr 174     //查看CS

rdmsr 175    //查看ESP

rdmsr 176    //查看EIP

e21c79edf9d2fd00afa5fd49f28995e0.png

2)查看EIP这个函数

kd> u 83e830c0

nt!KiFastCallEntry:

83e830c0 b923000000      mov     ecx,23h

83e830c5 6a30            push    30h

83e830c7 0fa1            pop     fs

83e830c9 8ed9            mov     ds,cx

83e830cb 8ec1            mov     es,cx

83e830cd 648b0d40000000  mov     ecx,dword ptr fs:[40h]

83e830d4 8b6104          mov     esp,dword ptr [ecx+4]

83e830d7 6a23            push    23h

其是调用nt!KiFastCallEntry这个函数,跟nt!KiSystemService一样,该函数是真正的内核函数。

1 #include "pch.h"

2 #include

3 #include

4 #include

5 void ReadMemory(HANDLE hProcess, PVOID pAddr, PVOID pBuffer, DWORD dwSize, DWORD *dwSizeRet)6 {7

8 _asm9 {10

11 lea eax, [ebp + 0x14]12 push eax13 push[ebp + 0x14]14 push[ebp + 0x10]15 push[ebp + 0xc]16 push[ebp + 8]17 mov eax, 0x115

18 mov edx,esp19 int 0x2e

20 add esp, 20

21 }22 }23 intmain()24 {25 HANDLE hProcess = 0;26 int t = 123;27 DWORD pBuffer;28 //hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0,a);

29 ReadMemory((HANDLE)-1, (PVOID)&t, &pBuffer, sizeof(int), 0);30 printf("%X", pBuffer);31 ReadProcessMemory((HANDLE)-1, &t, &pBuffer, sizeof(int), 0);32 printf("%X", pBuffer);33

34 getchar();35 return 0;36 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值