<address id="nd1x7"></address>
        <address id="nd1x7"></address>

              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 }
              相关文章
              相关标签/搜索
              蓝月亮天下彩免费资枓大全年香港最快开奖现场直播,2017跑狗图玄机图,东方心经马报资料2017,一肖一主一码2017,香港马会资料一肖中特1 德令哈市| 洛南县| 伊川县| 石家庄市| 页游| 余庆县| 西吉县| 陵川县| 石景山区| 自治县| 桃园市| 高雄市| 贵定县| 南木林县| 疏附县| 富川| 中江县| 乌拉特中旗| 新巴尔虎右旗| 望都县| 湖州市| 青海省| 怀来县| 平陆县| 准格尔旗| 渑池县| 章丘市| 望都县| 定陶县| 临澧县| 河津市| 潍坊市| 西畴县| 西乌珠穆沁旗| 酉阳| 广德县| 炎陵县| 公安县| 溆浦县| 全南县| 新巴尔虎右旗| 儋州市| 鹤山市| 项城市| 太和县| 奈曼旗| 莱阳市| 简阳市| 离岛区| 台州市| 汝城县| 峨眉山市| 邵阳县| 天峻县| 临沧市| 岳池县| 蓝田县| 米易县| 杭锦旗| 自贡市| 光山县| 清涧县| 军事| 共和县| 苗栗县| 城步| 长丰县| 奉新县| 芜湖县| 兴仁县| 平阴县| 静乐县| 喀喇| 体育| 出国| 杂多县| 昌乐县| 嘉禾县| 巩留县| 北宁市| 仪征市| 莱西市| 永安市| 甘洛县| 南康市| 长兴县| 马边| 万全县| 扶绥县| 青海省| 保康县| 新化县| 东辽县| 邓州市| 灌阳县| 马山县| 余干县| 淅川县| 永康市| 延长县| 天等县| 龙江县| 岐山县| 北安市| 武平县| 渑池县| 芒康县| 湾仔区| 湘西| 长垣县| 偃师市| 舞阳县| 和龙市| 阳高县| 兴仁县| 乐陵市| 随州市| 凤台县| 尼木县| 大庆市| 平舆县| 吴桥县| 揭东县| 沾益县| 黄大仙区| 达州市| 拉孜县| 镇雄县| 公主岭市| 喀什市| 涿州市| 峨眉山市| 伊春市| 双江| 志丹县| 嵩明县| 综艺| 通州市| 鱼台县| 临城县| 金寨县| 济南市| 瑞金市| 巴彦淖尔市| 汝南县| 大荔县| 政和县| 玉田县| 沾益县| 牙克石市| 栖霞市| 苍溪县| 门头沟区| 南平市| 双牌县| 和政县| 康平县| 安吉县| 安国市| 城步| 嵊泗县| 葫芦岛市| 金阳县| 泰兴市| 金川县| 阿拉善左旗| 花莲县| 青岛市| 油尖旺区| 昆山市| 都昌县| 水城县| 夏河县| 上虞市| 临沂市| 依兰县| 西贡区| 云安县| 孝义市| 丹巴县| 响水县| 沾益县| 嘉鱼县| 静海县| 信宜市| 隆子县| 昔阳县| 莱芜市| 黄冈市| 临澧县| 安远县| 万安县| 普兰店市| 葵青区| 龙里县| 阿拉善盟| 岑溪市| 阳高县| 临澧县| 江川县| 石泉县| 景谷| 温宿县| 木里| 商河县| 都昌县| 铜陵市| 涞水县| 鹤庆县| 海宁市| 嘉峪关市| 聊城市| 巴马| 呼图壁县| 原平市| 松溪县| 砚山县| 宁波市| 防城港市| 陆丰市| 扎囊县| 南木林县| 青海省| 剑阁县| 潜山县| 教育| 集贤县| 都兰县| 新兴县| 临漳县| 左贡县| 平谷区| 淄博市| 肇庆市| 礼泉县| 彰化县| 辛集市| 秀山| 襄樊市| 登封市| 东海县| 鄂温| 西丰县| 隆子县| 左云县| 巴东县| 凤翔县| 葫芦岛市| 白朗县| 洮南市| 武鸣县| 岗巴县| 林芝县| 柯坪县| 吉木乃县| 华池县| 平泉县| 南溪县| 图们市| 莱州市| 莫力| 洛隆县| 晋中市| 清新县| 台南县| 宜黄县| 水城县| 中卫市| 太保市| 唐山市| 营口市| 北票市| 轮台县| 武威市| 陆良县| 济宁市| 阿城市| 开江县| 呼和浩特市| 河东区| 昌乐县| 新宾| 灵丘县| 兰溪市| 宁海县| 林口县| 普陀区| 东丰县| 盖州市| 栾城县| 镇安县| 洱源县| 来安县| 达日县| 黄浦区| 万盛区| 迁西县| 桂林市| 保定市| 武夷山市| 涟源市| 和林格尔县| 甘洛县| 定边县| 固阳县| 木里| 京山县| 垦利县| 营口市| 邮箱| 盐津县| 黄山市| 桐梓县| 新巴尔虎右旗| 宕昌县| 丹阳市| 广水市| 平南县| 嘉义市| 历史| 镇远县| 邵阳市| 宜兴市| 抚宁县| 亚东县| 玉山县| 兴隆县| 兴业县| 砀山县| 刚察县| 宝应县| 云霄县| 兴仁县| 安平县| 涡阳县| 纳雍县| 疏附县| 台州市| 通州市| 夏津县| 丰城市| 龙川县| 夹江县| 龙泉市| 老河口市| 土默特右旗| 昂仁县| 鹰潭市| 类乌齐县| 三江| 新疆| 茶陵县| 岳普湖县| 方正县| 涞水县| 盐城市| 西乌| 淮滨县| 容城县| 乐昌市| 佳木斯市| 万宁市| 鄂尔多斯市| 河北区| 静安区| 汝州市| 鄂州市| 昭通市| 黄平县| 文昌市| 洛川县| 木里| 临桂县| 高州市| 富阳市| 长治市| 富源县| 嘉荫县| 尼勒克县| 景德镇市| 邢台市| 灵宝市| 门头沟区| 于都县| 青岛市| 漳平市| 龙泉市| 祁连县| 凌源市| 塔河县| 隆林| 临颍县| 五大连池市| 肇州县| 石渠县| 东光县| 江安县| 古田县| 英吉沙县| 将乐县| 岫岩| 蓬安县| 容城县| 海兴县| 稷山县| 牙克石市| 海伦市| 鹿邑县| 武义县| 英吉沙县| 荆州市| 斗六市| 平南县| 武强县| 方城县| 天峻县| 鹤壁市| 绥德县| 铁岭县| 绩溪县| 巨野县| 喜德县| 兴文县| 靖边县| 陆丰市| 株洲市| 三门峡市| 胶南市| 绍兴市| 弥勒县| 东阳市| 宾川县| 武邑县| 阜南县| 紫金县| 兴安县| 齐河县| 安化县| 察哈| 亚东县| 宜州市| 康马县| 新安县| 萝北县| 麦盖提县| 揭西县| 罗田县| 山东| 射阳县| 库车县| 丹江口市| 富源县| 芒康县| 萨嘎县| 体育| 武胜县| 桂东县| 红安县| 长汀县| 卓资县| 靖远县| 达州市| 上林县| 久治县| 舞钢市| 沙湾县| 大石桥市| 鹤山市| 喀什市| 酉阳| 抚宁县| 阿尔山市| 德化县| 海阳市| 汝阳县| 翁源县| 玉林市| 宁乡县| 鄂尔多斯市| 枣强县| 辉县市| 彰武县| 驻马店市| 澜沧| 新疆| 周口市| 资中县| 两当县| 冀州市| 沙田区| 平安县| 山东| 炎陵县| 东乡县| 商河县| 天气| 沈丘县| 岢岚县| 离岛区| 商丘市| 宣武区| 扎鲁特旗| 涟源市| 昌江| 武夷山市| 永丰县| 海门市| 济南市| 扶绥县| 临邑县| 天长市| 汾西县| 都江堰市| 响水县| 岳池县| 肇州县| 昌吉市| 勃利县| 海口市| 榆中县| 黄山市| 长兴县| 慈利县| 通山县| 随州市| 唐河县| 栾川县| 石台县| 宁国市| 兴和县| 富川| 津市市| 阿荣旗| 开阳县| 徐汇区| 北碚区| 张家川| 平和县| 拉萨市| 阜平县| 上犹县| 株洲县| 黔江区| 丹巴县| 蕉岭县| 烟台市| 信阳市| 万荣县| 清水县| 湘乡市| 大城县| 乡城县| 厦门市| 叙永县| 弥勒县| 隆德县| 博兴县| 泸定县| 岐山县| 聂荣县| 台东市| 乐亭县| 秦皇岛市| 石家庄市| 小金县| 宁南县| 郓城县| 舟曲县| 六安市| 琼结县| 长春市| 惠来县| 安达市| 信阳市| 洛宁县| 宁安市| 山东| 滕州市| 诸城市| 买车| 敦煌市| 怀集县| 吐鲁番市| 成安县| 石首市| 枣强县| 东平县| 朝阳市| 朝阳县| 白玉县| 铅山县| 巴里| 淄博市| 松潘县| 镶黄旗| 安福县| 冕宁县| 三穗县| 沧源| 山西省| 霍州市| 武安市| 读书| 格尔木市| 神木县| 大渡口区| 淅川县| 太保市| 保靖县| 望江县| 彭阳县| 钟山县| 新宾| 亳州市| 南充市| http://wap.hkxent.fit http://www.xfwdza.fit http://kuyspu.fit http://m.whtsdw.fit http://m.egqjqt.fit http://wap.bm1961noticez.fit http://www.ocnjmw.fit http://www.sklnrf.fit http://wap.bm1961likez.fit http://wap.wmruyz.fit http://hvcbff.fit http://www.ysfwpe.fit http://www.hunyaf.fit http://m.ppjcjm.fit http://www.jlvbse.fit http://wap.acbvni.fit http://m.tnwxiv.fit http://m.dwwtmh.fit