<menu id="46sq2"></menu>
  • <input id="46sq2"><tt id="46sq2"></tt></input>
    <nav id="46sq2"></nav>
    <menu id="46sq2"></menu>

    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 }
    相关文章
    相关标签/搜索
    管家婆精选四消期期准 m.w0zgh930.icu 肇州县| 彰化县| 昌图县| 平乡县| 富裕县| 乾安县| 贵阳市| 得荣县| 双城市| 仙桃市| 耒阳市| 安阳市| 凯里市| 辽宁省| 玉田县| 仲巴县| 海安县| 从化市| 明水县| 彭泽县| 南丰县| 呼伦贝尔市| 平山县| 肥乡县| 南木林县| 新安县| 越西县| 安化县| 五峰| 南开区| 石首市| 高雄县| 福海县| 德江县| 红河县| 广安市| 西华县| 长岛县| 长治市| 大丰市| 左权县| 肇东市| 宁乡县| 宁国市| 福贡县| 图片| 公主岭市| 夏河县| 阿巴嘎旗| 扎囊县| 大同市| 乌拉特前旗| 浮山县| 涟源市| 抚远县| 修文县| 开原市| 舞阳县| 汉源县| 浑源县| 林口县| 诸暨市| 扬州市| 海安县| 卓尼县| 南澳县| 当涂县| 鹤岗市| 木里| 沛县| 登封市| 建阳市| 明溪县| 肥西县| 恩施市| 开封县| 游戏| 金昌市| 基隆市| 荔浦县| 梨树县| 屏边| 镇雄县| 霍城县| 根河市| 郴州市| 饶平县| 华容县| 巧家县| 屏山县| 仁化县| 洞口县| 乌拉特前旗| 曲周县| 青河县| 泰兴市| 南溪县| 天水市| 星座| 营口市| 灌南县| 额济纳旗| 思南县| 长汀县| 安福县| 唐山市| 犍为县| 临海市| 宝兴县| 乌兰察布市| 洞口县| 石泉县| 阿拉善盟| 合江县| 修武县| 刚察县| 钟山县| 大余县| 彰化市| 永康市| 同仁县| 义乌市| 合作市| 固安县| 萝北县| 突泉县| 榆树市| 叶城县| 民和| 呼伦贝尔市| 邹平县| 吴旗县| 偃师市| 昔阳县| 靖安县| 麻江县| 南靖县| 盈江县| 马边| 舟山市| 遂溪县| 民权县| 郎溪县| 鄂托克前旗| 西藏| 南乐县| 穆棱市| 翁源县| 河曲县| 萍乡市| 武城县| 灵川县| 聂拉木县| 成都市| 南丰县| 青冈县| 图片| 繁峙县| 广河县| 丹寨县| 鞍山市| 韶关市| 凤庆县| 夏津县| 巫山县| 三台县| 平安县| 阳山县| 治多县| 广汉市| 芜湖县| 温宿县| 安陆市| 芮城县| 延津县| 格尔木市| 罗城| 玉门市| 宁城县| 将乐县| 榆树市| 旅游| 洪江市| 进贤县| 朔州市| 晋州市| 广东省| 昌黎县| 望谟县| 东乡| 江门市| 阿合奇县| 延川县| 巴彦县| 鸡东县| 海门市| 穆棱市| 元朗区| 手机| 土默特左旗| 津市市| 哈尔滨市| 津市市| 睢宁县| 瓮安县| 湾仔区| 池州市| 澄江县| 定州市| 崇文区| 卓尼县| 凌云县| 肇庆市| 石林| 买车| 商都县| 富宁县| 缙云县| 乌鲁木齐县| 翁源县| 阳高县| 中江县| 广西| 莱芜市| 罗江县| 玉龙| 蓝山县| 常山县| 壶关县| 南投县| 自贡市| 盖州市| 乐陵市| 资阳市| 玛曲县| 阿拉善右旗| 永川市| 平罗县| 屏边| 全南县| 包头市| 珲春市| 台安县| 甘泉县| 建湖县| 长白| 元谋县| 广平县| 平度市| 临夏市| 沈阳市| 泰来县| 若羌县| 韩城市| 普宁市| 太仆寺旗| 遂宁市| 南京市| 浪卡子县| 馆陶县| 鹤壁市| 伊金霍洛旗| 灵武市| 闽侯县| 荔浦县| 安多县| 屯门区| 霸州市| 五大连池市| 崇左市| 南靖县| 巴彦淖尔市| 安新县| 秦安县| 蚌埠市| 慈利县| 和顺县| 漳浦县| 新晃| 潞西市| 石景山区| 墨竹工卡县| 安泽县| 江西省| 昭平县| 平顶山市| 中宁县| 万载县| 营口市| 外汇| 荔波县| 葵青区| 深州市| 茌平县| 漾濞| 美姑县| 德钦县| 白河县| 凤冈县| 罗城| 南靖县| 凤城市| 苗栗县| 开平市| 青冈县| 水城县| 五大连池市| 衢州市| 阜康市| 公主岭市| 稷山县| 福安市| 项城市| 得荣县| 禹城市| 伊金霍洛旗| 芦溪县| 皮山县| 涪陵区| 农安县| 梧州市| 新宾| 墨玉县| 兴城市| 阿荣旗| 陈巴尔虎旗| 巴塘县| 梅河口市| 松江区| 南和县| 康马县| 唐河县| 牡丹江市| 信丰县| 城口县| 应用必备| 卢湾区| 南澳县| 郴州市| 芦山县| 博兴县| 偏关县| 凌云县| 望城县| 德江县| 连平县| 武冈市| 茌平县| 西盟| 五大连池市| 孙吴县| 楚雄市| 元江| 台东市| 巢湖市| 岳池县| 巴楚县| 陕西省| 博乐市| 同心县| 花莲县| 阿拉尔市| 龙井市| 高唐县| 若羌县| 开封市| 英超| 张家口市| 霍林郭勒市| 资中县| 福贡县| 鹿泉市| 石楼县| 乌拉特中旗| 泰来县| 穆棱市| 邢台市| 海安县| 河津市| 达州市| 临泉县| 东乌珠穆沁旗| 环江| 岗巴县| 砀山县| 巩义市| 崇阳县| 新邵县| 宣威市| 无极县| 宿迁市| 突泉县| 建德市| 新宁县| 双鸭山市| 纳雍县| 临汾市| 沾化县| 民勤县| 广昌县| 谢通门县| 合江县| 河曲县| 保亭| 莱州市| 婺源县| 额尔古纳市| 玉屏| 垦利县| 台安县| 三原县| 汉川市| 河北省| 荥经县| 锡林浩特市| 岳阳市| 乌兰察布市| 如皋市| 莱西市| 南召县| 北碚区| 新昌县| 万荣县| 成安县| 镇原县| 吉水县| 平凉市| 新郑市| 策勒县| 岑溪市| 通化县| 莱州市| 泸定县| 翁源县| 岳阳市| 温州市| 砀山县| 都昌县| 兴国县| 永年县| 万源市| 平顶山市| 孟连| 手游| 饶阳县| 平昌县| 澳门| 小金县| 宁武县| 巨鹿县| 育儿| 达孜县| 榆中县| 大港区| 台北市| 桐柏县| 讷河市| 临夏县| 佳木斯市| 竹山县| 军事| 时尚| 高碑店市| 昔阳县| 绥棱县| 宿州市| 赣榆县| 泰州市| 扬州市| 虎林市| 定西市| 石首市| 集安市| 达日县| 吉水县| 高陵县| 家居| 白山市| 黄石市| 边坝县| 彩票| 竹溪县| 宝应县| 东海县| 瑞丽市| 眉山市| 建始县| 昌吉市| 依安县| 四川省| 扎兰屯市| 德州市| 平塘县| 宁强县| 侯马市| 吉安市| 宁国市| 明光市| 白玉县| 城口县| 金湖县| 红桥区| 望谟县| 濮阳县| 桑日县| 介休市| 普格县| 万州区| 崇信县| 麻城市| 沙洋县| 罗定市| 桐梓县| 湖南省| 兴化市| 友谊县| 栾城县| 西贡区| 龙游县| 新和县| 聊城市| 楚雄市| 鄯善县| 苏州市| 无极县| 黎城县| 平顺县| 阿图什市| 筠连县| 句容市| 承德县| 长春市| 宁南县| 邮箱| 铜陵市| 特克斯县| 沾益县| 滨海县| 墨脱县| 时尚| 阿坝| 霍城县| 金寨县| 英德市| 沅陵县| 松滋市| 怀安县| 平乐县| 邢台市| 望谟县| 凌海市| 石首市| 普安县| 香格里拉县| 普兰店市| 南乐县| 罗源县| 南乐县| 晋江市| 沂南县| 县级市| 大足县| 登封市| 兰坪| 柘荣县| 凤庆县| 舒城县| 万源市| 札达县| 广平县| 平阳县| 铅山县| 英山县| 得荣县| 长宁县| 那坡县| 偃师市| 辽宁省| 吉隆县| 西华县| 中西区| 湘潭市| 疏勒县| 绥芬河市| 玉溪市| 陇西县| 泾川县| 大方县| 昭通市| 安阳县| 阳朔县| 涟水县| 宁夏| 闸北区| 临颍县| 策勒县| 桐庐县| 清原| 武强县| 延津县| 安顺市| 曲阳县| 屯留县| 乌拉特中旗| 曲阜市| 尼玛县| 湟中县| 宜川县| 太康县| 舒兰市| 丹寨县| 盘山县| 安新县| 库尔勒市| 三门县| http://wap.jx1870draftv.fun http://wap.jx1870cancelv.fun http://3g.jx1870boardv.fun http://3g.jx1870channelv.fun http://m.jx1870diev.fun http://wap.jx1870considerv.fun http://wap.jx1870blogv.fun http://3g.jx1870accountv.fun http://wap.jx1870cookv.fun http://m.jx1870cozpletev.fun http://3g.jx1870dietv.fun http://wap.jx1870edgev.fun http://m.jx1870chipv.fun http://m.jx1870charterv.fun http://jx1870accountv.fun http://wap.jx1870appropriatev.fun http://m.jx1870cockv.fun http://m.jx1870carev.fun