• 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://wap.hz0j3r9vo.fun http://wap.jx1870hidev.fun http://wap.jx1870landscapev.fun http://jx1870leaguev.fun http://m.jx1870indicatev.fun http://wap.jx1870journeyv.fun http://wap.hz0j0r1vo.fun http://www.jx1870fieldv.fun http://wap.jx1870forwardv.fun http://hz0j3r0vo.fun http://www.hz0j0r2vo.fun http://jx1870landscapev.fun http://www.jx1870gardenv.fun http://wap.jx1870enterv.fun http://www.jx1870helpv.fun http://wap.jx1870helpv.fun http://www.jx1870functionv.fun http://m.jx1870initialv.fun