Windows系统调用中API从3环到0环(下)
?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函数)) 1 #include "pch.h" 2 #include <iostream> 3 #include <algorithm> 4 #include <Windows.h> 5 void ReadMemory(HANDLE hProcess,PVOID pAddr,PVOID pBuffer,DWORD dwSize,DWORD *dwSizeRet) 6 { 7 8 _asm 9 { 10 11 lea eax,[ebp + 0x14] 12 push eax 13 push[ebp + 0x14] 14 push[ebp + 0x10] 15 push[ebp + 0xc] 16 push[ebp + 8] 17 mov eax,0x115 18 mov edx,esp 19 int 0x2e 20 add esp,20 21 } 22 } 23 int main() 24 { 25 HANDLE hProcess = 0; 26 int t = 123; 27 DWORD pBuffer; 28 //hProcess = OpenProcess(PROCESS_ALL_ACCESS,a); 29 ReadMemory((HANDLE)-1,(PVOID)&t,&pBuffer,sizeof(int),0); 30 printf("%Xn",pBuffer); 31 ReadProcessMemory((HANDLE)-1,&t,0); 32 printf("%Xn",pBuffer); 33 34 getchar(); 35 return 0; 36 } (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |