<address id="rphpx"><listing id="rphpx"></listing></address>

<address id="rphpx"><dfn id="rphpx"></dfn></address>
<sub id="rphpx"><var id="rphpx"></var></sub>
<address id="rphpx"><dfn id="rphpx"></dfn></address>
    <sub id="rphpx"><var id="rphpx"><ins id="rphpx"></ins></var></sub>
    <sub id="rphpx"><dfn id="rphpx"><ins id="rphpx"></ins></dfn></sub>
      <sub id="rphpx"><var id="rphpx"></var></sub>

      <sub id="rphpx"><var id="rphpx"></var></sub>

        <sub id="rphpx"><var id="rphpx"><ins id="rphpx"></ins></var></sub>

        <thead id="rphpx"><var id="rphpx"><output id="rphpx"></output></var></thead>

        <sub id="rphpx"><listing id="rphpx"></listing></sub>

          <thead id="rphpx"><var id="rphpx"><output id="rphpx"></output></var></thead>
            <address id="rphpx"><dfn id="rphpx"></dfn></address>

            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 }
            相关文章
            相关标签/搜索
            白小姐四不像必中一肖+正版+网址930 靖西县| 乃东县| 广水市| 澄江县| 盈江县| 老河口市| 陇川县| 波密县| 宝清县| 闻喜县| 广饶县| 和平县| 黄石市| 亳州市| 托里县| 庄浪县| 民和| 宿州市| 葫芦岛市| 湟源县| 安平县| 高安市| 蕉岭县| 定襄县| 阳高县| 南平市| 永顺县| 宣城市| 商城县| 扎赉特旗| 咸宁市| 麻阳| 青阳县| 海南省| 巨鹿县| 理塘县| 桓仁| 泰和县| 六枝特区| 滨海县| 嫩江县| 商河县| 虹口区| 马龙县| 当雄县| 宾阳县| 钟祥市| 阳曲县| 绥宁县| 武安市| 沂南县| 九龙坡区| 苍溪县| 乐都县| 时尚| 肥城市| 西青区| 岳阳县| 平顺县| 临湘市| 磐石市| 出国| 九寨沟县| 诏安县| 剑河县| 遵化市| 祁门县| 临泉县| 内黄县| 大丰市| 南靖县| 苏尼特左旗| 页游| 循化| 新乡县| 太谷县| 宣恩县| 高尔夫| 拜泉县| 长宁区| 保靖县| 泸溪县| 水富县| 澄江县| 定西市| 车险| 永嘉县| 罗定市| 德江县| 衡阳市| 林口县| 晋宁县| 土默特右旗| 巫山县| 镇坪县| 崇信县| 南雄市| 宜良县| 恩平市| 上虞市| 关岭| 安平县| 视频| 客服| 屏东县| 宁武县| 青岛市| 保山市| 叶城县| 洛宁县| 定日县| 岳普湖县| 三台县| 勐海县| 绿春县| 民丰县| 紫阳县| 福贡县| 夏邑县| 邢台县| 浠水县| 镇宁| 达拉特旗| 霸州市| 江西省| 确山县| 神农架林区| 西青区| 同心县| 柳林县| 元江| 三明市| 太谷县| 明星| 沂水县| 巴彦淖尔市| 霍邱县| 巩留县| 色达县| 抚远县| 中方县| 墨脱县| 长寿区| 合川市| 大关县| 类乌齐县| 上饶市| 浮山县| 噶尔县| 西林县| 农安县| 昭觉县| 五大连池市| 竹北市| 峡江县| 南川市| 夏河县| 三江| 中山市| 平南县| 枝江市| 临武县| 郧西县| 新干县| 邢台县| 屏山县| 始兴县| 镇赉县| 拉孜县| 塔河县| 蚌埠市| 汉中市| 康平县| 通城县| 白河县| 同仁县| 固原市| 云梦县| 黑山县| 黑山县| 凉城县| 道真| 通州区| 深圳市| 观塘区| 郯城县| 华容县| 广汉市| 屯昌县| 安多县| 南江县| 灵川县| 佛山市| 广丰县| 廊坊市| 喀什市| 察隅县| 佛山市| 衢州市| 红河县| 左权县| 青川县| 中超| 岚皋县| 东宁县| 原平市| 垦利县| 南昌市| 德清县| 秀山| 张北县| 宣武区| 台中市| 乐业县| 侯马市| 昌乐县| 沧源| 区。| 台南县| 牙克石市| 南京市| 仙桃市| 花垣县| 南溪县| 南溪县| 长葛市| 盐边县| 廊坊市| 奉节县| 泰宁县| 灯塔市| 景洪市| 德清县| 梁河县| 化德县| 朝阳区| 嘉禾县| 镇坪县| 融水| 商水县| 通许县| 朔州市| 榆林市| 保山市| 永兴县| 马鞍山市| 都江堰市| 专栏| 胶南市| 兴隆县| 永新县| 自治县| 淮北市| 蕲春县| 灌阳县| 益阳市| 凌云县| 聂拉木县| 万州区| 义马市| 塔河县| 库车县| 三亚市| 雅江县| 霍州市| 仪陇县| 军事| 保亭| 桦南县| 闽清县| 鄢陵县| 青海省| 玛沁县| 定边县| 汉源县| 绥阳县| 宿迁市| 启东市| 皮山县| 湖南省| 宜兰县| 鄂伦春自治旗| 武汉市| 泾川县| 安图县| 巴东县| 晴隆县| 务川| 广南县| 肃宁县| 台南县| 雷波县| 龙南县| 苏尼特左旗| 绥棱县| 改则县| 上犹县| 元江| 南京市| 黎平县| 右玉县| 舒城县| 西华县| 武威市| 昭苏县| 台中县| 扎兰屯市| 宁武县| 故城县| 沙河市| 鄂州市| 土默特左旗| 临西县| 阳春市| 东港市| 攀枝花市| 冀州市| 徐州市| 鲁山县| 永城市| 龙川县| 虞城县| 咸丰县| 六安市| 齐齐哈尔市| 彭泽县| 敦化市| 和林格尔县| 乌拉特中旗| 临夏县| 祁门县| 高雄市| 万年县| 兴业县| 手游| 高平市| 右玉县| 徐水县| 沧源| 庆元县| 汾阳市| 治多县| 永川市| 宜都市| 平泉县| 绵阳市| 库伦旗| 安福县| 广南县| 裕民县| 将乐县| 桂阳县| 浠水县| 广水市| 遂溪县| 西充县| 广饶县| 诸城市| 泾源县| 交城县| 潮安县| 永康市| 广平县| 丰都县| 布尔津县| 木兰县| 上犹县| 武隆县| 横山县| 巨鹿县| 新昌县| 泰顺县| 土默特右旗| 呼玛县| 合水县| 德保县| 图们市| 商南县| 辽阳县| 邵阳县| 岐山县| 松原市| 浦县| 资兴市| 琼海市| 安宁市| 措勤县| 大足县| 长沙县| 胶南市| 浦东新区| 汾西县| 金川县| 灵宝市| 海淀区| 册亨县| 岳西县| 雅安市| 手游| 滦平县| 桐柏县| 平原县| 德阳市| 沙坪坝区| 清丰县| 金乡县| 商河县| 恩施市| 长汀县| 旅游| 龙岩市| 明星| 周宁县| 尚志市| 泾阳县| 虹口区| 成都市| 宁波市| 泸定县| 英吉沙县| 二手房| 衡水市| 清水河县| 邯郸市| 景泰县| 顺昌县| 馆陶县| 饶河县| 青海省| 西乌珠穆沁旗| 阿拉尔市| 淮滨县| 棋牌| 铁岭市| 东乡县| 陆良县| 英超| 板桥市| 东丽区| 榆社县| 张北县| 哈尔滨市| 抚松县| 浮山县| 牙克石市| 临桂县| 镇原县| 芜湖市| 疏勒县| 宁德市| 翁源县| 民丰县| 井陉县| 育儿| 崇文区| 菏泽市| 烟台市| 长治县| 迁安市| 洛扎县| 永顺县| 锡林郭勒盟| 沽源县| 深水埗区| 溆浦县| 日土县| 洪湖市| 海淀区| 平舆县| 镇远县| 临夏县| 长治县| 应用必备| 涞水县| 白河县| 府谷县| 天门市| 瓮安县| 济阳县| 芦溪县| 陇西县| 宜城市| 定州市| 桂林市| 赤峰市| 勃利县| 莱西市| 谷城县| 虞城县| 清流县| 屏南县| 泰安市| 宁国市| 明水县| 娱乐| 新密市| 哈尔滨市| 边坝县| 明水县| 云南省| 股票| 讷河市| 崇阳县| 和田市| 定襄县| 白山市| 永安市| 象山县| 科技| 沙湾县| 荔波县| 茌平县| 木兰县| 英德市| 五大连池市| 呼伦贝尔市| 寻甸| 嘉荫县| 武宣县| 琼结县| 翼城县| 金坛市| 肥西县| 天门市| 新野县| 西昌市| 榕江县| 民权县| 承德市| 叙永县| 广丰县| 阜城县| 弥勒县| 宁德市| 洛浦县| 昆明市| 河曲县| 永春县| 垫江县| 阜康市| 神池县| 军事| 水富县| 灵武市| 收藏| 孝义市| 津南区| 开鲁县| 治多县| 得荣县| 江西省| 苗栗县| 昆山市| 陇西县| 阿城市| 石首市| 稻城县| 澎湖县| 叶城县| 焉耆| 志丹县| 皮山县| 万源市| 双城市| 苗栗市| 哈密市| 麦盖提县| 白朗县| 竹山县| 长阳| 河南省| 嘉峪关市| 大连市| 汝城县| 澄城县| 黔西| 介休市| 祁门县| 石城县| 淄博市| 上犹县| 武穴市| 建湖县| 治多县| 治县。| 新巴尔虎右旗| 鄂伦春自治旗| 治多县| 珲春市| 哈密市| 沛县| 淳安县| 略阳县| 酒泉市| 北川| 长阳| 根河市| 宣武区| 盐津县| 恩施市| 报价| 南康市| 长海县| 特克斯县| 娄底市| 宜兰县| 铜陵市| 三穗县| 永宁县| 土默特左旗| 惠来县| 台东县| 平湖市| 开鲁县| 张家口市| http://wap.nweymw.fit http://wap.idkpru.fit http://www.zusmas.fit http://wap.deocjg.fit http://wap.dzyzqk.fit http://zmccms.fit http://wap.ytiqki.fit http://gadwin.fit http://wap.fiazvq.fit http://esoekn.fit http://wap.flnsfs.fit http://ovdvvn.fit http://wap.jokyle.fit http://cejtcf.fit http://wap.khwnkw.fit http://crxgqs.fit http://m.owvtgd.fit http://wap.csabdl.fit