zoukankan      html  css  js  c++  java
  • SSDT索引号的获取

    系统服务描述符表,System Service Dispatch Table,SSDT

    根据我个人理解就是为上层软件提供应用程序编程接口的集合;简单的理解就是api(application programming interface)

    windows在内核层提供了两张表,分别为ssdt(system service descriptor table,系统服务描述表)shadow ssdt 。用户层的api实现,实际是层简单的包装,最终都是转到内核调用相应的api,然后执行完成后返回到用户层的。而为了方便起见,所有用户层的api调用都会转到ssdt或者shadow ssdt这张表中,这样就使不同的api调用不需要在内核编写不同的调用规则,只需要转到对应ssdt表中的位置就行了关于这点可以在后面慢慢理解。

    typedef struct ServiceDescriptorEntry {

    unsigned int *ServiceTableBase;

    unsigned int *ServiceCounterTableBase; //仅适用于checked build版本

    unsigned int NumberOfServices;

    unsigned char *ParamTableBase;

    } ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;

    KeServiceDescriptorTable是由内核导出的表。该表拥有一个指针(其实仅有ntoskrnel一项,没有包含win32k),指向SSDT包含由Ntoskrnl.exe实现的核心系统服务的相应部分,它是内核的主要组成部分。

    typedef struct _SystemServiceDescriptorTable
    {
    PVOID ServiceTableBase;
    PULONG ServiceCounterTableBase;
    ULONG NumberOfService;
    ULONG ParamTableBase;
    }SystemServiceDescriptorTable,*PSystemServiceDescriptorTable;

    中SSDT包含了所有内核导出函数的地址。每个地址长度为4个字节。所以要获得某个函数在SSDT中的偏移量,可以用:KeServiceDescriptorTable->ServiceTableBase + 函数ID* 4获取。

    那么怎么获取函数ID呢?

    其实很简单,ntoskrnl.exe导出的Zw*函数和Nt*函数,大家肯定都注意到了很多函数都是同名的,只是前缀不同。其实是这样的,Nt*函数是私有函数,其地址列于SSDT中。Zw*函数是由内核为使用设备驱动程序和其他内核组件而导出的函数,目的就在于同过Zw*函数去调用内核的Nt函数。(SSDT中的每一项和每个Zw*函数之间不存在一对一的对应关系)

    内核的所有Zw*函数都以操作码mov eax, ULONG起始,其ULONG是系统调用在SSDT中的索引号

    说的具体点,就是每个Zw*号函数的第一行的 ULONG值 就是其所对应的Nt*函数在SSDT中的索引号

    举个例子,如果我现在想获取 NtOpenProcess的ID号,那么就可以在Windbg运行 u ZwOpenProcess

    u ZwOpenProcess
    nt!ZwOpenProcess:
    805016c4 b87a000000      mov     eax,7Ah
    805016c9 8d542404        lea     edx,[esp+4]
    805016cd 9c              pushfd
    805016ce 6a08            push    8
    805016d0 e88c0d0400      call    nt!KiSystemService (80542461)
    805016d5 c21000          ret     10h

    获取到的0x7A就是NtOpenProcess在SSDT中的ID号了。

     
  • 相关阅读:
    ListView控件学习系列2编辑ListView(Edit,Update,Insert,Delete)
    程序员如何营销自己?(转贴)
    ListView使用技巧
    ListView控件学习系列1了解ListView控件
    LINQ To SQL深入学习系列之四(LINQ查询基础)
    单元测试基础知识(转)
    微软vs2008快捷键
    ListView控件学习系列3ListView选择,排序,分页
    反射学习系列1反射入门
    一道笔试题的解法和联想
  • 原文地址:https://www.cnblogs.com/mayingkun/p/4177164.html
Copyright © 2011-2022 走看看