1. <mark id="s2zkv"><ol id="s2zkv"></ol></mark>
      <mark id="s2zkv"></mark>

        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 }
        相关文章
        相关标签/搜索
        最准三码中特2020年香港六合马会开奖结果现场直播开奖历史资料记录在线查询网二四六天天好彩免费资料大全 大洼县| 东阳市| 毕节市| 大渡口区| 蓬溪县| 屯门区| 江城| 灵宝市| 五莲县| 大丰市| 互助| 盐津县| 武冈市| 临漳县| 唐河县| 冷水江市| 新郑市| 务川| 米脂县| 剑阁县| 津市市| 西峡县| 克东县| 中西区| 万州区| 长丰县| 杭州市| 库车县| 福安市| 普宁市| 福贡县| 滦平县| 屯留县| 崇文区| 岫岩| 宁化县| 靖江市| 晋城| 徐州市| 庄浪县| 英山县| 米脂县| 上高县| 永川市| 宝鸡市| 昔阳县| 泰州市| 汶上县| 日照市| 襄城县| 上犹县| 晋城| 钦州市| 和平县| 高要市| 仁化县| 肃北| 嘉鱼县| 双江| 白银市| 松溪县| 榆中县| 克山县| 兴化市| 临猗县| 宁晋县| 德清县| 光泽县| 高阳县| 开远市| 嘉兴市| 潮安县| 收藏| 西和县| 焦作市| 湄潭县| 成安县| 松原市| 庆云县| 扬中市| 克东县| 龙山县| 中阳县| 岗巴县| 开平市| 西丰县| 京山县| 且末县| 松阳县| 四川省| 卓资县| 京山县| 恩施市| 孝昌县| 新津县| 二手房| 宁城县| 安龙县| 安达市| 石河子市| 安阳市| 南宫市| 贡觉县| 阜新市| 南陵县| 红安县| 石首市| 广州市| 成都市| 岳池县| 正安县| 民权县| 霍山县| 博客| 广饶县| 清水河县| 偃师市| 石家庄市| 东平县| 金昌市| 霍山县| 内乡县| 青河县| 淮北市| 颍上县| 松溪县| 汶川县| 宝丰县| 上虞市| 南宫市| 泸溪县| 沁源县| 汝城县| 汽车| 手游| 长治市| 安庆市| 雅江县| 平泉县| 灌南县| 新邵县| 项城市| 固始县| 龙岩市| 收藏| 余干县| 宝山区| 秀山| 满城县| 宝山区| 兖州市| 瓦房店市| 克东县| 象山县| 安阳县| 武汉市| 浙江省| 贡山| 广宁县| 宜丰县| 怀来县| 仲巴县| 巩义市| 财经| 铁岭县| 竹溪县| 鹤庆县| 阜城县| 桦甸市| 吉安县| 黔江区| 岑溪市| 岑巩县| 博白县| 韶山市| 仙居县| 仙游县| 临夏县| 彝良县| 东至县| 大厂| 阜平县| 章丘市| 前郭尔| 安泽县| 桐乡市| 桦川县| 德惠市| 门头沟区| 米林县| 綦江县| 正阳县| 乌拉特前旗| 论坛| 闻喜县| 衡山县| 西乌| 镇平县| 太保市| 和林格尔县| 尉犁县| 环江| 麻江县| 仪陇县| 惠州市| 彭山县| 定安县| 基隆市| 五指山市| 大新县| 连江县| 出国| 农安县| 宣威市| 邯郸市| 长汀县| 河源市| 理塘县| 自治县| 大化| 宜州市| 永安市| 新平| 襄樊市| 邳州市| 西乌| 旌德县| 桃园县| 淮滨县| 黄陵县| 古交市| 金湖县| 安庆市| 扶沟县| 炉霍县| 临沧市| 贵定县| 临湘市| 明光市| 永春县| 丽水市| 鸡东县| 博湖县| 枣庄市| 清水县| 吉水县| 凤翔县| 白沙| 革吉县| 彩票| 南华县| 大宁县| 金山区| 凌源市| 繁峙县| 九龙城区| 汉沽区| 濮阳市| 黑山县| 苍溪县| 北辰区| 金华市| 南江县| 陇西县| 南涧| 洮南市| 临泉县| 武陟县| 宁陵县| 湖口县| 射洪县| 安龙县| 巴东县| 新昌县| 行唐县| 嘉禾县| 卓资县| 邻水| 平塘县| 静乐县| 余干县| 兴义市| 千阳县| 潼关县| 府谷县| 周至县| 满城县| 克拉玛依市| 双牌县| 泽州县| 乌兰县| 崇阳县| 台中市| 南汇区| 三亚市| 政和县| 黔江区| 西城区| 兴隆县| 溧水县| 鄂伦春自治旗| 凌云县| 万盛区| 柘城县| 明水县| 乌鲁木齐县| 楚雄市| 益阳市| 河西区| 广丰县| 深泽县| 颍上县| 玉树县| 嘉义市| 富蕴县| 积石山| 互助| 克拉玛依市| 绥滨县| 桃园县| 嵩明县| 祥云县| 平邑县| 甘孜| 来凤县| 宣武区| 浦城县| 望谟县| http://3g.bo2020firzs.fun http://3g.gz1980staffc.fun http://3g.yqo3j4rl7v.fun http://3g.bo2020rows.fun http://3g.gz1980sexc.fun http://3g.yqo4j0rl2v.fun http://3g.bo2020exits.fun http://3g.gz1980zachinec.fun http://3g.gz1980affectc.fun http://3g.yqo6j9rl0v.fun http://3g.bo2020layers.fun http://3g.gz1980zassc.fun http://3g.yqo1j6rl4v.fun http://3g.gz1980potterc.fun http://3g.yqo4j2rl1v.fun http://3g.bo2020cards.fun http://3g.yqo9j2rl5v.fun http://3g.bo2020evidences.fun