<address id="nhfpd"></address>

                <sub id="nhfpd"></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 }
                  相关文章
                  相关标签/搜索
                  何仙姑六肖期期准资料 攀枝花市| 陵水| 湖口县| 梁河县| 南汇区| 临洮县| 吉林市| 麻栗坡县| 沁阳市| 永平县| 耒阳市| 毕节市| 平塘县| 富蕴县| 西吉县| 保山市| 海盐县| 隆德县| 永泰县| 中西区| 玉环县| 六枝特区| 江安县| 本溪| 西青区| 竹山县| 灵宝市| 潜江市| 同心县| 海南省| 张家口市| 中宁县| 来安县| 普洱| 雷州市| 金阳县| 萨迦县| 湟源县| 额敏县| 康平县| 军事| 邢台市| 新和县| 阿鲁科尔沁旗| 大丰市| 公主岭市| 苍梧县| 扶余县| 昌黎县| 攀枝花市| 南乐县| 山阳县| 凤庆县| 和田市| 淳化县| 太保市| 平陆县| 民县| 伊川县| 浮梁县| 鄂托克前旗| 航空| 益阳市| 建平县| 合山市| 辽中县| 太康县| 花垣县| 卢氏县| 措勤县| 临高县| 柳州市| 肥城市| 常州市| 台东县| 萍乡市| 鸡西市| 梁河县| 东光县| 天柱县| 巍山| 焦作市| 新野县| 繁昌县| 长泰县| 永定县| 湘阴县| 资溪县| 永济市| 南木林县| 勐海县| 瑞金市| 岑巩县| 通化县| 衡阳县| 海南省| 汉沽区| 新化县| 丘北县| 沙雅县| 九龙城区| 绩溪县| 舒兰市| 博乐市| 安龙县| 张家界市| 灵川县| 佛学| 靖边县| 会昌县| 富顺县| 大港区| 盖州市| 东丰县| 昌邑市| 长岛县| 长兴县| 河北区| 湘阴县| 遂溪县| 石台县| 上犹县| 收藏| 十堰市| 大安市| 平顶山市| 荣成市| 达孜县| 通道| 海门市| 杨浦区| 台东县| 雅江县| 庆云县| 淳化县| 龙井市| 常德市| 榕江县| 普定县| 姚安县| 康乐县| 玛纳斯县| 巩义市| 平潭县| 南皮县| 拉萨市| 桂林市| 综艺| 台中市| 巫溪县| 赞皇县| 阳山县| 津南区| 哈巴河县| 观塘区| 灯塔市| 辉南县| 调兵山市| 炉霍县| 盐边县| 老河口市| 体育| 扶余县| 通辽市| 子洲县| 嘉鱼县| 墨脱县| 抚顺县| 岑溪市| 青铜峡市| 得荣县| 合川市| 柞水县| 临夏市| 青海省| 乌苏市| 宜兰县| 东乌| 鄂伦春自治旗| 山丹县| 武陟县| 乌恰县| 万年县| 扎囊县| 鄂伦春自治旗| 改则县| 苏尼特右旗| 金秀| 东平县| 虞城县| 福州市| 浮梁县| 南康市| 镇江市| 长子县| 泽库县| 鹰潭市| 汉阴县| 香格里拉县| 大英县| 鸡泽县| 瑞安市| 辰溪县| 垫江县| 东兴市| 昌乐县| 宜宾县| 双桥区| 烟台市| 隆化县| 郴州市| 东城区| 雷波县| 砀山县| 绥阳县| 长海县| 新兴县| 从江县| 文化| 靖边县| 法库县| 南汇区| 阿拉善左旗| 嵊州市| 柳河县| 且末县| 阳山县| 余姚市| 霍林郭勒市| 衡水市| 柳江县| 凤城市| 五指山市| 建水县| 墨脱县| 前郭尔| 土默特右旗| 苍梧县| 老河口市| 名山县| 南岸区| 孟津县| 安仁县| 东港市| 昌宁县| 萝北县| 海丰县| 鲜城| 布拖县| 博野县| 永嘉县| 成都市| 甘谷县| 墨江| 文昌市| 汉中市| 大姚县| 祁阳县| 福安市| 额敏县| 长沙市| 天祝| 体育| 东乌珠穆沁旗| 团风县| 高尔夫| 三门县| 吴堡县| 区。| 溆浦县| 绥阳县| 左贡县| 望奎县| 鞍山市| 高尔夫| 勐海县| 渑池县| 高阳县| 宜川县| 句容市| 琼海市| 调兵山市| 定远县| 泸州市| 合山市| 类乌齐县| 开平市| 桑植县| 丰都县| 广丰县| 五大连池市| 广饶县| 阜城县| 拉萨市| 汤阴县| 英吉沙县| 唐山市| 綦江县| 河东区| 安阳县| 蕲春县| 扶绥县| 饶阳县| 山东省| 平和县| 瑞昌市| 梅河口市| 民和| 赣榆县| 耿马| 青岛市| 平安县| 防城港市| 柯坪县| 莒南县| 曲松县| 哈巴河县| 大埔区| 多伦县| 竹山县| 托克逊县| 大渡口区| 垦利县| 文安县| 永寿县| 吉首市| 齐齐哈尔市| 乡宁县| 平乡县| 营山县| 武义县| 河间市| 申扎县| 淮安市| 广饶县| 荣昌县| 前郭尔| 科尔| 丹棱县| 河池市| 镇赉县| 牙克石市| 黄陵县| 色达县| 温州市| 武威市| 通许县| 页游| 河北省| 滨海县| 松滋市| 石阡县| 涞水县| 仙居县| 上蔡县| 定日县| 青铜峡市| 冷水江市| 苍南县| 瑞安市| 大兴区| 封开县| 礼泉县| 荥经县| 讷河市| 青龙| 锦屏县| 玉门市| 陕西省| 德庆县| 兰州市| 阿合奇县| 通江县| 罗江县| 老河口市| 嘉峪关市| 云霄县| 满城县| 澄迈县| 大田县| 丹凤县| 怀远县| 宁远县| 霸州市| 石狮市| 象州县| 丰都县| 岳池县| 雅安市| 临朐县| 即墨市| 定州市| 渭南市| 江津市| 大冶市| 孟连| 南昌县| 石泉县| 泰州市| 汶川县| 彭水| 兰州市| 南城县| 湘潭市| 凤庆县| 乡宁县| 铜川市| 象州县| 五河县| 平安县| 青海省| 仙桃市| 鄂托克旗| 汶川县| 北京市| 沂南县| 南雄市| 府谷县| 景宁| 横山县| 荃湾区| 循化| 仙居县| 永康市| 黑河市| 饶阳县| 嘉荫县| 隆林| 广昌县| 奈曼旗| 赤壁市| 嘉义县| 谷城县| 山丹县| 丰县| 磐石市| 湘潭市| 宜城市| 和平县| 贵港市| 济源市| 凌源市| 顺义区| 宝鸡市| 油尖旺区| 澎湖县| 监利县| 承德市| 剑河县| 保靖县| 武功县| 邹平县| 子洲县| 射阳县| 石狮市| 镇平县| 观塘区| 富蕴县| 青铜峡市| 金川县| 化州市| 绵阳市| 深圳市| 临朐县| 平舆县| 柳河县| 福泉市| 乌兰浩特市| 水富县| 吉木乃县| 合肥市| 襄樊市| 洛扎县| 河北省| 朝阳县| 抚远县| 封丘县| 晋江市| 青岛市| 娱乐| 翁源县| 南陵县| 富蕴县| 武宁县| 遂平县| 彭水| 鄂托克旗| 丽水市| 古丈县| 洪湖市| 平度市| 会同县| 六盘水市| 小金县| 涟源市| 井冈山市| 伊金霍洛旗| 黄浦区| 康马县| 新余市| 五寨县| 竹北市| 兴山县| 高台县| 大庆市| 西平县| 双流县| 奇台县| 长乐市| 黑山县| 方正县| 屯留县| 奇台县| 遂宁市| 南通市| 巍山| 南陵县| 留坝县| 闽侯县| 曲靖市| 秦皇岛市| 宁阳县| 开鲁县| 大新县| 弥渡县| 桐梓县| 合山市| 澄迈县| 淳化县| 宝鸡市| 沙雅县| 广州市| 厦门市| 东海县| 游戏| 昌邑市| 汾西县| 茂名市| 乐东| 莎车县| 大连市| 京山县| 自贡市| 舞阳县| 兴山县| 邵武市| 张家口市| 洛浦县| 汉中市| 普安县| 垦利县| 阿拉善盟| 南岸区| 临江市| 铜梁县| 酉阳| 新疆| 崇信县| 阿城市| 塔河县| 安图县| 福州市| 齐齐哈尔市| 松溪县| 根河市| 旬阳县| 宝丰县| 焉耆| 安西县| 分宜县| 民勤县| 甘南县| 海口市| 托里县| 东丽区| 荣成市| 简阳市| 阜平县| 东源县| 威远县| 长沙市| 栾川县| 杭锦旗| 东辽县| 五寨县| 谢通门县| 黄山市| 丹寨县| 朔州市| 都江堰市| 托克逊县| 分宜县| 普宁市| 香格里拉县| 汾西县| 南城县| 巴中市| 盐亭县| 邵武市| 朝阳区| 牟定县| 宁乡县| 买车| 铅山县| 安义县| 阿坝| 祁门县| 汉源县| 运城市| 星子县| 南康市| 监利县| 台山市| 钟山县| 大埔县| http://wap.ugsvee.fit http://www.nxbzgz.fit http://www.rfgdgr.fit http://wap.bm1961xaintainz.fit http://m.bm1961losez.fit http://m.qfjjqh.fit http://dcrvqp.fit http://m.teydmx.fit http://wap.kbjnum.fit http://wap.oiveed.fit http://ojitom.fit http://wap.bbylzv.fit http://gkldsu.fit http://wap.rhbldb.fit http://xhlnwc.fit http://wap.yzykyn.fit http://bfpotn.fit http://m.zrxqbr.fit