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 }
              相关文章
              相关标签/搜索
              香港蓝月亮精选免费资料大全管家婆王中王鉄算盘开奖结果2019开奖记录结果查询香港马会开奖结果历史纪录在线查询 无锡市| 包头市| 公主岭市| 平顶山市| 柳林县| 六枝特区| 浦北县| 左云县| 保靖县| 麟游县| 磐石市| 双江| 武平县| 孟连| 大渡口区| 绵阳市| 正蓝旗| 晋中市| 晴隆县| 印江| 治县。| 乳源| 黔西县| 台北市| 平定县| 乌兰县| 昭觉县| 广昌县| 额尔古纳市| 大丰市| 务川| 奉节县| 涿鹿县| 明光市| 尉氏县| 深圳市| 英吉沙县| 霍州市| 梅河口市| 改则县| 尼木县| 吉安市| 莲花县| 安国市| 巴里| 闽侯县| 裕民县| 潜山县| 宜都市| 桃江县| 惠水县| 保德县| 柳林县| 绥芬河市| 汕尾市| 铁岭市| 万全县| 晋州市| 泽普县| 潍坊市| 新平| 花垣县| 普兰店市| 固安县| 嘉荫县| 长泰县| 阳春市| 元阳县| 通海县| 合水县| 塔城市| 晴隆县| 霞浦县| 平泉县| 福泉市| 松阳县| 股票| 札达县| 玉田县| 句容市| 长乐市| 岗巴县| 盐山县| 葫芦岛市| 淄博市| 上虞市| 凌海市| 宝鸡市| 新建县| 大埔区| 新密市| 儋州市| 安顺市| 南丰县| 韩城市| 扶风县| 清原| 陵川县| 桃园县| 盐池县| 黄龙县| 遂宁市| 新干县| 留坝县| 宜都市| 专栏| 波密县| 汪清县| 汉川市| 中山市| 扎鲁特旗| 三原县| 麦盖提县| 安化县| 金阳县| 永胜县| 揭西县| 宁津县| 安康市| 莒南县| 南皮县| 蓬莱市| 攀枝花市| 天长市| 镇原县| 太原市| 大庆市| 淳安县| 望奎县| 汾阳市| 景谷| 台湾省| 兴仁县| 九江县| 辽宁省| 德江县| 黄浦区| 桑日县| 庆城县| 安泽县| 兴宁市| 广元市| 南涧| 额尔古纳市| 彰武县| 普洱| 民和| 那曲县| 个旧市| 靖江市| 扎赉特旗| 永川市| 龙游县| 德昌县| 观塘区| 公主岭市| 承德市| 英山县| 大新县| 隆回县| 商丘市| 科尔| 土默特右旗| 漳州市| 财经| 普兰店市| 监利县| 宜兰市| 平武县| 比如县| 昭苏县| 额尔古纳市| 慈利县| 揭阳市| 博乐市| 宁蒗| 凤城市| 富民县| 清丰县| 长汀县| 乌拉特中旗| 建德市| 兴隆县| 台山市| 古交市| 绵竹市| 如东县| 凤凰县| 镇远县| 阿合奇县| 迭部县| 西乌| 紫金县| 随州市| 扎囊县| 金阳县| 凤凰县| 安国市| 仁化县| 梅河口市| 随州市| 伊吾县| 三河市| 胶州市| 汝州市| 隆德县| 阳原县| 上犹县| 常山县| 阿巴嘎旗| 康定县| 诸城市| 新干县| 漯河市| 乌拉特前旗| 海林市| 福海县| 泰来县| 固镇县| 邵武市| 平潭县| 克东县| 衢州市| 阜宁县| 北辰区| 高雄市| 丘北县| 清镇市| 大邑县| 浑源县| 巫溪县| 安国市| 虞城县| 科技| 柯坪县| 介休市| 集贤县| 土默特右旗| 从化市| 老河口市| 德钦县| 萨迦县| 确山县| 建昌县| 丘北县| 四会市| 吉林省| 台山市| 昭苏县| 肇源县| 南昌县| 泰和县| 恩平市| 霍城县| 大同市| 高淳县| 北票市| 铜山县| 姜堰市| 永济市| 尼玛县| 彭山县| 双辽市| 百色市| 山东省| 五大连池市| 本溪| 武安市| 苏尼特右旗| 攀枝花市| 当阳市| 资中县| 广西| 横峰县| 榆树市| 酒泉市| 云阳县| 余姚市| 四子王旗| 民权县| 石景山区| 安图县| 广丰县| 开江县| 中宁县| 桃园市| 长白| 松滋市| 察雅县| 都兰县| 富源县| 东安县| 普陀区| 铜川市| 嘉善县| 天峻县| 上饶县| 靖边县| 忻州市| 昌邑市| 淳化县| 黄大仙区| 新晃| 华坪县| 定西市| 綦江县| 汤原县| 延寿县| 门头沟区| 东源县| 英山县| 汪清县| 绿春县| 和林格尔县| 广水市| 吉木乃县| 朝阳市| 微山县| 大悟县| 辉县市| 武平县| 镶黄旗| 竹北市| 桂阳县| 巴林右旗| 平乐县| 乌拉特前旗| 乌什县| 新沂市| 淳化县| 湖南省| 柞水县| 临猗县| 上虞市| 临沭县| 双峰县| 信宜市| 岑溪市| 沅江市| 沅陵县| 南康市| 亳州市| 清徐县| 聂拉木县| 北海市| 阳泉市| 洛川县| 衡东县| 瑞丽市| 罗平县| 繁峙县| 哈尔滨市| 西乌珠穆沁旗| 库伦旗| 化德县| 昌图县| 苗栗市| 鄯善县| 南充市| 阜阳市| 镇安县| 嘉祥县| 靖远县| 廉江市| 玉树县| 杨浦区| 平顶山市| 金阳县| 连山| 精河县| 台中县| 象山县| 房产| 衡阳县| 宜城市| 太原市| 陕西省| 东源县| 榆社县| 潼关县| 连江县| 彭山县| 德钦县| 湘西| 三亚市| 班玛县| 邳州市| 孟村| 常山县| 兴城市| 忻州市| 板桥市| 荣昌县| 清流县| 墨江| 登封市| 宝坻区| 吉安市| 哈巴河县| 浮山县| 工布江达县| 仪征市| 沙洋县| 社旗县| 仙桃市| 沅江市| 安阳县| 通州市| 香河县| 巨鹿县| 商洛市| 宁远县| 嫩江县| 曲水县| 鄂尔多斯市| 咸阳市| 岫岩| 海晏县| 娄烦县| 葫芦岛市| 科技| 泾川县| 洛南县| 大方县| 苍溪县| 宣城市| 高州市| 朔州市| 华蓥市| 赞皇县| 万安县| 沙湾县| 邹城市| 共和县| 扎兰屯市| 鄱阳县| 平武县| 墨竹工卡县| 嫩江县| 诏安县| 阿城市| 和平区| 兴仁县| 巩义市| 原平市| 嘉禾县| 吴桥县| 深圳市| 龙陵县| 涞源县| 凤台县| 兴业县| 青龙| 红原县| 兴仁县| 竹北市| 宕昌县| 墨玉县| 玉溪市| 贺兰县| 鹤山市| 拜泉县| 博湖县| 漳浦县| 阿瓦提县| 东乡县| 固始县| 瓮安县| 阿鲁科尔沁旗| 水城县| 大名县| 河曲县| 扎兰屯市| 安国市| 叶城县| 西藏| 辉县市| 华安县| 桃园县| 丹江口市| 成安县| 岳普湖县| 三门峡市| 开江县| 芷江| 疏勒县| 安新县| 普兰店市| 凉城县| 昌平区| 卓资县| 民乐县| 禄丰县| 潮安县| 青州市| 清河县| 且末县| 栖霞市| 喀什市| 修水县| 宣汉县| 屏东县| 土默特左旗| 揭西县| 双峰县| 遂宁市| 太和县| 阿鲁科尔沁旗| 五大连池市| 常山县| 莱阳市| 井陉县| 绥阳县| 泰兴市| 西宁市| 闽清县| 东乌| 庆阳市| 顺义区| 寿宁县| 平昌县| 子长县| 莎车县| 城市| 肃南| 五家渠市| 重庆市| 沅陵县| 莲花县| 时尚| 平武县| 盐城市| 镇坪县| 偃师市| 辛集市| 临颍县| 大姚县| 海淀区| 鹤岗市| 武平县| 汉寿县| 泸溪县| 文登市| 新昌县| 吉隆县| 清新县| 宁都县| 四子王旗| 碌曲县| 武城县| 若羌县| 巴彦淖尔市| 瓦房店市| 姚安县| 包头市| 吉安县| 清新县| 聂拉木县| 定兴县| 临猗县| 衡水市| 咸阳市| 台山市| 盱眙县| 凤阳县| 游戏| 桓台县| 新源县| 玉山县| 会理县| 大名县| 彰武县| 鄢陵县| 革吉县| 广河县| 祁连县| 绥德县| 比如县| 营口市| 永清县| 太原市| 清徐县| 乐山市| 获嘉县| 塘沽区| 商城县| 禄劝| 扎鲁特旗| 内乡县| 察雅县| 德令哈市| 平潭县| 福建省| 遂宁市| 方城县| 平塘县| 清丰县| 五河县| 三河市| 花莲县| 壤塘县| 鄂托克旗| 内黄县| 财经| 临海市| 乐山市| 大兴区| 岢岚县| 上杭县| 江永县| 武宁县| 瑞安市| 逊克县| 平罗县| 康乐县| http://wap.bm1961xarz.fit http://www.kfhsox.fit http://tmhrcj.fit http://www.uyxjza.fit http://www.vpufvt.fit http://m.dnwhsv.fit http://m.tdbkvq.fit http://wap.weymya.fit http://wap.lcubfq.fit http://jbtywy.fit http://wap.upjiob.fit http://pevlpu.fit http://m.owvtgd.fit http://wap.tcgbrq.fit http://m.mgfcoe.fit http://wap.udrvqq.fit http://wap.camagy.fit http://ctktnx.fit