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 }
            相关文章
            相关标签/搜索
            王中王鉄算好开奖结果四肖期期准铁算盘4887开奖结果四肖三期内必出刘伯温6374cm刘伯温168最快开奖现场开马开奖结果 汽车| 崇阳县| 澳门| 微博| 沾益县| 祥云县| 滦平县| 桂平市| 花莲市| 湖州市| 萍乡市| 冷水江市| 获嘉县| 随州市| 邓州市| 广宗县| 大埔县| 沿河| 新营市| 利川市| 东兰县| 澄迈县| 阿克| 黄平县| 九台市| 安化县| 长垣县| 双江| 荥阳市| 丘北县| 天台县| 东兴市| 承德县| 桓仁| 金堂县| 汝州市| 承德市| 柏乡县| 梁山县| 翁牛特旗| 寿宁县| 明水县| 策勒县| 蒙山县| 庄河市| 阜阳市| 友谊县| 永嘉县| 明光市| 龙川县| 宣城市| 万荣县| 大英县| 云和县| 吉安市| 黄骅市| 剑河县| 五原县| 嘉黎县| 甘泉县| 漳平市| 南召县| 商水县| 祁阳县| 梁河县| 山东省| 阜新| 延津县| 密云县| 冷水江市| 枝江市| 阿勒泰市| 淳化县| 汪清县| 翼城县| 侯马市| 曲沃县| 东乌珠穆沁旗| 金塔县| 始兴县| 宣恩县| 杭锦后旗| 乌拉特前旗| 翼城县| 和政县| 怀仁县| 竹溪县| 枞阳县| 会东县| 临高县| 茂名市| 通山县| 翼城县| 个旧市| 临清市| 赤峰市| 梓潼县| 柯坪县| 丽水市| 九龙县| 邓州市| 贵定县| 古蔺县| 德化县| 和林格尔县| 汪清县| 阿荣旗| 保靖县| 大丰市| 澄江县| 蒙城县| 大冶市| 育儿| 保靖县| 青河县| 承德县| 曲阜市| 稻城县| 乐清市| 介休市| 香格里拉县| 青神县| 涟源市| 玉田县| 仲巴县| 尼玛县| 凉山| 潢川县| 蒲江县| 玉溪市| 沾益县| 丁青县| 揭阳市| 瑞昌市| 双城市| 伊金霍洛旗| 搜索| 平南县| 海淀区| 鄂州市| 乳源| 浑源县| 蒙城县| 涞水县| 延吉市| 宜兰市| 蓝山县| 阳泉市| 托克托县| 乐山市| 文水县| 丹棱县| 凤庆县| 武宣县| 镇巴县| 邮箱| 安吉县| 南宫市| 阿拉善左旗| 平果县| 涡阳县| 临西县| 韶关市| 普兰店市| 镇康县| 曲阳县| 夹江县| 迭部县| 武安市| 桂阳县| 大城县| 永定县| 枣庄市| 麻城市| 舒兰市| 舒兰市| 海南省| 应用必备| 屏南县| 奎屯市| 南城县| 德昌县| 扎兰屯市| 车险| 长葛市| 甘德县| 石河子市| 富顺县| 乳山市| 和静县| 得荣县| 邮箱| 平顺县| 汶川县| 太和县| 五家渠市| 平安县| 论坛| 靖远县| 克拉玛依市| 辉南县| 灵寿县| 山东省| 郸城县| 东光县| 保定市| 同德县| 赣榆县| 沾益县| 交口县| 西昌市| 隆子县| 阜新市| 沂源县| 衡阳县| 常宁市| 富民县| 大埔县| 泸溪县| 吉水县| 淅川县| 阿拉善右旗| 宜兰县| 合江县| 东至县| 攀枝花市| 策勒县| 博客| 瑞安市| 南靖县| 永康市| 明星| 祁东县| 鄄城县| 朝阳区| 武胜县| 白山市| 连平县| 河西区| 祁阳县| 区。| 宁明县| 洛川县| 弥渡县| 类乌齐县| 象州县| 兴业县| 舒兰市| 葵青区| 漳州市| 杨浦区| 城固县| 兴城市| 昆山市| 从江县| 仁布县| 中卫市| 乡宁县| 乡宁县| 阿拉善左旗| 盈江县| 靖西县| 辽中县| 云阳县| 江阴市| 楚雄市| 婺源县| 尼勒克县| 沁水县| 溆浦县| 那曲县| 读书| 宜丰县| 汉川市| 颍上县| 灵石县| 中卫市| 沙洋县| 敦化市| 剑河县| 营口市| 睢宁县| 东乌| 通渭县| 阜新| 来凤县| 霍城县| 寻甸| 开封县| 内乡县| 福建省| 龙游县| 晋中市| 织金县| 建宁县| 九龙坡区| 临洮县| 乌兰浩特市| 丰原市| 铁力市| 蓬溪县| 泊头市| 台安县| 东至县| 清水河县| 武宣县| 江都市| 西城区| 新郑市| 林甸县| 凤冈县| 辽宁省| 上犹县| 武冈市| 洛阳市| 衡山县| 潮安县| 理塘县| 营山县| 新宁县| 临海市| 太仆寺旗| 南溪县| 东光县| 米脂县| 光泽县| 库车县| 襄汾县| 三门峡市| 浏阳市| 清涧县| 股票| 陆丰市| 垫江县| 普宁市| 天柱县| 连州市| 安庆市| 尉氏县| 四子王旗| 广州市| 千阳县| 昆山市| 白朗县| 米脂县| 繁峙县| 乌拉特中旗| 郑州市| 竹溪县| 岳西县| 汤原县| 昌平区| 手机| 穆棱市| 内丘县| 桑日县| 永川市| 杭锦旗| 夏津县| 曲松县| 乌拉特后旗| 剑河县| 星座| 马山县| 瑞丽市| 德昌县| 邛崃市| 高唐县| 奉化市| 元氏县| 景洪市| 巨鹿县| 三穗县| 利辛县| 米林县| 淳安县| 临高县| 宜兴市| 宜阳县| 上虞市| 苏尼特右旗| 宁乡县| 诸城市| 元氏县| 固原市| 松溪县| 元谋县| 普兰店市| 南川市| 宁强县| 石狮市| 陆河县| 南川市| 宁强县| 连山| 西安市| 洪雅县| 神农架林区| 安宁市| 信宜市| 秦皇岛市| 綦江县| 定兴县| 枞阳县| 赫章县| 武安市| 沂水县| 松滋市| 峡江县| 长泰县| 瑞昌市| 金华市| 屯留县| 桑日县| 慈利县| 新闻| 和硕县| 勐海县| 宿松县| 雷波县| 财经| 库车县| 澜沧| 阳春市| 深水埗区| SHOW| 平南县| 龙岩市| 当涂县| 手游| 阳信县| 塘沽区| 株洲市| 陵水| 威宁| 七台河市| 古蔺县| 盐城市| 蚌埠市| 贵溪市| 赣州市| 鄱阳县| 汕头市| 霍山县| 大田县| 浦东新区| 银川市| 京山县| 神池县| 息烽县| 兴安盟| 兰考县| 贵定县| 山西省| 天长市| 万安县| 永善县| 大姚县| 古蔺县| 隆回县| 阆中市| 通化市| 南江县| 农安县| 合作市| 新安县| 徐水县| 民县| 新郑市| 贞丰县| 鄂尔多斯市| 大新县| 淳化县| 手机| 湟中县| 乌拉特中旗| 南澳县| 平果县| 海丰县| 获嘉县| 东光县| 梅河口市| 合阳县| 吴江市| 河间市| 辉南县| 台前县| 慈利县| 玉溪市| 神池县| 阿拉善盟| 鹤壁市| 沂水县| 梁山县| 建宁县| 静乐县| 天全县| 清苑县| 常熟市| 江西省| 渭南市| 新绛县| 利辛县| 无锡市| 锡林郭勒盟| 怀集县| 连平县| 镇赉县| 康平县| 武山县| 元阳县| 喀喇沁旗| 四川省| 翁牛特旗| 肇庆市| 高雄县| 巴彦县| 柘城县| 通江县| 四川省| 陆川县| 临沭县| 无锡市| 金湖县| 新晃| 赤壁市| 长兴县| 疏勒县| 孝昌县| 清河县| 长葛市| 都安| 洮南市| 绵竹市| 云林县| 故城县| 丰县| 华池县| 石渠县| 鹤山市| 确山县| 闻喜县| 高雄市| 东源县| 青冈县| 宣威市| 密山市| 鄂州市| 满城县| 马鞍山市| 云梦县| 武定县| 满洲里市| 忻州市| 长岭县| 芦溪县| 蓬莱市| 佛山市| 治县。| 蒙阴县| 沾化县| 盘锦市| 丁青县| 平度市| 博客| 乡宁县| 漳浦县| 灵台县| 巴马| 张家川| 土默特左旗| 砀山县| 诸暨市| 新蔡县| 大田县| 进贤县| 河间市| 辛集市| 冕宁县| 娄底市| 金塔县| 仪征市| 常宁市| 健康| 确山县| 宁南县| 安多县| 吉木萨尔县| 诸城市| 铅山县| 昌图县| 英吉沙县| 探索| 淳化县| 辰溪县| 通化县| 曲阳县| 麻江县| 绥中县| 潜江市| 密山市| 柘荣县| 德庆县| 夹江县| 会东县| 屏边| 开江县| 龙里县| 临武县| 汤原县| 天祝| 万年县| 龙南县| 方正县| 织金县| http://www.jx1870guardv.fun http://hz0j0r4vo.fun http://m.jx1870figurev.fun http://www.jx1870fordv.fun http://jx1870forzv.fun http://wap.jx1870givev.fun http://wap.jx1870ironv.fun http://wap.jx1870expectv.fun http://m.jx1870enhancev.fun http://www.jx1870jointv.fun http://m.jx1870flightv.fun http://www.jx1870flashv.fun http://wap.jx1870functionv.fun http://wap.jx1870guardv.fun http://jx1870hidev.fun http://wap.jx1870greenv.fun http://jx1870enjoyv.fun http://hz0j0r3vo.fun