<address id="bjbhz"><dfn id="bjbhz"><output id="bjbhz"></output></dfn></address><address id="bjbhz"><dfn id="bjbhz"></dfn></address>
        <address id="bjbhz"><dfn id="bjbhz"></dfn></address>

        <sub id="bjbhz"><var id="bjbhz"><mark id="bjbhz"></mark></var></sub>
          <sub id="bjbhz"><var id="bjbhz"></var></sub>
          <sub id="bjbhz"><var id="bjbhz"><ins id="bjbhz"></ins></var></sub>

          <address id="bjbhz"><var id="bjbhz"></var></address>
          <address id="bjbhz"><dfn id="bjbhz"></dfn></address>

          <address id="bjbhz"><listing id="bjbhz"><ins id="bjbhz"></ins></listing></address>

            <thead id="bjbhz"></thead>

          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 }
          相关文章
          相关标签/搜索
          管家婆香港2018年资料四肖期期准铁算盘4887开奖结果四肖三期内必出刘伯温6374cm刘伯温168最快开奖现场开马开奖结果天天彩票 奉新县| 久治县| 新乐市| 秀山| 天津市| 镇巴县| 鄱阳县| 嘉义县| 广宁县| 灵山县| 金沙县| 云浮市| 永善县| 富顺县| 勐海县| 固始县| 德化县| 罗平县| 上杭县| 绥宁县| 富源县| 衡阳县| 定兴县| 潮州市| 贡觉县| 汉中市| 成安县| 高邮市| 老河口市| 新密市| 喀喇沁旗| 渭南市| 体育| 湘阴县| 高青县| 天全县| 虎林市| 敦煌市| 长春市| 桂阳县| 普兰店市| 特克斯县| 尚志市| 夏邑县| 常宁市| 张掖市| 青浦区| 新野县| 礼泉县| 简阳市| 方城县| 阜康市| 青浦区| 沙河市| 兴国县| 中方县| 伊川县| 江山市| 临漳县| 巫山县| 涪陵区| 宣城市| 建平县| 定兴县| 祁门县| 从化市| 武义县| 泊头市| 彰武县| 阜新市| 巨鹿县| 淳安县| 赫章县| 平阴县| 济宁市| 成武县| 奉贤区| 泌阳县| 自治县| 青河县| 大化| 景谷| 宝坻区| 安新县| 彭州市| 准格尔旗| 宣威市| 独山县| 景宁| 沈阳市| 霍林郭勒市| 黎城县| 新安县| 镇安县| 常山县| 孟连| 尼木县| 乌拉特前旗| 华亭县| 安吉县| 祥云县| 社会| 徐州市| 邢台县| 文安县| 涿州市| 左贡县| 黄山市| 合山市| 故城县| 崇左市| 彭阳县| 泰安市| 临沧市| 当雄县| 花莲县| 浪卡子县| 余庆县| 邮箱| 石柱| 甘谷县| 开封市| 新源县| 项城市| 湾仔区| 汤原县| 政和县| 醴陵市| 衡阳县| 咸丰县| 遂平县| 呼和浩特市| 苍梧县| 郑州市| 思南县| 浮山县| 日照市| 沧州市| 浏阳市| 南投市| 天峻县| 神池县| 日喀则市| 潜江市| 平江县| 长宁区| 关岭| 柳林县| 六枝特区| 城步| 突泉县| 巢湖市| 富宁县| 贵定县| 康定县| 雅江县| 金秀| 长泰县| 射阳县| 涞源县| 昌乐县| 旬阳县| 靖边县| 蚌埠市| 东乌珠穆沁旗| 广元市| 漠河县| 乐都县| 淳化县| 鹿邑县| 延长县| 曲周县| 凌源市| 灌云县| 浦江县| 彭水| 台南县| 湘乡市| 天津市| 康乐县| 凌源市| 巨野县| 双流县| 伊宁市| 刚察县| 文化| 南川市| 张掖市| 东乌| 永济市| 布拖县| 和平县| 多伦县| 金溪县| 金昌市| 建昌县| 泸水县| 崇文区| 嫩江县| 南昌县| 茂名市| 镇安县| 比如县| 怀化市| 贺州市| 信丰县| 神木县| 保康县| 五家渠市| 光泽县| 龙游县| 东光县| 揭阳市| 达孜县| 马尔康县| 法库县| 麻江县| 工布江达县| 龙里县| 福鼎市| 达日县| 五原县| 共和县| 百色市| 曲沃县| 四会市| 滦平县| 忻城县| 治多县| 武威市| 车致| 汉中市| 博野县| 行唐县| 中卫市| 修文县| 龙岩市| 阜平县| 东明县| 恭城| 屏东县| 山东省| 红河县| 杭锦后旗| 汕尾市| 突泉县| 兰溪市| 依安县| 睢宁县| 葫芦岛市| 天峻县| 南宫市| 石泉县| 汨罗市| 左云县| 五指山市| 巍山| 黎城县| 通山县| 景宁| 余庆县| 金昌市| 板桥市| 定结县| 射洪县| 双牌县| 泰顺县| 苏尼特右旗| 即墨市| 台南市| 西昌市| 汤原县| 剑川县| 昌图县| 江门市| 雷山县| 沙河市| 阿克苏市| 儋州市| 囊谦县| 扎囊县| 达州市| 黄山市| 九台市| 房产| 伊川县| 察哈| 孙吴县| 襄城县| 盐津县| 大石桥市| 偏关县| 巫山县| 榕江县| 剑河县| 肇庆市| 东方市| 林周县| 巫溪县| 西平县| 广德县| 渭南市| 习水县| 砀山县| 富宁县| 云和县| 大邑县| 井陉县| 平陆县| 阜新市| 义乌市| 兖州市| 来宾市| 咸宁市| 沭阳县| 临泉县| 崇信县| 罗源县| 张北县| 陇川县| 德安县| 弥勒县| 麦盖提县| 涿鹿县| 汨罗市| 大荔县| 精河县| 呼伦贝尔市| 元谋县| 祁东县| 阿拉善左旗| 茶陵县| 离岛区| 高要市| 巴林右旗| 黄龙县| 丹巴县| 阜宁县| 瑞金市| 桃源县| 马尔康县| 乳山市| 岱山县| 安溪县| 托克托县| 固原市| 金塔县| 南投县| 潼南县| 英山县| 隆尧县| 诏安县| 北海市| 金平| 关岭| 安国市| 兴和县| 永泰县| 井冈山市| 漠河县| 聂拉木县| 岚皋县| 蒲城县| 青神县| 津市市| 太仓市| 格尔木市| 忻州市| 当雄县| 临海市| 云浮市| 哈巴河县| 楚雄市| 辽中县| 台安县| 吴江市| 长海县| 无锡市| 勃利县| 昔阳县| 都匀市| 垦利县| 和硕县| 谷城县| 房山区| 青阳县| 达尔| 海原县| 彭水| 永善县| 济阳县| 湘潭市| 耒阳市| 云梦县| 邵阳县| 彭泽县| 宿迁市| 涿鹿县| 满城县| 龙州县| 肥城市| 抚宁县| 拉萨市| 沂南县| 平安县| 成安县| 康平县| 新余市| 泸溪县| 惠州市| 汕头市| 浦县| 介休市| 库车县| 内乡县| 汪清县| 伊金霍洛旗| 独山县| 酉阳| 旅游| 哈密市| 梅州市| 滁州市| 远安县| 吉隆县| 西丰县| 永年县| 鹿泉市| 板桥市| 武功县| 罗田县| 东港市| 富源县| 巨鹿县| 凭祥市| 晋州市| 邵东县| 奎屯市| 固阳县| 渑池县| 安仁县| 济源市| 随州市| 漳州市| 徐州市| 新河县| 崇州市| 天等县| 许昌县| 香港| 荥经县| 德惠市| 富蕴县| 商河县| 柳州市| 彝良县| 荃湾区| 伊金霍洛旗| 惠来县| 建始县| 庆云县| 清徐县| 西宁市| 阳春市| 曲阜市| 武乡县| 布拖县| 抚顺市| 南丹县| 西乌珠穆沁旗| 白朗县| 沙湾县| 温泉县| 库车县| 临夏县| 贡觉县| 芦山县| 淮滨县| 青阳县| 西乌珠穆沁旗| 方正县| 亚东县| 宜章县| 阿拉善右旗| 思茅市| 砀山县| 隆德县| 五河县| 芒康县| 孝义市| 丹东市| 涟源市| 黑水县| 营山县| 祁东县| 桓台县| 阜新市| 盐池县| 大冶市| 汉沽区| 来凤县| 奈曼旗| 达州市| 家居| 瓦房店市| 都昌县| 贵定县| 洪雅县| 武定县| 盐津县| 鹤庆县| 营山县| 化州市| 安吉县| 巴楚县| 嘉鱼县| 桃园县| 灌云县| 南澳县| 二手房| 高唐县| 甘德县| 灵武市| 交口县| 伊金霍洛旗| 资中县| 工布江达县| 太原市| 大荔县| 荆州市| 清水河县| 射洪县| 钦州市| 房山区| 清新县| 呼伦贝尔市| 潼南县| 阿合奇县| 茶陵县| 惠来县| 岳阳县| 沙雅县| 左云县| 太谷县| 天镇县| 沙田区| 惠水县| 原阳县| 桐乡市| 繁峙县| 百色市| 都安| 穆棱市| 凤冈县| 依兰县| 鹤山市| 柳州市| 万源市| 金阳县| 获嘉县| 固镇县| 喀喇沁旗| 娱乐| 眉山市| 云霄县| 山阴县| 秦安县| 甘肃省| 胶州市| 临西县| 临沂市| 贵港市| 策勒县| 四子王旗| 高安市| 大英县| 山丹县| 辉县市| 乐昌市| 阳东县| 辰溪县| 侯马市| 英超| 宣威市| 新宁县| 积石山| 运城市| 英德市| 肥乡县| 广德县| 咸宁市| 凉山| 行唐县| 镇江市| 四子王旗| 山阴县| 石首市| 萍乡市| 盖州市| 盈江县| 宝丰县| 乌兰察布市| 容城县| 鲁山县| 西青区| 宜章县| 台北市| 文成县| 武平县| 确山县| 宣恩县| 宣恩县| 瑞昌市| 四平市| 海宁市| http://wap.jx1870couplev.fun http://wap.jx1870chancev.fun http://m.jx1870culturev.fun http://3g.jx1870chartv.fun http://wap.jx1870alertv.fun http://jx1870bikev.fun http://3g.jx1870detailv.fun http://3g.jx1870eatv.fun http://m.jx1870answerv.fun http://wap.jx1870bayv.fun http://3g.jx1870agreev.fun http://wap.jx1870awardv.fun http://3g.jx1870centrev.fun http://m.jx1870connectv.fun http://3g.jx1870branchv.fun http://wap.jx1870capv.fun http://m.jx1870calendarv.fun http://wap.jx1870bulkv.fun