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年香港开奖日期表2018香港历史开奖结果香港最快开奖现场直播 阳泉市| 宕昌县| 兰州市| 马尔康县| 临汾市| 奉新县| 思南县| 三河市| 佛冈县| 沁阳市| 平原县| 汝阳县| 扎兰屯市| 临沂市| 府谷县| 遵化市| 长兴县| 松桃| 湘潭市| 镇江市| 炎陵县| 新源县| 上饶市| 临湘市| 和平县| 安图县| 尼勒克县| 定兴县| 鞍山市| 临西县| 桂林市| 四子王旗| 克拉玛依市| 贵德县| 丰县| 化州市| 日喀则市| 清镇市| 抚宁县| 社旗县| 东平县| 乐平市| 太仓市| 屏边| 溧阳市| 博客| 巴中市| 喀喇沁旗| 会宁县| 黄浦区| 乐平市| 沁阳市| 苗栗市| 明光市| 湖南省| 垦利县| 公安县| 涿鹿县| 石嘴山市| 绥芬河市| 岳西县| 田阳县| 秦皇岛市| 华亭县| 宁蒗| 分宜县| 远安县| 娄底市| 靖宇县| 广宗县| 洛浦县| 蓬安县| 高唐县| 吉林省| 北海市| 康乐县| 香河县| 阜新市| 诏安县| 大邑县| 花莲市| 怀安县| 交城县| 杨浦区| 锡林浩特市| 安国市| 泊头市| 绥江县| 南涧| 安岳县| 涿鹿县| 那坡县| 麟游县| 孟连| 桓台县| 佛冈县| 永兴县| 雷波县| 保靖县| 福安市| 聂荣县| 东台市| 梁河县| 许昌县| 榆林市| 景德镇市| 开化县| 民县| 文成县| 永州市| 河池市| 巴青县| 南郑县| 买车| 鹤壁市| 西峡县| 湖口县| 高阳县| 安阳县| 临汾市| 阳山县| 历史| 布尔津县| 宁河县| 万全县| 定陶县| 当阳市| 连平县| 绍兴市| 绥化市| 迭部县| 桃江县| 哈巴河县| 莫力| 本溪| 晋宁县| 抚松县| 页游| 古丈县| 信宜市| 高碑店市| 西乡县| 仲巴县| 轮台县| 皋兰县| 德格县| 陆丰市| 尉氏县| 潼关县| 柘荣县| 河北省| 宣城市| 连州市| 台中县| 太湖县| 古丈县| 城固县| 乐清市| 卢龙县| 综艺| 修文县| 连南| 阳原县| 永川市| 苏州市| 金秀| 彰化市| 邛崃市| 屏东县| 安新县| 梁平县| 丹寨县| 呼图壁县| 绥德县| 丹寨县| 清镇市| 亚东县| 普定县| 新田县| 龙岩市| 积石山| 灵山县| 合肥市| 郁南县| 靖州| 西青区| 牟定县| 庄浪县| 乌拉特后旗| 娄底市| 老河口市| 抚远县| 耿马| 海宁市| 屯留县| 贵德县| 兰州市| 车险| 大荔县| 额济纳旗| 枣强县| 晋宁县| 射阳县| 崇义县| 霍邱县| 宁国市| 仙居县| 辽中县| 龙胜| 东乌珠穆沁旗| 平安县| 陆丰市| 承德县| 南昌市| 西吉县| 天长市| 仁寿县| 大港区| 连江县| 天峨县| 威海市| 罗源县| 鄂尔多斯市| 济阳县| 交口县| 根河市| 清河县| 行唐县| 江西省| 甘谷县| 丰城市| 什邡市| 莎车县| 镇江市| 浮梁县| 上高县| 竹山县| 荥阳市| 古田县| 吕梁市| 台湾省| 夏河县| 苍梧县| 通化县| 黄平县| 大冶市| 乐平市| 丹寨县| 文安县| 贵港市| 拉孜县| 宜兰县| 连云港市| 平潭县| 华安县| 铜陵市| 马边| 云和县| 长治县| 扎囊县| 贵港市| 天长市| 黄大仙区| 黑河市| 黄梅县| 丰台区| 颍上县| 肥城市| 遵化市| 木兰县| 营口市| 轮台县| 汉源县| 商水县| 昔阳县| 龙海市| 布尔津县| 阜南县| 洛隆县| 东丰县| 上犹县| 武冈市| 万山特区| 重庆市| 綦江县| 蒲江县| 泸西县| 正安县| 井冈山市| 建瓯市| 安徽省| 日土县| 德惠市| 饶平县| 丹凤县| 额尔古纳市| 云龙县| 西城区| 淮南市| 高要市| 景泰县| 全南县| 嵩明县| 道孚县| 鲁山县| 新巴尔虎右旗| 浑源县| 神木县| 扶沟县| 手游| 逊克县| 富源县| 家居| 沙河市| 南平市| 海口市| 康乐县| 拜泉县| 县级市| 临沧市| 梧州市| 青阳县| 体育| 阳新县| 北票市| 剑阁县| 霍州市| 巴南区| 河北省| 泉州市| 绵竹市| 宜川县| 通道| 彝良县| 中宁县| 桃园市| 吐鲁番市| 印江| 白银市| 兴海县| 西华县| 洪泽县| 嘉黎县| 佛山市| 云和县| 壤塘县| 固阳县| 响水县| 奉节县| 疏附县| 皋兰县| 晋州市| 都安| 崇阳县| 招远市| 福安市| 新巴尔虎左旗| 商都县| 白河县| 上高县| 镇沅| 台北市| 佳木斯市| 潼南县| 冀州市| 宁津县| 喀什市| 焉耆| 荃湾区| 正蓝旗| 山西省| 延安市| 常山县| 齐齐哈尔市| 商都县| 阆中市| 科技| 沈阳市| 长沙县| 焉耆| 甘洛县| 晋城| 大荔县| 彰化县| 高碑店市| 清苑县| 唐山市| 久治县| 福泉市| 遂宁市| 凌源市| 乐都县| 枣阳市| 克东县| 两当县| 武陟县| 陆良县| 偏关县| 永州市| 遵义县| 天祝| 边坝县| 迁安市| 三都| 偃师市| 松溪县| 乾安县| 于都县| 成安县| 三台县| 集贤县| 黎平县| 德清县| 吴川市| 抚顺县| 建阳市| 紫金县| 德保县| 宁陕县| 遂昌县| 周宁县| 将乐县| 敦化市| 讷河市| 昌吉市| 北碚区| 扬州市| 夏河县| 江源县| 剑河县| 丰县| 怀宁县| 潼南县| 新源县| 右玉县| 龙游县| 牙克石市| 东光县| 务川| 那曲县| 广元市| 灵宝市| 台南县| 神农架林区| 石狮市| 石渠县| 伊宁市| 辽阳县| 金华市| 双流县| 甘孜县| 中方县| 高密市| 德格县| 中江县| 江山市| 石狮市| 玉环县| 宝应县| 高阳县| 隆昌县| 松溪县| 冀州市| 炉霍县| 海城市| 广州市| 高雄县| 方山县| 海门市| 岚皋县| 皋兰县| 体育| 巴青县| 垫江县| 义乌市| 沙河市| 沾益县| 长岛县| 武威市| 博兴县| 德江县| 土默特左旗| 习水县| 台中市| 孝义市| 驻马店市| 仲巴县| 湟源县| 梁河县| 广安市| 屯昌县| 鹰潭市| 上虞市| 古交市| 镇安县| 安乡县| 敖汉旗| 洪雅县| 深水埗区| 镇平县| 周至县| 昌平区| 南涧| 白沙| 山东| 同仁县| 和田县| 南郑县| 丹凤县| 石阡县| 青神县| 莱西市| 峨边| 铅山县| 平谷区| 石门县| 台湾省| 孙吴县| 余庆县| 观塘区| 尚义县| 赤峰市| 洪洞县| 平泉县| 洛隆县| 墨脱县| 昆明市| 垫江县| 丰城市| 阳原县| 定安县| 化德县| 银川市| 尉氏县| 吉木乃县| 南陵县| 新干县| 义乌市| 瑞安市| 长葛市| 攀枝花市| 尉犁县| 堆龙德庆县| 恭城| 凤山市| 平南县| 桂阳县| 迁西县| 信阳市| 合水县| 安义县| 安龙县| 安泽县| 利川市| 武穴市| 浮山县| 鹤山市| 永福县| 固始县| 兴山县| 临沂市| 修武县| 襄垣县| 长治县| 顺平县| 锦屏县| 平定县| 资源县| 平定县| 泰宁县| 莲花县| 桂阳县| 布拖县| 靖远县| 方正县| 龙岩市| 珲春市| 冷水江市| 宜兴市| 丹东市| 泾源县| 南召县| 柳林县| 丘北县| 乌拉特前旗| 九龙县| 阿拉善盟| 岳西县| 安陆市| 泸州市| 察雅县| 大理市| 富宁县| 沅陵县| 洛阳市| 林甸县| 宁河县| 剑河县| 罗山县| 辽宁省| 富源县| 富锦市| 揭西县| 金昌市| 济南市| 读书| 义马市| 临夏县| 绍兴县| 沈丘县| 来宾市| 潮州市| 永川市| 荔浦县| 双牌县| http://m.ddvlpt.fit http://wap.nxbdaq.fit http://wap.yhqjkd.fit http://www.huzmqn.fit http://www.qspcar.fit http://m.ulrfzp.fit http://www.xvhmpy.fit http://m.xfmzhf.fit http://www.kagcdh.fit http://m.pvgrod.fit http://www.yfxflv.fit http://m.lkptzb.fit http://www.zqrwmn.fit http://m.bm1961xetalz.fit http://m.wkjzcf.fit http://wap.ttfylo.fit http://m.ouqfwo.fit http://wap.bm1961lordz.fit