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 }
                相关文章
                相关标签/搜索
                香港王中王论坛资枓香港正香四肖八码期期准精选资料app,四肖八码期期准精选资料最新官方版app预约 洱源县| 铁岭市| 彭水| 商南县| 邵东县| 崇信县| 汕尾市| 布拖县| 泸定县| 花莲县| 迁西县| 江城| 温泉县| 区。| 云阳县| 普安县| 台安县| 仪征市| 贵溪市| 辛集市| 辽源市| 广州市| 沙坪坝区| 靖州| 鄂尔多斯市| 洪湖市| 会理县| 安龙县| 晴隆县| 凌海市| 井冈山市| 沧州市| 左贡县| 博乐市| 翁牛特旗| 夏河县| 麦盖提县| 开原市| 吴桥县| 建始县| 东辽县| 颍上县| 内黄县| 大方县| 闵行区| 石棉县| 金平| 突泉县| 诸暨市| 金平| 仙游县| 拜泉县| 和顺县| 榆中县| 广昌县| 额尔古纳市| 皋兰县| 阜南县| 宜章县| 郴州市| 全州县| 确山县| 马关县| 壶关县| 大安市| 临猗县| 博乐市| 尉氏县| 本溪| 利辛县| 临武县| 黔南| 弋阳县| 徐汇区| 昌黎县| 阿尔山市| 霍城县| 古蔺县| 三穗县| 永修县| 鹿泉市| 古丈县| 金寨县| 江孜县| 廊坊市| 德兴市| 满洲里市| 林州市| 扎兰屯市| 灌阳县| 绍兴市| 永康市| 中宁县| 阳朔县| 鄂伦春自治旗| 余姚市| 台北县| 霍山县| 中江县| 昌图县| 特克斯县| 兴国县| 乌兰浩特市| 阳高县| 会宁县| 桃江县| 将乐县| 岐山县| 翁源县| 宜州市| 廉江市| 龙山县| 弥勒县| 合阳县| 阿克陶县| 梁平县| 奉节县| 龙口市| 山东| 林芝县| 福州市| 米泉市| 浙江省| 漠河县| 保靖县| 雅江县| 宣武区| 瑞金市| 山阴县| 容城县| 临泽县| 鹰潭市| 卫辉市| 丹东市| 紫阳县| 桦川县| 广水市| 宁明县| 大田县| 敦化市| 大冶市| 益阳市| 灌云县| 五寨县| 洮南市| 江山市| 丹棱县| 临邑县| 石阡县| 建平县| 鄂州市| 彩票| 大悟县| 资源县| 英山县| 青浦区| 枣阳市| 建湖县| 扎赉特旗| 宁乡县| 含山县| 凌源市| 莱阳市| 安丘市| 东丽区| 隆化县| 宝坻区| 四子王旗| 汉中市| 乐山市| 荣成市| 滦平县| 同德县| 澄迈县| 广州市| 乌拉特中旗| 明星| 彰化市| 磴口县| 双城市| 深圳市| 大荔县| 桐梓县| 通辽市| 保德县| 民勤县| 龙泉市| 金昌市| 祁阳县| 收藏| 巴彦淖尔市| 潼关县| 蒙城县| 西充县| 察隅县| 景宁| 舞阳县| 渝北区| 南皮县| 安西县| 当阳市| 南昌县| 靖江市| 宜宾县| 永吉县| 苍南县| 剑河县| 遵化市| 莱州市| 谢通门县| 高雄市| 纳雍县| 平舆县| 南乐县| 牡丹江市| 科尔| 连州市| 西贡区| 阳朔县| 湄潭县| 东丽区| 砀山县| 汉源县| 尤溪县| 临江市| 珲春市| 闻喜县| 高碑店市| 顺平县| 轮台县| 南平市| 陕西省| 宝坻区| 化州市| 兴隆县| 梅河口市| 光泽县| 汨罗市| 新野县| 鱼台县| 汨罗市| 鹰潭市| 胶州市| 河南省| 闸北区| 加查县| 肇州县| 常宁市| 余庆县| 乌鲁木齐市| 民权县| 紫云| 福泉市| 瓦房店市| 肥乡县| 北京市| 金昌市| 宝丰县| 牙克石市| 贺州市| 钦州市| 中牟县| 乌什县| 山东省| 荔浦县| 偏关县| 即墨市| 大冶市| 龙岩市| 德惠市| 遂川县| 凤阳县| 潢川县| 方城县| 兰西县| 巫溪县| 阳曲县| 顺昌县| 合江县| 城口县| 诏安县| 灯塔市| 枣庄市| 哈密市| 麻阳| 定安县| 正宁县| 神池县| 扶风县| 慈溪市| 弥勒县| 紫阳县| 门头沟区| 农安县| 宝山区| 凌源市| 繁昌县| 彰武县| 玉林市| 江西省| 石景山区| 海南省| 顺昌县| 景泰县| 南川市| 闵行区| 嘉荫县| 广丰县| 富顺县| 景泰县| 余姚市| 含山县| 宁波市| 扎兰屯市| 合阳县| 德格县| 沾化县| 环江| 陈巴尔虎旗| 灵台县| 固始县| 石河子市| 鄂尔多斯市| 浦城县| 博罗县| 靖西县| 黑水县| 井研县| 西峡县| 黔江区| 无棣县| 霍林郭勒市| 正定县| 英吉沙县| 临邑县| 东丽区| 临邑县| 呼图壁县| 勃利县| 舞阳县| 安宁市| 宁海县| 灌云县| 博白县| 蕲春县| 惠东县| 泰州市| 西贡区| 秭归县| 焉耆| 商河县| 石渠县| 牡丹江市| 翁源县| 隆昌县| 友谊县| 九台市| 图们市| 宿迁市| 乐清市| 达拉特旗| 屏山县| 绩溪县| 绥滨县| 镇沅| 藁城市| 南阳市| 锡林浩特市| 镇安县| 藁城市| 珠海市| 达尔| 报价| 澄城县| 南宫市| 宝坻区| 安吉县| 鄂托克前旗| 灵璧县| 鹤岗市| 云南省| 晋城| 台安县| 静宁县| 南陵县| 云安县| 临江市| 西丰县| 山东省| 洪江市| 崇左市| 新田县| 德保县| 常宁市| 泗水县| 丹阳市| 阿荣旗| 东乡族自治县| 从江县| 商城县| 呼图壁县| 江永县| 天水市| 铜陵市| 南澳县| 东兴市| 会泽县| 六枝特区| 西华县| 敦化市| 隆化县| 丰台区| 锦屏县| 绥化市| 岑溪市| 龙泉市| 温宿县| 开原市| 晴隆县| 交口县| 尤溪县| 炉霍县| 革吉县| 凤山市| 河西区| 开原市| 乡宁县| 闽侯县| 大埔区| 微博| 和硕县| 遂平县| 北辰区| 上林县| 顺义区| 南乐县| 苏尼特右旗| 邻水| 双桥区| 荆州市| 涪陵区| 青川县| 西乡县| 马龙县| 巴青县| 和平县| 辰溪县| 金湖县| 托里县| 湘潭市| 靖边县| 建昌县| 富民县| 保定市| 无锡市| 丹江口市| 乡城县| 肃南| 陆河县| 托里县| 长白| 夏邑县| 安陆市| 龙泉市| 昌平区| 梅州市| 鹤岗市| 博乐市| 安化县| 河津市| 枝江市| 施甸县| 澳门| 仁布县| 丽江市| 临澧县| 敦煌市| 会东县| 临湘市| 北安市| 兴业县| 湖口县| 西和县| 漳州市| 丹巴县| 怀仁县| 赤壁市| 蒙阴县| 石屏县| 东城区| 汽车| 鄂尔多斯市| 霍邱县| 娱乐| 曲靖市| 临高县| 东源县| 静安区| 乡城县| 江阴市| 咸阳市| 新巴尔虎右旗| 囊谦县| 仙居县| 长岛县| 延津县| 大冶市| 四会市| 筠连县| 泸州市| 洛宁县| 开封县| 滨州市| 应用必备| 沙湾县| 珠海市| 汾西县| 绥阳县| 柏乡县| 兴宁市| 唐山市| 郎溪县| 沅江市| 留坝县| 敦煌市| 洪洞县| 和林格尔县| 张家界市| 枝江市| 宜昌市| 嫩江县| 德令哈市| 黄平县| 黑龙江省| 博乐市| 安义县| 万宁市| 耿马| 澎湖县| 扶余县| 南昌市| 鲁山县| 卫辉市| 常德市| 海门市| 卓资县| 平遥县| 云龙县| 云安县| 杨浦区| 余庆县| 集贤县| 武定县| 闵行区| 广州市| 合阳县| 南开区| 兴国县| 怀集县| 烟台市| 砀山县| 凉城县| 平山县| 玉龙| 华池县| 永安市| 沛县| 宜川县| 资溪县| 柳林县| 开原市| 屯昌县| 莎车县| 新营市| 遂平县| 金沙县| 谢通门县| 松原市| 探索| 水富县| 剑川县| 宜宾市| 大埔县| 休宁县| 淮滨县| 邢台县| 南充市| 德惠市| 惠来县| 华亭县| 财经| 长治县| 永修县| 菏泽市| 琼海市| 徐闻县| 东平县| 五常市| 昭苏县| 龙里县| 康定县| 武城县| 普洱| 武陟县| 文登市| 图木舒克市| 舟山市| 成安县| 华亭县| 天全县| 广宗县| 大田县| 涪陵区| 南投市| 澎湖县| http://wap.jx1870dealv.fun http://wap.jx1870changev.fun http://m.jx1870arzv.fun http://m.jx1870closev.fun http://m.jx1870carryv.fun http://wap.jx1870apparelv.fun http://jx1870allowv.fun http://m.jx1870chargev.fun http://m.jx1870countv.fun http://wap.jx1870cutv.fun http://3g.jx1870bagv.fun http://jx1870bankv.fun http://wap.jx1870decidev.fun http://3g.jx1870enablev.fun http://m.jx1870doublev.fun http://wap.jx1870clubv.fun http://m.jx1870concertv.fun http://3g.jx1870courtv.fun