• 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 }
    相关文章
    相关标签/搜索
    三码必中?一免费∧ 宣汉县| 读书| 霍城县| 兴和县| 绥芬河市| 嫩江县| 济阳县| 上饶市| 泊头市| 宁夏| 德庆县| 和政县| 独山县| 行唐县| 淮北市| 随州市| 盐城市| 石泉县| 尼玛县| 林甸县| 江油市| 通辽市| 辽宁省| 阆中市| 五原县| 水城县| 栾城县| 宣武区| 白河县| 洱源县| 兴文县| 安塞县| 垦利县| 榆社县| 苗栗市| 南平市| 潍坊市| 桓仁| 浦城县| 金堂县| 珠海市| 深圳市| 邵东县| 建瓯市| 沙河市| 广河县| 奉新县| 宜丰县| 锡林浩特市| 武义县| 突泉县| 射洪县| 根河市| 丹江口市| 朝阳县| 谢通门县| 逊克县| 东城区| 临夏市| 万宁市| 临湘市| 新安县| 调兵山市| 芜湖市| 咸丰县| 西乌| 永顺县| 潞城市| 穆棱市| 汉源县| 乌恰县| 彩票| 蒙城县| 洞头县| 襄垣县| 石嘴山市| 鸡泽县| 舟曲县| 申扎县| 虎林市| 鹤壁市| 张家港市| 襄樊市| 阿尔山市| 泰州市| 罗平县| 灵寿县| 五河县| 孙吴县| 九龙城区| 樟树市| 手游| 潼关县| 福鼎市| 桂林市| 城市| 衡山县| 吉隆县| 桦甸市| 汤原县| 进贤县| 农安县| 凯里市| 惠州市| 哈巴河县| 荥阳市| 启东市| 白山市| 页游| 布尔津县| 赞皇县| 郸城县| 新营市| 桐庐县| 全州县| 会理县| 临洮县| 辽中县| 南皮县| 北川| 闽清县| 彭泽县| 文水县| 柞水县| 大荔县| 绥滨县| 镇坪县| 尚志市| 炉霍县| 盐池县| 祁门县| 龙岩市| 化州市| 弥渡县| 沅江市| 伊川县| 耿马| 霞浦县| 博客| 屯留县| 兴仁县| 宁国市| 道真| 元谋县| 承德市| 石渠县| 望都县| 含山县| 璧山县| 时尚| 宣恩县| 修武县| 康平县| 东港市| 镶黄旗| 阿克苏市| 紫金县| 揭东县| 朝阳县| 察隅县| 肥城市| 太保市| 顺昌县| 金川县| 金华市| 边坝县| 普兰县| 定州市| 安福县| 孙吴县| 安吉县| 永和县| 大化| 宿松县| 清水河县| 资溪县| 连城县| 宕昌县| 黄浦区| 梅州市| 武山县| 浙江省| 双牌县| 青海省| 民和| 远安县| 禹城市| 定陶县| 桐庐县| 包头市| 二手房| 大荔县| 巴马| 芜湖市| 馆陶县| 德格县| 吉林省| 泰宁县| 巫山县| 宝鸡市| 新源县| 崇明县| 阿城市| 克拉玛依市| 新余市| 大宁县| 永仁县| 厦门市| 霍城县| 南平市| 湄潭县| 报价| 温宿县| 望都县| 建平县| 额尔古纳市| 安福县| 平乐县| 射洪县| 英德市| 获嘉县| 广德县| 沿河| 新干县| 双城市| 读书| 南涧| 定西市| 松原市| 丰都县| 洛南县| 元谋县| 墨玉县| 洪洞县| 衢州市| 辽中县| 无锡市| 白山市| 彩票| 浦江县| 姜堰市| 沽源县| 天全县| 洛宁县| 泊头市| 年辖:市辖区| 信宜市| 辽中县| 宜章县| 年辖:市辖区| 密云县| 湖州市| 万宁市| 屏山县| 灌阳县| 新野县| 乡城县| 安西县| 三江| 乐清市| 二连浩特市| 二连浩特市| 卓尼县| 禹州市| 三门峡市| 张掖市| 牙克石市| 嘉荫县| 沅江市| 绥阳县| 临夏县| 藁城市| 建平县| 邯郸县| 红河县| 蕉岭县| 眉山市| 微山县| 肥乡县| 上林县| 扎鲁特旗| 青阳县| 色达县| 柏乡县| 明溪县| 东莞市| 遂溪县| 浠水县| 张家界市| 景德镇市| 黑河市| 赤城县| 盐池县| 璧山县| 邵武市| 阿巴嘎旗| 新化县| 抚松县| 喀什市| 衡东县| 手游| 岫岩| 贵德县| 汽车| 仁怀市| 宝鸡市| 武胜县| 桂阳县| 昭通市| 博客| 中方县| 西华县| 垣曲县| 定结县| 桦川县| 龙州县| 新沂市| 山阳县| 南平市| 正宁县| 赣州市| 平昌县| 于田县| 克什克腾旗| 洪江市| 南雄市| 利川市| 潍坊市| 新昌县| 常熟市| 达拉特旗| 茂名市| 阿城市| 巍山| 景东| 合作市| 成武县| 韩城市| 连山| 涿鹿县| 天门市| 苍溪县| 合水县| 江津市| 忻城县| 遂溪县| 雷州市| 汶上县| 阿克陶县| 巨鹿县| 曲水县| 诸暨市| 岑巩县| 新昌县| 马关县| 离岛区| 沂源县| 乐至县| 砚山县| 留坝县| 察雅县| 观塘区| 台中市| 巴青县| 平舆县| 张北县| 西乡县| 中山市| 定州市| 衡东县| 大名县| 毕节市| 华安县| 纳雍县| 长宁区| 五指山市| 个旧市| 巴楚县| 博客| 望谟县| 马关县| 中西区| 凭祥市| 井冈山市| 定兴县| 米脂县| 南昌县| 化隆| 两当县| 徐闻县| 新乐市| 福建省| 永善县| 东丽区| 远安县| 大邑县| 高要市| 弋阳县| 珠海市| 荆门市| 南平市| 肇东市| 北川| 平阴县| 旅游| 建平县| 那坡县| 横峰县| 茶陵县| 宝兴县| 聂荣县| 舟曲县| 贡嘎县| 林芝县| 昌吉市| 民和| 耿马| 德阳市| 宁陵县| 铅山县| 安图县| 容城县| 阿瓦提县| 沂南县| 娱乐| 南安市| 扎兰屯市| 华蓥市| 江城| 若羌县| 右玉县| 玉林市| 夏邑县| 竹北市| 石林| 凤山县| 阳新县| 闽清县| 雅安市| 汝阳县| 饶河县| 阿拉尔市| 凌云县| 漠河县| 子长县| 建始县| 乌兰县| 穆棱市| 桑植县| 尼木县| 定西市| 云霄县| 丰县| 南开区| 北辰区| 崇礼县| 宽甸| 东明县| 界首市| 乌拉特中旗| 西乌| 福州市| 禄劝| 鹤岗市| 彭州市| 兰州市| 咸阳市| 广饶县| 云龙县| 连南| 垫江县| 仁布县| 富宁县| 白河县| 靖西县| 安义县| 沙河市| 桐梓县| 湘阴县| 和平区| 枣阳市| 阜南县| 安龙县| 永定县| 仁怀市| 济南市| 信阳市| 岳阳县| 遵义县| 荃湾区| 竹北市| 井陉县| 施秉县| 万源市| 商水县| 淮北市| 永登县| 会东县| 瓦房店市| 山阳县| 濉溪县| 佛坪县| 文安县| 沈丘县| 丁青县| 类乌齐县| 龙陵县| 新疆| 兰考县| 全州县| 湘阴县| 漠河县| 河东区| 太白县| 绥阳县| 海林市| 华宁县| 连云港市| 肇庆市| 阜城县| 乐安县| 西和县| 同江市| 海丰县| 汉阴县| 营口市| 白山市| 唐河县| 来凤县| 安仁县| 灵宝市| 濉溪县| 东乌珠穆沁旗| 二连浩特市| 建昌县| 贡觉县| 南京市| 唐海县| 亚东县| 上犹县| 六枝特区| 富锦市| 京山县| 兴宁市| 岳池县| 广南县| 永平县| 赤壁市| 阿拉善左旗| 新郑市| 绍兴市| 满城县| 江油市| 平度市| 五指山市| 靖江市| 尼木县| 江山市| 博罗县| 天等县| 五原县| 潮安县| 江孜县| 湄潭县| 绿春县| 思茅市| 南宁市| 舟山市| 盱眙县| 新乐市| 筠连县| 福安市| 武清区| 井研县| 嘉善县| 大关县| 瓦房店市| 都江堰市| 吉木萨尔县| 莱芜市| 绿春县| 南宫市| 乌海市| 夏邑县| 河源市| 石屏县| 吉隆县| 株洲市| 乐平市| 图片| 东源县| 泰顺县| 崇明县| 水富县| 新昌县| 博白县| 包头市| 淮滨县| 建水县| 海盐县| 武冈市| 柳州市| 呈贡县| 田林县| 寻乌县| 清水河县| 湟中县| 墨脱县| 荆门市| 寿阳县| 古浪县| 汉寿县| 邯郸市| 许昌县| 福海县| http://www.hknsxj.fit http://wap.pogjxf.fit http://m.upggzi.fit http://wap.gjtuil.fit http://bcuqut.fit http://m.ccccwa.fit http://m.zokbmz.fit http://wap.iejtdp.fit http://m.ppopor.fit http://wap.mcuwql.fit http://wap.ycyqow.fit http://iiqmnx.fit http://www.bm1961letterz.fit http://m.oocjdx.fit http://wap.innxrt.fit http://m.zpnnck.fit http://wap.kplyri.fit http://m.cleywf.fit