设为首页 - 加入收藏 华夏网 (http://www.hxwgxz.com)- 云主机,资讯,互联网,人工智能,云计算,大数据,区块链,VR,站长网!
热搜: 什么 平台 2017 市场
当前位置: 主页 > 电商 > 正文

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

发布时间:2021-01-10 19:50 所属栏目:[电商] 来源:网络整理
导读:? Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html Windows系统调用中API从3环到0环(下) 如果对API在三环的部分不了解的,可以查看 Windows系统调用中的API三环部分(依据分析重写ReadProcessMemory函数 上篇:Windows系统调用

?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传入一个函数号
  .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 EIP。

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

      

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

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

      

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

  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。

  

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

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

    rdmsr 174?? ? //查看CS

    rdmsr 175?? ?//查看ESP

    rdmsr 176?? ?//查看EIP

?    

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

  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一样,该函数是真正的内核函数。

?

三、通过中断来重写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("%X\n",pBuffer);
31     ReadProcessMemory((HANDLE)-1,&t,0);
32     printf("%X\n",pBuffer);
33 
34     getchar();
35     return 0;
36 }

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章