<menu id="ekugk"></menu>
  • <input id="ekugk"></input><object id="ekugk"></object>
  • <input id="ekugk"><u id="ekugk"></u></input>
    <menu id="ekugk"></menu>
  • <input id="ekugk"></input>
  • <menu id="ekugk"><tt id="ekugk"></tt></menu>
    <object id="ekugk"><acronym id="ekugk"></acronym></object>
    <object id="ekugk"></object>
    <table id="ekugk"><small id="ekugk"></small></table>
  • <input id="ekugk"><u id="ekugk"></u></input>
    <menu id="ekugk"></menu>
  • Windows系统调用中的系统服务表描述符

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

    Windows系统调用中的系统服务表描述符

      在前面,我们将解过 系统服务表。可是,我们有个疑问,系统服务表存储在哪里呢?

      答案就是:系统服务表 存储在 系统服务描述符表中。(其又称为 SSDT Service Descriptor Table)

      分享图片

     

     

     一、使用PELord函数从ntoskrnl.exe文件中查看SSDT导出函数

      如图,可以看出KeServiceDescriptorTable导出函数。

      通过该函数可以查找SSDT表的位置。

      分享图片

     

    二、通过Windbg来内存中查看SSDT表

      使用Windbg,可以使用 kd> dd nt!KeServiceDescriptorTable 指令来查看SSDT表。

      但该指令存在缺点,可以看到第二张表为0,说明如果使用KeServiceDescriptorTable这个公开的导出函数,我们无法看到win32k.sys这张表结构

      kd> dd nt!KeServiceDescriptorTable
        83f759c0  83e89d9c 00000000 00000191 83e8a3e4
        83f759d0  00000000 00000000 00000000 00000000
        83f759e0  83ee86af 00000000 0327aa43 000000bb
        83f759f0  00000011 00000100 5385d2ba d717548f

      为了解决上面这个问题,我们只能使用另外一个指令,该指令对应的是一个未公开导出的函数。

      如下,可以看到其第二行,win32k.sys系统服务表已经可见。

      kd> dd KeServiceDescriptorTableShadow
        83f75a00  83e89d9c 00000000 00000191 83e8a3e4
        83f75a10  83b66000 00000000 00000339 83b6702c
        83f75a20  00000000 00000000 83f75a24 00000340
        83f75a30  00000340 855e8440 00000007 00000000

    三、验证ReadMemory真正的内核实现部分

      我们在这篇《Windows系统调用中API的三环部分(依据分析重写ReadProcessMemory函数)》中曾提到过直接使用快速调用来摒弃R3层层封装的API,其中给eax一个函数号,现在我们来实战刨析一下。

    mov eax, 0x115
    mov edx, 0X7FFE0300

      如下,系统描述符的数据结构,其依次分别为

      分享图片

      其依次分别为 ServiceTable 83e89d9c,Count 00000000,ServiceLimit  00000191,ServiceTable 83e8a3e4 

      使用Windbg来查看其115h序号的函数地址 115h*4 + 83e89d9c (ServiceTable)

      得到函数地址为 8406c82c

      kd> dd 115h*4 + 83e89d9c
        83e8a1f0  8406c82c 840feb46 83fb488c 83fb6128 

      再对此进行反汇编可得

      kd > u 8406c82c   
                    nt!NtReadVirtualMemory:
                    8406c82c 6a18            push    18h
                    8406c82e 68282ae683      push    offset nt!? ? ::FNODOBFM::`string‘+0x3ea8 (83e62a28)
                    8406c833 e870e3e1ff      call    nt!_SEH_prolog4(83e8aba8)
                    8406c838 648b3d24010000  mov     edi, dword ptr fs : [124h]
                    8406c83f 8a873a010000    mov     al, byte ptr[edi + 13Ah]
                    8406c845 8845e4          mov     byte ptr[ebp - 1Ch], al
                    8406c848 8b7514          mov     esi, dword ptr[ebp + 14h]
                    8406c84b 84c0            test    al, al

      之后,我们查看该nt!NtReadVirtualMemory函数的参数个数

      kd > db 83e8a3e4 + 115
                    83e8a4f9  14 08 04 04 14 04 10 08 - 0c 04 14 18 08 08 08 0c
                    83e8a509  0c 08 10 14 08 08 0c 08 - 0c 0c 04 08 08 08 08 08  
                    83e8a519  08 0c 0c 24 00 08 08 08 - 0c 04 08 04 08 10 08 04  

      

    四、通过修改SSDT表增添系统服务函数

      我们在 Windows系统调用中API的三环部分(依据分析重写ReadProcessMemory函数) 调用的是 115h 号函数。

      现在,我们将该函数地址放到 191 号函数处(之前一共有191个函数,占据0-190位)。

      修改思路:

      1)将 nt!NtReadVirtualMemory 函数地址 8406c82c 放到 191号处(83e89d9 + 191h*4)

        kd> ed 83e89d9 + 191h*4 8406c82c 

      2)  增大 服务表最大个数。 (因为我们上一节分析其反汇编代码的时候,发现其会进行最大个数的判断)

        kd> ed 83f75a00+8 192

      3)  修改参数个数表中对应的191号参数个数。(我们之前查阅过其为 14,以字节为单位)

        kd> eb 83e8a3e4+191 14

      4)  之后,我们运行下列代码。其与《Windows系统调用中API的三环部分(依据分析重写ReadProcessMemory函数)》唯一的不同调用函数号为192,最终效果完全一样。

     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         lea     eax, [ebp + 0x14]
    11         push    eax
    12         push[ebp + 0x14]
    13         push[ebp + 0x10]
    14         push[ebp + 0xc]
    15         push[ebp + 8]
    16         sub esp, 4
    17         mov eax, 0x192  // 注意:修改的是这里
    18         mov edx, 0X7FFE0300   //sysenter不能直接调用,我间接call的
    19         CALL DWORD PTR[EDX]
    20         add esp, 24
    21 
    22     }
    23 }
    24 int main()
    25 {
    26     HANDLE hProcess = 0;
    27     int t = 123;
    28     DWORD pBuffer;
    29     //hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0,a);
    30     ReadMemory((HANDLE)-1, (PVOID)&t, &pBuffer, sizeof(int), 0);
    31     printf("%X\n", pBuffer);
    32     ReadProcessMemory((HANDLE)-1, &t, &pBuffer, sizeof(int), 0);
    33     printf("%X\n", pBuffer);
    34 
    35     getchar();
    36     return 0;
    37 }
    相关文章
    相关标签/搜索
    2Cm49cOm招猫49论坛 罗城| 河西区| 藁城市| 兴仁县| 腾冲县| 葵青区| 探索| 上栗县| 广丰县| 闽清县| 大名县| 理塘县| 珠海市| 茶陵县| 任丘市| 叙永县| 高碑店市| 临安市| 大厂| 长葛市| 山东省| 长泰县| 泊头市| 驻马店市| 余姚市| 平顺县| 邵阳县| 班戈县| 长宁区| 凌云县| 治多县| 和林格尔县| 巫溪县| 介休市| 北京市| 肥乡县| 车险| 盐城市| 花莲市| 新野县| 东海县| 建水县| 漳州市| 鹿泉市| 峡江县| 莱州市| 登封市| 辉县市| 周宁县| 中牟县| 汾阳市| 大理市| 耒阳市| 马公市| 东方市| 交口县| 德阳市| 建昌县| 新密市| 登封市| 项城市| 海口市| 凌云县| 平顶山市| 汉沽区| 满城县| 余庆县| 定陶县| 武强县| 望都县| 高安市| 林芝县| 墨玉县| 涿州市| 尚志市| 洪洞县| 克山县| 天水市| 临漳县| 忻州市| 香格里拉县| 林芝县| 长沙市| 西乌珠穆沁旗| 博客| 武乡县| 广州市| 浪卡子县| 左贡县| 承德县| 泗洪县| 福鼎市| 寿光市| 新乡市| 饶平县| 新野县| 讷河市| 元氏县| 察隅县| 婺源县| 图片| 伊金霍洛旗| 康乐县| 邹平县| 荃湾区| 新闻| 华蓥市| 榕江县| 雅江县| 平利县| 安顺市| 梁平县| 金寨县| 关岭| 巴中市| 海安县| 甘泉县| 漳浦县| 墨竹工卡县| 兖州市| 崇信县| 建平县| 上栗县| 遂川县| 如皋市| 东城区| 张掖市| 德江县| 昌乐县| 诸暨市| 永善县| 桃江县| 长岭县| 西贡区| 吉安县| 筠连县| 凯里市| 正宁县| 砚山县| 扶风县| 浪卡子县| 淮南市| 安国市| 若羌县| 姚安县| 兴国县| 阿坝| 九台市| 威远县| 盐山县| 六安市| 柘城县| 田东县| 通海县| 呈贡县| 锦屏县| 南木林县| 桐庐县| 太原市| 沽源县| 宁晋县| 日喀则市| 丹江口市| 威远县| 凤阳县| 额敏县| 宝山区| 原平市| 文成县| 舞阳县| 普定县| 澄城县| 平凉市| 阳山县| 雷州市| 宜春市| 黎城县| 澄城县| 枝江市| 长治县| 大埔县| 台北市| 长治县| 湖口县| 隆昌县| 洛隆县| 澄城县| 弥勒县| 盐亭县| 上思县| 南岸区| 恩施市| 临安市| 河北省| 凭祥市| 墨玉县| 鄂托克旗| 古田县| 察雅县| 海兴县| 蓬莱市| 海阳市| 永修县| 舒兰市| 克什克腾旗| 大丰市| 南安市| 东乌珠穆沁旗| 镇赉县| 布尔津县| 黄浦区| 康定县| 苏尼特左旗| 全州县| 新和县| 左权县| 舒兰市| 五河县| 金寨县| 泰来县| 绥棱县| 丽水市| 穆棱市| 佛坪县| 西平县| 英超| 方山县| 弥勒县| 东丰县| 陆河县| 历史| 深泽县| 湖州市| 池州市| 怀化市| 桃江县| 蓬莱市| 开封市| 襄城县| 新巴尔虎左旗| 舒城县| 韩城市| 丹棱县| 灵丘县| 龙山县| 乌兰县| 五台县| 嵊泗县| 枣阳市| 奉节县| 利川市| 孟州市| 五常市| 永和县| 博湖县| 民县| 江油市| 泰顺县| 红桥区| 宜都市| 弥勒县| 连山| 万全县| 泉州市| 黄石市| 资源县| 吴川市| 且末县| 永平县| 东阿县| 乌恰县| 吉安市| 弥渡县| 永和县| 当雄县| 上杭县| 大姚县| 双鸭山市| 嵊泗县| 枝江市| 来宾市| 马山县| 张家界市| 锡林郭勒盟| 沭阳县| 鄂尔多斯市| 闽清县| 新河县| 航空| 始兴县| 榆树市| 大埔县| 丰宁| 江华| 竹北市| 满城县| 东光县| 邮箱| 甘谷县| 轮台县| 达日县| 永寿县| 沂南县| 满洲里市| 盐边县| 昌乐县| 牡丹江市| 攀枝花市| 疏勒县| 富锦市| 宣城市| 平乐县| 宾阳县| 阿坝县| 射洪县| 垫江县| 尼木县| 黄冈市| 翁牛特旗| 岳阳县| 葫芦岛市| 德安县| 大同县| 九寨沟县| 基隆市| 邳州市| 嘉禾县| 大渡口区| http://3g.bo2020dresss.fun http://3g.yqo2j5rl1v.fun http://3g.gz1980changec.fun http://3g.gz1980explainc.fun http://3g.gz1980feedc.fun http://3g.yqo9j8rl8v.fun http://3g.jvz0j9r8o.fun http://3g.bo2020blows.fun http://3g.yqo9j7rl8v.fun http://3g.bo2020shares.fun http://3g.gz1980sizec.fun http://3g.yqo5j0rl2v.fun http://3g.bo2020bears.fun http://3g.yqo9j4rl8v.fun http://3g.bo2020papers.fun http://3g.gz1980instancec.fun http://3g.yqo8j6rl5v.fun http://3g.bo2020zails.fun