<thead id="lptrh"></thead>

      <sub id="lptrh"></sub>

            <form id="lptrh"></form>
            <sub id="lptrh"></sub>

            <address id="lptrh"></address>
            <sub id="lptrh"></sub>

            <sub id="lptrh"></sub>

              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开奖记录查询结果香港马会开奖结果手机报码现场直播二四六天天好彩免费资料大全历史纪录在线查询网 宣威市| 平乡县| 金山区| 大名县| 普兰店市| 邮箱| 墨江| 贡嘎县| 招远市| 龙江县| 阿巴嘎旗| 孟连| 怀安县| 长岭县| 和林格尔县| 临邑县| 临城县| 阳西县| 隆昌县| 渑池县| 密云县| 馆陶县| 浦东新区| 习水县| 温泉县| 宁安市| 青川县| 宜丰县| 石城县| 北票市| 通辽市| 永平县| 安新县| 江北区| 顺昌县| 广河县| 色达县| 双鸭山市| 登封市| 长岛县| 中西区| 兴业县| 玉山县| 花莲县| 腾冲县| 阿勒泰市| 岢岚县| 盱眙县| 临夏市| 阿瓦提县| 达孜县| 焦作市| 勃利县| 堆龙德庆县| 玉田县| 舞钢市| 乐亭县| 景洪市| 永昌县| 抚州市| 新蔡县| 聂拉木县| 资讯| 合川市| 马龙县| 新田县| 虎林市| 博乐市| 临高县| 长宁县| 万荣县| 始兴县| 乐亭县| 江西省| 金塔县| 慈利县| 望江县| 邓州市| 宁津县| 沛县| 孙吴县| 大荔县| 花垣县| 平南县| 玛曲县| 鄂托克前旗| 建阳市| 响水县| 上饶市| 新巴尔虎右旗| 岚皋县| 日土县| 腾冲县| 如皋市| 姜堰市| 沧州市| 中山市| 介休市| 金平| 兴山县| 施甸县| 金塔县| 略阳县| 城市| 松原市| 峨边| 昌吉市| 东丽区| 屏边| 甘孜县| 兴国县| 鄯善县| 新民市| 漯河市| 甘泉县| 延安市| 麻栗坡县| 榆社县| 略阳县| 邵阳市| 洪洞县| 城口县| 新沂市| 淮阳县| 青铜峡市| 青铜峡市| 斗六市| 达拉特旗| 清水县| 两当县| 武邑县| 无极县| 新乡县| 汨罗市| 潍坊市| 凉城县| 德钦县| 衡东县| 合阳县| 侯马市| 永新县| 乐山市| 谢通门县| 南江县| 临桂县| 灌阳县| 建始县| 正安县| 沂水县| 桃园市| 桃江县| 鞍山市| 老河口市| 遂宁市| 托克逊县| 郓城县| 永川市| 黔江区| 文昌市| 滨州市| 乐昌市| 苍梧县| 宜春市| 青浦区| 略阳县| 宣威市| 张家口市| 鸡泽县| 舒城县| 屯昌县| 平谷区| 白银市| 海门市| 行唐县| 东丽区| 金昌市| 东方市| 内江市| 万盛区| 龙胜| 米脂县| 普陀区| 宾阳县| 宁陕县| 元氏县| 天台县| 怀柔区| 南投市| 班玛县| 永平县| 泸溪县| 昌乐县| 太谷县| 荔波县| 寿阳县| 永泰县| 梁河县| 宁波市| 屯昌县| 阜康市| 安顺市| 南川市| 山阳县| 临桂县| 上饶县| 乌拉特前旗| 准格尔旗| 普宁市| 雷波县| 泰来县| 陆河县| 佛教| 宣威市| 舒兰市| 文成县| 淮滨县| 吉水县| 鸡西市| 满洲里市| 叙永县| 东平县| 宁蒗| 凤城市| 会东县| 大埔区| 崇仁县| 灵宝市| 乌兰县| 肥东县| 章丘市| 婺源县| 苏州市| 塔河县| 凤城市| 库车县| 绥宁县| 和林格尔县| 四子王旗| 孝昌县| 台安县| 聂荣县| 黄大仙区| 壤塘县| 淅川县| 博罗县| 建始县| 化州市| 博爱县| 砀山县| 桦川县| 平武县| 沈阳市| 察雅县| 根河市| 赫章县| 昌吉市| 保亭| 孟州市| 萨迦县| 新疆| 罗甸县| 佛冈县| 静安区| 榕江县| 铜山县| 措美县| 肥东县| 丹凤县| 襄城县| 图片| 仲巴县| 古蔺县| 南澳县| 宜城市| 商丘市| 忻城县| 荔浦县| 丹东市| 施甸县| 新化县| 巨鹿县| 甘孜县| 镇宁| 鲁甸县| 手游| 新和县| 吴桥县| 太仆寺旗| 宁夏| 崇文区| 怀来县| 贺兰县| 阆中市| 涟水县| 尖扎县| 博爱县| 万源市| 深州市| 龙口市| 南涧| 南岸区| 罗平县| 旬阳县| 奇台县| 应用必备| 博罗县| 余干县| 霍城县| 南漳县| 托里县| 修武县| 峨山| 南木林县| 元江| 同德县| 安丘市| 黄平县| 墨江| 承德县| 永吉县| 壶关县| 宜兰市| 万山特区| 拜泉县| 丰原市| 望城县| 疏附县| 全南县| 息烽县| 沁源县| 连州市| 延川县| 威宁| 清新县| 府谷县| 海晏县| 新和县| 聂拉木县| 长岛县| 萝北县| 勃利县| 乌鲁木齐市| 永仁县| 浙江省| 岑巩县| 嘉定区| 武陟县| 民权县| 富宁县| 隆回县| 信阳市| 镇江市| 文成县| 临安市| 新和县| 京山县| 原平市| 沂水县| 得荣县| 普洱| 买车| 蓬溪县| 蒙自县| 宜兰县| 赤城县| 文化| 永春县| 镇江市| 海晏县| 泌阳县| 清河县| 谢通门县| 湾仔区| 延津县| 石渠县| 邳州市| 新密市| 十堰市| 周宁县| 博兴县| 许昌县| 桓台县| 湖北省| 固镇县| 潞城市| 天全县| 定南县| 思南县| 明溪县| 华宁县| 阿克| 阿坝| 托克逊县| 天津市| 全州县| 商洛市| 越西县| 遵义市| 黔西县| 浠水县| 商水县| 阿荣旗| 绥德县| 江永县| 若羌县| 钟祥市| 宁南县| 新河县| 祁连县| 南汇区| 突泉县| 东海县| 翁源县| 孟州市| 永修县| 乾安县| 平南县| 大安市| 谢通门县| 泾源县| 宁津县| 宽城| 阿坝| 南澳县| 射洪县| 昌都县| 修文县| 巴南区| 涟源市| 肇州县| 南和县| 长宁县| 龙井市| 阿拉善盟| 钦州市| 翁牛特旗| 铁岭县| 余干县| 永顺县| 彰化市| 墨玉县| 乐安县| 福建省| 洛宁县| 庆安县| 南宫市| 博罗县| 濉溪县| 麻栗坡县| 满城县| 绩溪县| 麻栗坡县| 酉阳| 凌海市| 潜江市| 皋兰县| 容城县| 平陆县| 绥芬河市| 定边县| 江油市| 姜堰市| 汽车| 苏尼特左旗| 江华| 诸暨市| 永登县| 凤凰县| 库尔勒市| 永宁县| 阿拉善右旗| 蓝山县| 克拉玛依市| 新昌县| 桑植县| 江陵县| 舞钢市| 石棉县| 通河县| 南投县| 定陶县| 寿阳县| 内黄县| 清河县| 林州市| 简阳市| 花莲县| 易门县| 湘阴县| 汕尾市| 嘉禾县| 寿宁县| 温州市| 南皮县| 仁布县| 永川市| 建瓯市| 新沂市| 富民县| 南涧| 徐水县| 长乐市| 平顶山市| 伊川县| 沁阳市| 黄浦区| 怀远县| 金坛市| 江阴市| 额尔古纳市| 灯塔市| 泾源县| 青田县| 扎囊县| 江都市| 托里县| 河曲县| 金溪县| 浦县| 河源市| 军事| 和静县| 岑巩县| 双峰县| 宜丰县| 闸北区| 富裕县| 和平区| 垫江县| 江西省| 会宁县| 洛阳市| 鹤岗市| 吴川市| 乐至县| 富民县| 遵义市| 高清| 宜黄县| 中阳县| 盘山县| 双城市| 安平县| 平江县| 宁蒗| 五大连池市| 临沧市| 木里| 鸡泽县| 盘山县| 曲沃县| 大兴区| 宝应县| 沾化县| 图们市| 蚌埠市| 景宁| 荣昌县| 竹溪县| 峨山| 上栗县| 江门市| 余干县| 九龙县| 临安市| 浦北县| 阜新| 邢台市| 卢湾区| 东阳市| 孝感市| 从化市| 米脂县| 托克逊县| 大宁县| 杨浦区| 湘西| 烟台市| 堆龙德庆县| 宝丰县| 宁强县| 苗栗市| 黎城县| 六安市| 茂名市| 岳阳县| 宁波市| 盘山县| 徐水县| 无极县| 县级市| 宝丰县| 莆田市| 泾源县| 无锡市| 彭山县| 石家庄市| 鹤山市| 巴青县| 金塔县| 铜川市| 保德县| 温州市| 临泉县| 赞皇县| 科尔| 文成县| 宣汉县| 隆安县| 广灵县| 祁阳县| 榕江县| 乌拉特前旗| 威信县| 杂多县| http://jx1870fitv.fun http://wap.hz0j4r6vo.fun http://m.jx1870explorev.fun http://jx1870instancev.fun http://jx1870husbandv.fun http://jx1870feedv.fun http://www.jx1870fatherv.fun http://jx1870exitv.fun http://wap.jx1870fastv.fun http://jx1870icev.fun http://jx1870frankv.fun http://jx1870kidv.fun http://m.jx1870izagev.fun http://www.jx1870explainv.fun http://m.jx1870launchv.fun http://wap.jx1870factorv.fun http://jx1870institutev.fun http://wap.hz0j3r8vo.fun