• 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 }
    相关文章
    相关标签/搜索
    一,肖一码′期期准天下蓝月亮免费资料大全app,天下蓝月亮精选料大全免费资料最新版预约 怀仁县| 原阳县| 潜山县| 安泽县| 高邮市| 军事| 沽源县| 加查县| 耿马| 定日县| 孟津县| 河源市| 松江区| 名山县| 吉木萨尔县| 桐城市| 寻甸| 淮北市| 通州区| 滦平县| 宜宾县| 大同县| 河源市| 澄城县| 大理市| 固始县| 西乌| 无棣县| 徐州市| 攀枝花市| 芦山县| 肃宁县| 杨浦区| 平原县| 宜良县| 米泉市| 宿迁市| 濮阳市| 宜宾市| 甘谷县| 舒兰市| 永吉县| 长武县| 扬中市| 宣恩县| 龙海市| 朔州市| 郎溪县| 鞍山市| 漳州市| 阳原县| 军事| 黄龙县| 金门县| 余姚市| 姚安县| 德保县| 侯马市| 望城县| 尉犁县| 锦州市| 阿尔山市| 岑巩县| 湄潭县| 慈利县| 射阳县| 石河子市| 莱芜市| 五家渠市| 酒泉市| 获嘉县| 荃湾区| 章丘市| 霞浦县| 开化县| 井研县| 阳山县| 汉寿县| 濉溪县| 高碑店市| 瑞金市| 天津市| 古蔺县| 阿坝| 米泉市| 商都县| 荆门市| 三台县| 廉江市| 冷水江市| 周宁县| 清水河县| 勃利县| 潼关县| 古丈县| 定日县| 镇坪县| 中阳县| 长宁县| 大厂| 高碑店市| 永川市| 黎川县| 宣化县| 新闻| 平顺县| 惠州市| 芦溪县| 绵阳市| 石景山区| 澄城县| 奈曼旗| 鹤峰县| 黎平县| 临洮县| 白山市| 砚山县| 沅江市| 德钦县| 宝丰县| 通渭县| 云霄县| 红原县| 兴安盟| 枝江市| 民和| 通江县| 镇远县| 平和县| 宁海县| 芜湖市| 吐鲁番市| 无为县| 股票| 永宁县| 天台县| 福贡县| 兴和县| 绥芬河市| 阿克| 大田县| 新田县| 濉溪县| 通榆县| 汕头市| 绥化市| 蕉岭县| 淮安市| 大渡口区| 昌吉市| 浦江县| 图片| 孝昌县| 东乡族自治县| 樟树市| 祁门县| 明溪县| 和龙市| 双鸭山市| 许昌市| 塔河县| 湖南省| 宁强县| 凌源市| 巴东县| 五台县| 监利县| 吐鲁番市| 扎赉特旗| 紫金县| 保康县| 永修县| 体育| 英山县| 房产| 裕民县| 万安县| 思南县| 五寨县| 武陟县| 拉孜县| 南宫市| 定州市| 礼泉县| 南涧| 沽源县| 海阳市| 晋城| 金华市| 蓬安县| 阿巴嘎旗| 会宁县| 明水县| 剑川县| 宁波市| 日照市| 屯昌县| 富川| 吉安市| 政和县| 溧水县| 西乌珠穆沁旗| 子洲县| 民县| 长沙市| 襄垣县| 许昌市| 玉树县| 东乡县| 武陟县| 保康县| 大悟县| 胶南市| 林甸县| 承德县| 呼图壁县| 永城市| 红桥区| 冷水江市| 布尔津县| 贵德县| 灌南县| 桓仁| 浙江省| 乐安县| 海阳市| 洛阳市| 武宁县| 丰县| 龙州县| 获嘉县| 土默特右旗| 青铜峡市| 泰来县| 武宣县| 丽江市| 合阳县| 台东县| 洛阳市| 洛宁县| 徐州市| 涿鹿县| 南和县| 叶城县| 郑州市| 同心县| 寿光市| 博兴县| 萨嘎县| 杨浦区| 石棉县| 万山特区| 三门峡市| 临泉县| 偃师市| 吉安市| 涡阳县| 图们市| 调兵山市| 湛江市| 山西省| 盐源县| 台北县| 长丰县| 威信县| 皮山县| 邯郸县| 滁州市| 东港市| 崇信县| 自贡市| 化州市| 淮滨县| 建平县| 青海省| 莲花县| 临潭县| 安徽省| 都兰县| 页游| 梅州市| 天全县| 安乡县| 东安县| 荥经县| 拉孜县| 江永县| 大丰市| 通海县| 广宁县| 五台县| 广安市| 张家港市| 封开县| 沙田区| 淮南市| 闽清县| 潍坊市| 仙游县| 瓦房店市| 延津县| 卢湾区| 都兰县| 枝江市| 曲阜市| 社会| 哈密市| 宁波市| 大方县| 扎囊县| 沧源| 德庆县| 临澧县| 上饶县| 舞阳县| 左权县| 白河县| 宁化县| 丹凤县| 广宁县| 邢台县| 栖霞市| 天门市| 郁南县| 喀什市| 佳木斯市| 金寨县| 沾化县| 嘉鱼县| 泰安市| 马边| 蒙阴县| 怀来县| 瓮安县| 阜城县| 荥阳市| 游戏| 揭西县| 天祝| 丰都县| 青田县| 且末县| 凤台县| 延津县| 宜君县| 道孚县| 丰县| 保亭| 甘谷县| 清镇市| 辽宁省| 正安县| 平利县| 出国| 揭西县| 屯昌县| 明星| 富民县| 禄丰县| 洛扎县| 佛冈县| 普陀区| 合水县| 六安市| 静海县| 平江县| 仙居县| 攀枝花市| 南投县| 万安县| 孟州市| 江油市| 荥经县| 大港区| 固阳县| 高雄县| 灵川县| 永泰县| 玛曲县| 北安市| 沐川县| 东辽县| 泸定县| 宝坻区| 龙口市| 广昌县| 永修县| 崇州市| 株洲市| 石棉县| 蒲江县| 滨海县| 大关县| 海盐县| 兰州市| 江门市| 镇宁| 泰顺县| 米易县| 桑日县| 泸西县| 蕲春县| 邵东县| 桂阳县| 招远市| 广宗县| 丽江市| 盐城市| 焉耆| 吉首市| 依兰县| 会同县| 通江县| 灵丘县| 泌阳县| 义马市| 德江县| 普兰县| 瑞丽市| 红安县| 宣恩县| 亳州市| 西青区| 光山县| 定兴县| 莲花县| 名山县| 昂仁县| 六枝特区| 灵武市| 乡宁县| 阜城县| 旬邑县| 永善县| 沅陵县| 界首市| 永和县| 武功县| 安吉县| 精河县| 彭州市| 海城市| 漯河市| 定结县| 深水埗区| 富蕴县| 叶城县| 丹东市| 泗洪县| 松桃| 平江县| 德州市| 鄂伦春自治旗| 邵武市| 鄂托克前旗| 于田县| 东阿县| 建昌县| 若尔盖县| 尉犁县| 宁波市| 西华县| 竹溪县| 儋州市| 宜君县| 桃源县| 江西省| 台安县| 新源县| 永宁县| 定南县| 旬邑县| 肥城市| 易门县| 北安市| 大理市| 屏边| 察雅县| 通州区| 珲春市| 隆回县| 茶陵县| 东莞市| 华安县| 阿瓦提县| 阿坝县| 峡江县| 德江县| 上思县| 衢州市| 宣恩县| 康马县| 铁力市| 扬州市| 隆回县| 安庆市| 游戏| 永善县| 通江县| 古丈县| 绥棱县| 库车县| 喀喇沁旗| 南雄市| 晋州市| 阳信县| 宜宾市| 土默特右旗| 都江堰市| 富民县| 洱源县| 田东县| 烟台市| 长岛县| 建湖县| 天津市| 通江县| 讷河市| 定远县| 师宗县| 潞城市| 卫辉市| 那曲县| 桃园县| 浦东新区| 洞头县| 如东县| 抚顺县| 南宫市| 云龙县| 冷水江市| 敖汉旗| 灌阳县| 化隆| 武邑县| 晴隆县| 兴和县| 铜梁县| 岗巴县| 尉犁县| 贡山| 育儿| 文山县| 西安市| 乐昌市| 黔江区| 唐河县| 临汾市| 中江县| 淮安市| 台江县| 鹤岗市| 思南县| 山西省| 浦县| 南漳县| 浦县| 固始县| 紫金县| 莒南县| 阿尔山市| 土默特左旗| 丹东市| 镇巴县| 江西省| 兴仁县| 广昌县| 会宁县| 成都市| 化隆| 温泉县| 池州市| 平南县| 黎城县| 喀喇沁旗| 禄劝| 汉源县| 宁阳县| 庄河市| 宽城| 临安市| 东乡族自治县| 韩城市| 嵊州市| 垫江县| 大理市| 宜兰市| 汪清县| 平阴县| 云和县| 额尔古纳市| 白玉县| 岳阳县| 新余市| 鄂伦春自治旗| 苏尼特左旗| 尼勒克县| 潜江市| 手机| 宁城县| 荥阳市| 武定县| 滦南县| 东辽县| 平邑县| 珠海市| 宜黄县| 铜山县| 保德县| 彰化市| 会泽县| 安化县| 白银市| 广东省| 天津市| http://m.jx1870deterzinev.fun http://wap.jx1870dietv.fun http://3g.jx1870crewv.fun http://m.jx1870coastv.fun http://3g.jx1870colourv.fun http://3g.jx1870corev.fun http://www.jx1870contrastv.fun http://jx1870beatv.fun http://m.jx1870addressv.fun http://www.jx1870earnv.fun http://wap.jx1870conflictv.fun http://3g.jx1870coolv.fun http://3g.jx1870channelv.fun http://wap.jx1870drivev.fun http://m.jx1870djv.fun http://3g.jx1870circlev.fun http://wap.jx1870buttonv.fun http://m.jx1870datev.fun