<sub id="fhvtr"></sub><sub id="fhvtr"></sub>

      <address id="fhvtr"></address>

              <sub id="fhvtr"></sub>

                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年香港开奖结果2018年香港六合马会开奖结果现场直播开奖历史资料记录在线查询网 醴陵市| 合肥市| 深州市| 酉阳| 江城| 中卫市| 吕梁市| 张北县| 无棣县| 濮阳县| 丰顺县| 德州市| 兖州市| 揭东县| 明水县| 宾川县| 呼和浩特市| 革吉县| 铅山县| 扎囊县| 伊宁市| 定结县| 尼勒克县| 屏南县| 许昌县| 偏关县| 余庆县| 托克托县| 太原市| 南召县| 准格尔旗| 渭南市| 神木县| 忻州市| 石河子市| 德保县| 资阳市| 潼南县| 淳安县| 循化| 乌拉特中旗| 上蔡县| 饶河县| 仁布县| 若羌县| 错那县| 四子王旗| 喀喇| 天门市| 永清县| 浠水县| 攀枝花市| 五大连池市| 东山县| 平潭县| 锡林郭勒盟| 潢川县| 衡南县| 定西市| 华安县| 当阳市| 荔波县| 开原市| 长垣县| 偃师市| 来凤县| 诏安县| 吉林省| 高尔夫| 蒲城县| 即墨市| 清徐县| 广州市| 大埔区| 南昌市| 武安市| 增城市| 甘肃省| 珲春市| 江永县| 龙胜| 友谊县| 榆社县| 武邑县| 泸水县| 亳州市| 巨鹿县| 屯门区| 闽清县| 高雄县| 海门市| 西安市| 哈尔滨市| 兴隆县| 文安县| 大同县| 泽州县| 彰武县| 临潭县| 井冈山市| 林芝县| 辉县市| 焉耆| 宁南县| 兴安盟| 田阳县| 通辽市| 六安市| 工布江达县| 神池县| 汉沽区| 大田县| 莱州市| 兴安盟| 文化| 青浦区| 苗栗市| 合川市| 诸城市| 特克斯县| 囊谦县| 司法| 永顺县| 琼结县| 刚察县| 巧家县| 田林县| 阳朔县| 民权县| 广宗县| 双牌县| 朝阳县| 剑川县| 无锡市| 洛隆县| 鹤岗市| 龙海市| 武穴市| 永兴县| 米林县| 同德县| 新晃| 新龙县| 万安县| 丽水市| 尚义县| 龙陵县| 遂昌县| 沙坪坝区| 绥德县| 泰兴市| 桐柏县| 儋州市| 太保市| 体育| 南丹县| 班戈县| 二连浩特市| 溧水县| 吴桥县| 雷山县| 济宁市| 临安市| 锡林郭勒盟| 手机| 锡林浩特市| 玛沁县| 阿鲁科尔沁旗| 金寨县| 建宁县| 修水县| 宁化县| 苍南县| 苍南县| 鸡西市| 张家口市| 东平县| 读书| 基隆市| 南靖县| 赤水市| 长子县| 镇雄县| 盐山县| 敦化市| 旺苍县| 砚山县| 景泰县| 宣武区| 杭锦后旗| 鄂托克前旗| 兰西县| 彩票| 柳河县| 砚山县| 黄浦区| 文昌市| 海原县| 如东县| 武鸣县| 孙吴县| 封丘县| 长汀县| 临城县| 望谟县| 宜州市| 竹山县| 东海县| 吴忠市| 广宁县| 舒兰市| 宝坻区| 蓝山县| 海盐县| 广安市| 肥乡县| 上杭县| 弥勒县| 重庆市| 嘉义县| 文化| 洛南县| 吴旗县| 白朗县| 泸州市| 衡南县| 彩票| 遂昌县| 策勒县| 夹江县| 繁峙县| 武义县| 应城市| 台南市| 顺平县| 西乌珠穆沁旗| 安徽省| 山东省| 正镶白旗| 中卫市| 桂阳县| 舒城县| 读书| 兰西县| 雅江县| 洪泽县| 资阳市| 河曲县| 古丈县| 八宿县| 温宿县| 休宁县| 沧州市| 奉贤区| 海安县| 乌兰察布市| 长汀县| 定兴县| 璧山县| 德庆县| 乌鲁木齐县| 洪江市| 五峰| 南充市| 门源| 延长县| 彰化市| 尖扎县| 泾源县| 天祝| 漳州市| 榆树市| 名山县| 拜城县| 南宁市| 乌审旗| 东兴市| 府谷县| 靖宇县| 文登市| 本溪市| 南雄市| 绿春县| 广河县| 加查县| 台江县| 石泉县| 宁河县| 阜康市| 南雄市| 永吉县| 三亚市| 晋州市| 龙门县| 长海县| 牟定县| 库伦旗| 南城县| 广南县| 永济市| 星子县| 沁阳市| 武穴市| 神农架林区| 凤冈县| 永川市| 泰顺县| 东城区| 临桂县| 丰原市| 林州市| 瓦房店市| 潜山县| 岑溪市| 黄平县| 沧州市| 伊吾县| 山丹县| 平利县| 黎平县| 将乐县| 麻栗坡县| 阆中市| 克山县| 和田县| 徐闻县| 台北县| 广饶县| 锡林浩特市| 双桥区| 犍为县| 习水县| 宁南县| 保康县| 连平县| 浏阳市| 建阳市| 北票市| 连山| 始兴县| 扶余县| 和硕县| 邛崃市| 和林格尔县| 定日县| 丰台区| 图们市| 文昌市| 武威市| 韩城市| 道孚县| 广汉市| 云霄县| 永济市| 江川县| 沂南县| 津南区| 安阳县| 库尔勒市| 南川市| 繁昌县| 临沧市| 敖汉旗| 新泰市| 衡山县| 鄢陵县| 贵溪市| 太仆寺旗| 东光县| 吉林省| 巴林右旗| 永仁县| 滕州市| 乳源| 常山县| 灌阳县| 吴江市| 邛崃市| 呼伦贝尔市| 华阴市| 定襄县| 如东县| 讷河市| 宿迁市| 定远县| 望江县| 通化市| 长治市| 皮山县| 仁怀市| 新干县| 甘德县| 卫辉市| 台安县| 梓潼县| 本溪市| 香格里拉县| 镇赉县| 三门峡市| 郁南县| 神木县| 清水河县| 乌什县| 辛集市| 阿坝县| 肇东市| 普定县| 东丰县| 上思县| 长武县| 磴口县| 南澳县| 玉溪市| 靖远县| 九江县| 黄石市| 武定县| 德江县| 息烽县| 肇庆市| 德州市| 铜鼓县| 娄烦县| 绥德县| 吉水县| 溧水县| 湛江市| 隆德县| 长海县| 太康县| 高青县| 古蔺县| 察隅县| 白沙| 雷山县| 永胜县| 正安县| 梓潼县| 霞浦县| 朝阳区| 东源县| 佛学| 金寨县| 赤城县| 滨州市| 三亚市| 台东市| 乌拉特后旗| 竹山县| 新津县| 礼泉县| 西和县| 都兰县| 龙胜| 临泽县| 洱源县| 黔西县| 平邑县| 即墨市| 嘉荫县| 合作市| 阳信县| 乐都县| 福鼎市| 永登县| 稷山县| 千阳县| 岚皋县| 大港区| 白城市| 武城县| 郓城县| 南汇区| 迁安市| 昭通市| 象山县| 台中市| 乌拉特后旗| 塘沽区| 顺昌县| 嘉峪关市| 冕宁县| 同心县| 军事| 三原县| 沙田区| 永康市| 西丰县| 盐城市| 加查县| 汉寿县| 镇江市| 探索| 红河县| 门头沟区| 永善县| 苍南县| 合作市| 高淳县| 三亚市| 娄烦县| 乐亭县| 新巴尔虎左旗| 盈江县| 锡林浩特市| 高淳县| 藁城市| 福贡县| 桃江县| 和顺县| 田阳县| 甘泉县| 即墨市| 铁岭县| 康马县| 凤台县| 彭山县| 昆明市| 修文县| 玉屏| 宣武区| 土默特右旗| 资源县| 柞水县| 黄平县| 六枝特区| 普格县| 修水县| 保定市| 旬阳县| 武汉市| 哈巴河县| 项城市| 高雄市| 洪泽县| 增城市| 蒙自县| 兰州市| 无为县| 仙桃市| 惠州市| 和龙市| 观塘区| 拉萨市| 万州区| 乾安县| 唐山市| 绵竹市| 黔东| 新建县| 老河口市| 奇台县| 宜春市| 喜德县| 略阳县| 文昌市| 腾冲县| 赤水市| 澜沧| 普定县| 淮北市| 丰原市| 内江市| 葫芦岛市| 罗江县| 尚志市| 广南县| 体育| 辽宁省| 沅江市| 修文县| 蒲城县| 康定县| 湟中县| 应用必备| 阜平县| 太谷县| 霍城县| 株洲市| 五原县| 通海县| 新巴尔虎右旗| 介休市| 西畴县| 上犹县| 平昌县| 昌图县| 佛山市| 兴仁县| 道真| 精河县| 军事| 济宁市| 临湘市| 九寨沟县| 大邑县| 沁阳市| 木兰县| 吉隆县| 姜堰市| 旅游| 松阳县| 左贡县| 临江市| 江西省| 达州市| 湟中县| 朔州市| 灵川县| 沈丘县| 惠州市| 定结县| 嘉禾县| 溧水县| 壤塘县| http://m.hhaicy.fit http://thmfwu.fit http://m.ziqavx.fit http://m.tvtawp.fit http://wap.wogabo.fit http://www.ebsoex.fit http://www.kkezmq.fit http://m.jpebnx.fit http://www.armmfb.fit http://m.kuyspu.fit http://www.gqkhzn.fit http://www.zgandi.fit http://www.pevlpu.fit http://www.qmjrct.fit http://www.iavffc.fit http://m.bm1961letz.fit http://www.khowgx.fit http://m.bm1961loadz.fit