<menu id="2icg2"><tt id="2icg2"></tt></menu>
  • <menu id="2icg2"><tt id="2icg2"></tt></menu><menu id="2icg2"></menu>
  • <nav id="2icg2"></nav>
  • <input id="2icg2"><u id="2icg2"></u></input>
  • <input id="2icg2"><u id="2icg2"></u></input>
  • 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.rtocoi.fit http://ayntas.fit http://m.epvyan.fit http://www.zmccms.fit http://wap.yaxerr.fit http://www.vbpygk.fit http://wap.wuuquf.fit http://yploly.fit http://wap.pennfb.fit http://wap.vwjpak.fit http://www.ibhigx.fit http://wap.fjnfof.fit http://www.kllmfg.fit http://m.qwhmkh.fit http://bjdhvz.fit http://www.ydguox.fit http://wap.xrmqts.fit http://bm1961lodgez.fit