Windows系统调用中API从3环到0环(下)
2021-05-19 14:31
标签:tchar service 调用 roc style 快速 code system 描述 Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API从3环到0环(下) 如果对API在三环的部分不了解的,可以查看 Windows系统调用中的API三环部分(依据分析重写ReadProcessMemory函数 上篇:Windows系统调用中API从3环到0环(上) 这篇文章分为上下两篇,其中上篇初步讲解大体轮廓,下篇着重通过实验来探究其内部实现,最终分析两个函数(快速调用与系统中断),来实现通过系统中断直接调用内核函数。 一、INT 0x2E进0环 .text : 77F070C0 // 之前调用该函数时 mov eax, 0x115,向eax传入一个函数号 1)在GDT表中查看0x2eh 在保护模式的门这一节中,我们了解到当发生中断时,操作系统会查找idt表,根据中断号在idt表中找到中断门描述符,从中断门描述符中读取CS:EIP的信息。 之后,SS EIP 通过搜索GDT表,该表中存放着各个TSS描述符(每个进程一个TSS,内核一个TSS,TSS存放各种寄存器用于任务切换),来查找内核的 SS EIP。 如图:我们通过windbg来查找出该地址 gdt+2e*8 根据中断门描述符属性将 83e8ee00`00082fee 拆分拼接之后可知SS:08 / EIP:83e82fee 2)查看 EIP:83e82fee 这个函数 kd> u 83e82fee 该 nt!KiSystemService函数是真正的内核函数,并不是ntdll.dll模块下,其存在于ntoskrnl.exe / ntkrnlpa.exe中(根据分页模式不同选用不同的程序) 二、通过 systenter进入0环 MSR寄存器存着进入内核的 CS、ESP、EIP的寄存器的值,SS=IA32_SYSENTER_CS+8。 1)windbg查看这个MSR寄存器的值 rdmsr 174 //查看CS rdmsr 175 //查看ESP rdmsr 176 //查看EIP 2)查看EIP这个函数 kd> u 83e830c0 三、通过中断来重写ReadProcessMemory函数(通过快速调用时的实现可以查看这篇Windows系统调用中的API三环部分(依据分析重写ReadProcessMemory函数)) Windows系统调用中API从3环到0环(下) 标签:tchar service 调用 roc style 快速 code system 描述 原文地址:https://www.cnblogs.com/onetrainee/p/11706384.html
.text : 77F070C0 lea edx, [esp + arg_4] // 当前参数的指针存储在 edx中
.text : 77F070C4 int 2Eh; // 通过中断门的形式进入到内核中
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!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