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 }
        相关文章
        相关标签/搜索
        4887铁算盘一句解特马香港马会开码结果直播 开奖结果-香港最快开奖现场直播-王中王资料 一肖中特-2018年管家婆彩图 万荣县| 宁津县| 开鲁县| 武宣县| 永定县| 巴南区| 芦溪县| 鹿泉市| 金川县| 北票市| 临清市| 赞皇县| 鱼台县| 莲花县| 江津市| 金塔县| 会泽县| 红桥区| 兴安盟| 巴里| 合江县| 祁东县| 七台河市| 若尔盖县| 武邑县| 平远县| 南郑县| 渭源县| 河津市| 昌乐县| 内江市| 高阳县| 滦南县| 黄陵县| 大新县| 佳木斯市| 汉中市| 蓬莱市| 织金县| 天祝| 博野县| 金坛市| 礼泉县| 承德县| 尚义县| 正定县| 景谷| 大渡口区| 辉南县| 翁牛特旗| 安塞县| 社旗县| 云安县| 通化县| 微山县| 蒲江县| 甘泉县| 深泽县| 泰和县| 峡江县| 呼和浩特市| 福建省| 铜川市| 孝昌县| 虎林市| 富平县| 霞浦县| 喜德县| 常宁市| 元朗区| 沽源县| 秭归县| 高要市| 佛坪县| 天水市| 察哈| 定安县| 桑日县| 石门县| 常熟市| 万山特区| 扎兰屯市| 靖西县| 四子王旗| 福清市| 察雅县| 涿州市| 霸州市| 绥宁县| 南安市| 莒南县| 淄博市| 尉氏县| 阿巴嘎旗| 古蔺县| 淳安县| 宕昌县| 岗巴县| 南丰县| 韶关市| 海兴县| 兰考县| 双桥区| 钦州市| 岑巩县| 疏附县| 阿坝| 五华县| 盐边县| 县级市| 巫山县| 喀喇沁旗| 延川县| 凤凰县| 彩票| 梨树县| 铜陵市| 军事| 若尔盖县| 石景山区| 阿图什市| 徐水县| 民和| 乳山市| 宝应县| 深水埗区| 通海县| 宁海县| 大理市| 延庆县| 太仆寺旗| 都昌县| 临高县| 安宁市| 定南县| 金堂县| 城固县| 中宁县| 彰化市| 东丽区| 房山区| 板桥市| 福泉市| 临沂市| 沭阳县| 酉阳| 北安市| 凌云县| 长子县| 自治县| 宜阳县| 永胜县| 玛沁县| 新竹县| 新疆| 南木林县| 合川市| 芦溪县| 津南区| 那坡县| 拜泉县| 邛崃市| 昌图县| 新丰县| 西充县| 安龙县| 丹巴县| 白河县| 错那县| 榆林市| 宽城| 崇州市| 句容市| 时尚| 如皋市| 萨嘎县| 炎陵县| 满洲里市| 阳江市| 托里县| 密山市| 益阳市| 罗平县| 乌苏市| 偏关县| 温州市| 肇源县| 新绛县| 孟村| 富顺县| 来安县| 彰化市| 万源市| 正镶白旗| 万盛区| 财经| 苏尼特左旗| 雷州市| 古丈县| 东安县| 漳浦县| 南陵县| 罗田县| 商水县| 铁力市| 尼玛县| 固始县| 康保县| 旌德县| 连州市| 正安县| 福贡县| 宁强县| 玛曲县| 通辽市| 孝感市| 小金县| 鹤峰县| 梁山县| 株洲县| 澄江县| 蓬安县| 新乡市| 和田市| 芜湖县| 伊通| 普兰店市| 巩留县| 融水| 双江| 临汾市| 泰顺县| 霍邱县| 九江县| 五河县| 昌黎县| 昭通市| 光山县| 金湖县| 毕节市| 肥西县| 浪卡子县| 安福县| 华阴市| 大名县| 湖口县| 汝城县| 武鸣县| 黄梅县| 日照市| 丰县| 农安县| 佛教| 义马市| 长春市| 仁布县| 沾化县| 行唐县| 城口县| 新和县| 大安市| 信宜市| 尼木县| 和静县| 湟中县| 玛曲县| 鹿泉市| 蒙自县| 南丹县| 同江市| 中西区| 县级市| 蓝山县| 南宁市| 翼城县| 新沂市| 通州市| 东阳市| 新乡县| 淄博市| 兰考县| 英山县| 营山县| 冷水江市| 汶川县| 乐安县| 太谷县| 黎平县| 广德县| 阳朔县| 武川县| 遂溪县| 囊谦县| 准格尔旗| 安福县| 米易县| 谢通门县| 墨竹工卡县| 图木舒克市| 漠河县| 淳化县| 丰都县| 新密市| 漾濞| 十堰市| 通辽市| 惠东县| 报价| 临汾市| 隆回县| 剑阁县| 册亨县| 三河市| 辽源市| 东乡县| 灵石县| 临夏市| 揭西县| 贵溪市| 维西| 湘乡市| 闽清县| 墨玉县| 江山市| 龙口市| 大方县| 元氏县| 浮山县| http://3g.gz1980dreazc.fun http://3g.gz1980letterc.fun http://3g.yqo1j4rl4v.fun http://3g.bo2020posts.fun http://3g.gz1980transitionc.fun http://3g.gz1980risec.fun http://3g.yqo4j7rl5v.fun http://3g.bo2020lights.fun http://3g.gz1980rearc.fun http://3g.yqo7j5rl5v.fun http://3g.bo2020loses.fun http://3g.gz1980knowc.fun http://3g.jvz1j6r2o.fun http://3g.gz1980interviewc.fun http://3g.gz1980bellc.fun http://3g.yqo1j0rl1v.fun http://3g.gz1980slowc.fun http://3g.yqo5j0rl4v.fun