zoukankan      html  css  js  c++  java
  • 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传入一个函数号
      .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

          

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

          

      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。

      

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

        rdmsr 174     //查看CS

        rdmsr 175    //查看ESP

        rdmsr 176    //查看EIP

         

      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, 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 }

     

         

      

  • 相关阅读:
    12月上旬的一些记录
    11月底的记录
    备考 19号
    在android 中开发java.net.SocketException: socket failed: EACCES (Permission denied) 报错
    使用JAVA NIO实现的UDP client和server
    ANSI X9.8标准 PIN xor PAN获取PIN BlOCK
    直接拿来用!最火的iOS开源项目(一)
    Anroid ListView分组和悬浮Header实现
    Android 联网监控抓包工具的制作(tcpdump的使用)
    Android tcpdump抓包应用实现
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11706384.html
Copyright © 2011-2022 走看看