• 系统调用


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

    系统调用

     

    1. ntdll中zw、nt函数与ntoskr中zw、nt函数的区别。

      我们之前很容易混淆这四个,简单说一下,

      1)首先ntdll中很简单,其永远是nt->zw,nt算是打包一下参数等细节,进到zw直接调用。

        其zw函数如下,该地址是一个_shared_内核三环的共享区,如果这里支持快速调用,否则就int 2Eh中断。

      2)至于零环,首先nt是该函数的具体实现,这个毋庸置疑;其次Zw函数直接KiSystemService来调用nt函数。

      总结:内核中的zw函数是为内核时想调用这个函数准备的,但是三环走直接到nt函数。

      

    2. Int 0x2E进入零环

      如果不支持KiFastCall指令进入零环,其会通过Int 0x2E 进入中断。

      0x2E*8h = 0x170h,即IDT+0x170h的偏移。

      IDT表的位置

      

       IDT+0x170处

      

       因此可以验证其通过_KiSystemService这个函数进入零环。

    3. FastCall快速调用进零环

      现在,至少XP的内核文件中,都支持快速调用进零环了。在用户与内核的共享区有一块快速调用的代码,可以支持快速调用。

      快速调用与中断进零环的区别:

      快速调用进零环,其落脚点是KiFastCallEntry

      中断进零环,其落脚点是KiSystemService

      当然,KiSystemService之后也直接jmp KiFastCallEntry中间的一块继续执行,在KiFastCallEntry中,通过KPCR->Thread->ServiceTable确定服务表。

      在KiFastCallEntry的后半部分,通过eax保存的服务号,再计算出得到地址,间接call调用内核函数。

      

       

    4. CS/SS/ESP/EIP的替换

      三环进零环,必须要替换这四个寄存器,那是如何进行替换的呢?

      调用 Int 0x2E 时,其中断门描述符自身就自动指明 CS EIP。 《中断门》

      

      SS ESP 则是由TSS任务段中指明的,其有一块区域SS0、ESP0保存的就是进入零环时的值。《TSS任务段》

      

       这样就很容易找到要替换的 SS CS ESP EIP 四个寄存器了。

      由下面代码看出,其通过TSS寄存器来替换sp0函数的。

      

    5. KiSystemSerivce函数分析-三环进零环如何保存现场

      本质是保存_KTRAP_FRAME这个结构体,然后将该区域的指针存放在_Ethread+0x124(pKtrapFrame),而原先的则保存在当前KrapFrame.ebx的位置。

      看懂下面汇编代码(KisystemService),需要准备以下几点:

      1)查看_KTRAP_FRAME 、 _ETHREAD、_KPCR 三个结构体信息。

      2)内存地址 0FFDFF000h保存的是_KPCR地址。

      3)之后照着相关结构体和汇编代码一步步分析即可。(注释有详细介绍,很好理解)

      

  • 相关阅读:
    Delphi管理多线程之线程局部存储:threadvar
    Delphi多线程编程--线程同步的方法(事件、互斥、信号、计时器)简介
    Delphi线程同步(临界区、互斥、信号量)
    Delphi多线程的OnTerminate属性(附加一个关于临界区线程同步的例子)
    Delphi中怎么结束线程(这个线程是定时执行的)(方案二)
    Delphi中怎么结束线程(这个线程是定时执行的)(方案一)
    Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……
    Docker数据卷
    Docker获取镜像以及相关指令
    Docker安装
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12599328.html
Copyright © 2020-2023  润新知