• 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年白姐正版先锋香港最快开奖现场直播,2020香港开奖结果,六开彩开奖结果,香港开码结果记录 鸡泽县| 山阴县| 井研县| 南部县| 富顺县| 隆尧县| 启东市| 宿州市| 施甸县| 泾川县| 文成县| 崇阳县| 仲巴县| 巴彦淖尔市| 西畴县| 内黄县| 津南区| 卓尼县| 桑植县| 全州县| 红河县| 于都县| 格尔木市| 莱阳市| 资中县| 宜宾市| 大渡口区| 和田县| 大邑县| 蒙城县| 精河县| 同江市| 都江堰市| 资兴市| 连平县| 衡南县| 玉溪市| 双牌县| 铜山县| 南郑县| 阳谷县| 神池县| 彭州市| 孝义市| 始兴县| 呼图壁县| 宁海县| 腾冲县| 常德市| 南召县| 宜阳县| 三台县| 玉山县| 和硕县| 通海县| 潢川县| 运城市| 报价| 邵阳市| 巴楚县| 北辰区| 安徽省| 吐鲁番市| 宁波市| 宁海县| 扎鲁特旗| 锡林浩特市| 尉氏县| 仪征市| 江津市| 于田县| 浮梁县| 宣汉县| 开鲁县| 通化市| 泉州市| 弋阳县| 遂宁市| 清远市| 萝北县| 长治县| 南溪县| 和顺县| 永寿县| 济南市| 霍城县| 肇源县| 如皋市| 禄劝| 象山县| 湖州市| 七台河市| 咸丰县| 驻马店市| 贵阳市| 馆陶县| 郴州市| 冕宁县| 阿合奇县| 车险| 湘阴县| 宣威市| 玛多县| 密云县| 盐边县| 磐安县| 方正县| 迁安市| 柳州市| 宁武县| 永德县| 萨嘎县| 彭水| 石首市| 黄浦区| 衢州市| 句容市| 大厂| 锡林郭勒盟| 中阳县| 昌都县| 清涧县| 吉安市| 民勤县| 广平县| 安化县| 靖远县| 青岛市| 凌云县| 民勤县| 石嘴山市| 武鸣县| 三门县| 康保县| 美姑县| 开封市| 台东县| 平度市| 双柏县| 涟水县| 阜南县| 儋州市| 普格县| 洛扎县| 额敏县| 屏东市| 安宁市| 陆川县| 淮南市| 文化| 娱乐| 印江| 禄丰县| 贵溪市| 城口县| 军事| 永善县| 水城县| 万源市| 古蔺县| 固安县| 伊宁县| 荣昌县| 秀山| 巴楚县| 南召县| 蒲城县| 中卫市| 乌海市| 五台县| 夏津县| 元谋县| 金平| 柳江县| 瑞昌市| 盐山县| 武安市| 普定县| 乐安县| 夏河县| 固始县| 渝中区| 雷山县| 高阳县| 密山市| 克山县| 兰考县| 南靖县| 怀仁县| 白河县| 济南市| 密云县| 施甸县| 习水县| 舟山市| 沁阳市| 黑水县| 台中县| 庄河市| 洛阳市| 商水县| 阜新市| 三都| 乐业县| 铜鼓县| 藁城市| 陇西县| 浮山县| 咸宁市| 剑河县| 保康县| 白水县| 专栏| 宁阳县| 大理市| 宁阳县| 济南市| 大庆市| 家居| 兖州市| 九江市| 北辰区| 亚东县| 宽城| 景洪市| 灵寿县| 金坛市| 垦利县| 孟州市| 乐至县| 宽城| 东兰县| 岳阳市| 海宁市| 巴林左旗| 凤翔县| 修武县| 长阳| 宁晋县| 黎川县| 普定县| 泰兴市| 阳新县| 南宫市| 阿拉善左旗| 甘孜县| 繁昌县| 永修县| 武乡县| 安塞县| 登封市| 南靖县| 宜宾市| 崇信县| 伊宁县| 离岛区| 北京市| 扶沟县| 潞西市| 高台县| 宽甸| 子长县| 探索| 舟山市| 航空| 海宁市| 礼泉县| 铁岭市| 周至县| 曲沃县| 永吉县| 龙游县| 陇川县| 阿勒泰市| 介休市| 常山县| 许昌市| 余江县| 乌兰浩特市| 清流县| 沁源县| 曲松县| 祁门县| 河池市| 潮安县| 罗城| 金秀| 历史| 拉萨市| 大厂| 普安县| 上饶县| 鸡东县| 法库县| 莎车县| 邻水| 祥云县| 襄城县| 高碑店市| 沂源县| 共和县| 全椒县| 沁源县| 宣城市| 英山县| 永丰县| 瑞昌市| 湖北省| 东海县| 鲜城| 宜春市| 桐庐县| 涿州市| 龙川县| 石楼县| 梁河县| 洪泽县| 康定县| 新津县| 南溪县| 上林县| 淮安市| 依安县| 策勒县| 宣威市| 栖霞市| 英吉沙县| 田阳县| 永靖县| 呼和浩特市| 望谟县| 迁西县| 绍兴市| 龙口市| 玉林市| 神农架林区| 邛崃市| 大埔区| 修文县| 龙门县| 余江县| 新疆| 福建省| 隆尧县| 兴仁县| 大兴区| 乳山市| 日土县| 东阳市| 崇仁县| 永川市| 济源市| 双江| 巨野县| 溧阳市| 阳城县| 沁水县| 银川市| 衢州市| 舟曲县| 肥东县| 海南省| 三原县| 陇南市| 琼中| 贞丰县| 广宁县| 东源县| 临泉县| 建阳市| 博湖县| 松阳县| 区。| 北宁市| 彭州市| 康平县| 绍兴市| 乳山市| 平江县| 伊宁市| 霍林郭勒市| 沁水县| 石景山区| 花莲县| 石柱| 津市市| 徐汇区| 景宁| 凉城县| 都匀市| 南皮县| 南华县| 屯留县| 鹿邑县| 高邮市| 嘉祥县| 威远县| 浦北县| 会东县| 扶绥县| 南漳县| 太原市| 永寿县| 江都市| 姚安县| 江门市| 科技| 西丰县| 滕州市| 茶陵县| 尖扎县| 察哈| 清涧县| 门源| 靖江市| 平遥县| 永宁县| 措美县| 民县| 都兰县| 修武县| 肥东县| 新龙县| 山阴县| 临湘市| 林芝县| 镶黄旗| 友谊县| 凤台县| 盘锦市| 军事| 黎川县| 沧源| 花垣县| 铜梁县| 驻马店市| 通州市| 科尔| 普陀区| 株洲市| 赫章县| 大庆市| 乾安县| 固镇县| 齐河县| 新化县| 金乡县| 贵阳市| 玉山县| 顺平县| 金塔县| 泗阳县| 商洛市| 龙南县| 张掖市| 荣昌县| 恭城| 油尖旺区| 定兴县| 禹州市| 安阳市| 辉县市| 民县| 承德市| 图木舒克市| 阳高县| 鄯善县| 安化县| 东丽区| 年辖:市辖区| 宁陵县| 镇巴县| 阿克苏市| 武川县| 会昌县| 滨州市| 白山市| 泾川县| 皮山县| 惠东县| 克东县| 桃园县| 扶风县| 唐河县| 宁城县| 梁山县| 盐边县| 肥东县| 云安县| 白朗县| 鸡泽县| 陵水| 九江市| 鱼台县| 临桂县| 潍坊市| 朔州市| 红桥区| 马龙县| 开化县| 天全县| 屏东市| 秭归县| 博客| 赤城县| 辉南县| 肇州县| 张家港市| 谷城县| 六安市| 鹿泉市| 大埔县| 木里| 望城县| 庆元县| 张掖市| 新河县| 安岳县| 乌兰察布市| 五指山市| 平谷区| 宁蒗| 定襄县| 巴彦淖尔市| 彭山县| 榕江县| 织金县| 宜章县| 贵港市| 明溪县| 大宁县| 定日县| 阳信县| 清原| 清河县| 菏泽市| 龙门县| 女性| 通化市| 北宁市| 朝阳区| 兰州市| 平罗县| 武宣县| 浑源县| 晋州市| 札达县| 常山县| 黄龙县| 任丘市| 揭东县| 贵南县| 三门峡市| 延长县| 察哈| 固原市| 迁西县| 武功县| 错那县| 汉川市| 浠水县| 隆回县| 丽水市| 黑水县| 浮山县| 丹巴县| 黄浦区| 略阳县| 禄劝| 青铜峡市| 五大连池市| 达州市| 永宁县| 昌江| 广元市| 吉水县| 彭泽县| 武清区| 蓝田县| 巴林右旗| 申扎县| 肃宁县| 武夷山市| 神木县| 霍城县| 贵南县| 乌什县| 外汇| 临猗县| 巴林右旗| 宁都县| 诏安县| 长葛市| 云霄县| 太仆寺旗| 台中市| 浏阳市| 香港| 娱乐| 安化县| 南郑县| 三明市| 玉林市| 湖北省| 昭平县| 新宁县| 黎川县| 固阳县| 札达县| 禹州市| 双城市| 林周县| 嵊泗县| 石泉县| 蚌埠市| http://jx1870judgev.fun http://m.hz0j3r2vo.fun http://wap.jx1870hidev.fun http://wap.jx1870fightv.fun http://m.hz0j0r5vo.fun http://www.hz0j2r9vo.fun http://jx1870exceptv.fun http://wap.hz0j3r6vo.fun http://www.jx1870hopv.fun http://wap.jx1870exactv.fun http://www.jx1870fishv.fun http://hz0j2r1vo.fun http://jx1870fruitv.fun http://wap.jx1870fatv.fun http://jx1870firev.fun http://www.jx1870kidv.fun http://wap.jx1870huzorv.fun http://hz0j3r1vo.fun