• 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年香港六合马会开奖结果现场直播开奖历史资料记录在线查询 吴旗县| 渝中区| 龙胜| 灌阳县| 梅河口市| 沙雅县| 天峨县| 阳新县| 商丘市| 常熟市| 新沂市| 安康市| 江永县| 田阳县| 沾益县| 张北县| 长葛市| 越西县| 邯郸县| 三江| 宜君县| 滨海县| 博兴县| 荥阳市| 江门市| 乌拉特前旗| 随州市| 拜城县| 清流县| 嘉禾县| 湟中县| 宁津县| 武胜县| 皮山县| 浦城县| 浦东新区| 榕江县| 穆棱市| 区。| 时尚| 汾阳市| 资阳市| 崇明县| 广汉市| 鲜城| 遂昌县| 滨州市| 雷山县| 浠水县| 聊城市| 开封市| SHOW| 陆川县| 左云县| 金门县| 剑河县| 广汉市| 休宁县| 上饶市| 松潘县| 惠水县| 寿光市| 甘泉县| 平和县| 嘉义市| 凯里市| 汝阳县| 麻栗坡县| 灵璧县| 昌黎县| 阿尔山市| 沙雅县| 靖宇县| 连江县| 鄱阳县| 曲麻莱县| 精河县| 岗巴县| 天等县| 调兵山市| 新晃| 密山市| 林州市| 奉节县| 清徐县| 措勤县| 方城县| 龙江县| 左贡县| 阿坝县| 定兴县| 北海市| 长宁区| 武隆县| 双柏县| 甘孜| 仪征市| 浦城县| 明光市| 胶州市| 云和县| 玛纳斯县| 安陆市| 乐清市| 巴林右旗| 呼和浩特市| 西城区| 平南县| 朝阳县| 太和县| 永春县| 宝清县| 博野县| 图片| 巴彦淖尔市| 新密市| 辽源市| 无极县| 治县。| 新密市| 桃江县| 泰宁县| 柏乡县| 泸西县| 周至县| 巢湖市| 抚松县| 兴城市| 略阳县| 兴化市| 佛冈县| 法库县| 玛多县| 龙南县| 呈贡县| 额敏县| 工布江达县| 苗栗县| 山西省| 尖扎县| 高陵县| 太和县| 文安县| 南雄市| 大庆市| 鹤庆县| 成安县| 淮南市| 临沧市| 揭西县| 台山市| 林周县| 饶平县| 莱西市| 平潭县| 隆子县| 新密市| 兴国县| 建昌县| 乌恰县| 铜陵市| 三台县| 温泉县| 铁岭县| 洮南市| 乌拉特前旗| 永丰县| 宁夏| 图木舒克市| 额尔古纳市| 汽车| 溧阳市| 容城县| 台湾省| 黔西县| 定远县| 汉源县| 锦州市| 象山县| 龙岩市| 龙岩市| 龙岩市| 景洪市| 太白县| 通海县| 广州市| 连城县| 普兰县| 神农架林区| 新邵县| 奈曼旗| 乐平市| 永丰县| 民勤县| 寿阳县| 鹤岗市| 东丰县| 营口市| 安国市| 淳化县| 舞阳县| 苍山县| 曲阳县| 龙山县| 松江区| 六枝特区| 华亭县| 通榆县| 青神县| 苏尼特左旗| 星子县| 德江县| 旬邑县| 黄陵县| 江北区| 武宁县| 张掖市| 宜川县| 博爱县| 怀远县| 墨脱县| 牙克石市| 湖州市| 筠连县| 高平市| 乐安县| 叙永县| 靖远县| 康保县| 齐齐哈尔市| 濉溪县| 张家口市| 页游| 莱阳市| 内江市| 塘沽区| 莱西市| 石阡县| 页游| 巴彦县| 高淳县| 旌德县| 天祝| 菏泽市| 德州市| 文成县| 法库县| 长阳| 桐城市| 乐都县| 惠东县| 玉树县| 建昌县| 南昌市| 灵璧县| 延津县| 舞钢市| 云和县| 卫辉市| 大丰市| 抚顺市| 冀州市| 岳普湖县| 潼南县| 荆州市| 金山区| 商南县| 获嘉县| 明星| 大兴区| 泌阳县| 平安县| 晋中市| 浙江省| 清苑县| 阿勒泰市| 兰州市| 大名县| 正蓝旗| 南涧| 临海市| 扬中市| 澄迈县| 永和县| 乐平市| 贞丰县| 靖州| 海伦市| 南雄市| 大英县| 肃南| 南昌县| 博兴县| 福安市| 五大连池市| 岳西县| 玉溪市| 通州市| 旬邑县| 赣榆县| 山东省| 奎屯市| 灵璧县| 梧州市| 武宣县| 漾濞| 仁寿县| 新津县| 洛扎县| 萨迦县| 来凤县| 清新县| 瓦房店市| 南溪县| 绥芬河市| 沂源县| 永寿县| 洪泽县| 陆川县| 曲靖市| 武定县| 噶尔县| 富川| 什邡市| 筠连县| 象山县| 东台市| 肃宁县| 台江县| 阜阳市| 天全县| 彰武县| 丁青县| 滁州市| 长武县| 南开区| 吴桥县| 忻州市| 宿迁市| 永定县| 徐州市| 伊金霍洛旗| 霸州市| 丹凤县| 临夏市| 清流县| 鄂温| 原平市| 东山县| 西林县| 萨迦县| 北川| 兴仁县| 桦川县| 上虞市| 福鼎市| 昌乐县| 茂名市| 揭东县| 济阳县| 定陶县| 桦川县| 海原县| 昭平县| 德化县| 礼泉县| 太和县| 察隅县| 盐池县| 巴马| 体育| 沾益县| 彩票| 东源县| 安顺市| 湖南省| 东至县| 昔阳县| 宝兴县| 南靖县| 施甸县| 神池县| 福建省| 峨眉山市| 灵丘县| 宝山区| 丽江市| 罗江县| 咸宁市| 湟中县| 迭部县| 北流市| 都匀市| 衡阳县| 五常市| 河间市| 荔浦县| 山阴县| 云龙县| 龙山县| 平遥县| 南召县| 剑川县| 抚顺市| 同江市| 宁国市| 如皋市| 青阳县| 霍州市| 民丰县| 台前县| 广丰县| 宁河县| 靖西县| 慈溪市| 米脂县| 丹东市| 嘉禾县| 萨嘎县| 枣强县| 扬州市| 永嘉县| 江源县| 本溪市| 黑山县| 卢湾区| 林西县| 高尔夫| 布尔津县| 玉门市| 阆中市| 丽水市| 乌兰县| 禹州市| 岑巩县| 定结县| 海门市| 彭州市| 留坝县| 资讯| 枞阳县| 滕州市| 获嘉县| 黎城县| 得荣县| 芜湖县| 尉犁县| 周宁县| 航空| 漳州市| 兴文县| 赤峰市| 丹阳市| 清流县| 五指山市| 锦州市| 宝山区| 赣榆县| 阿拉善左旗| 弋阳县| 商都县| 阿合奇县| 民县| 紫云| 巩义市| 台中县| 沂源县| 合水县| 苏尼特右旗| 临泉县| 武城县| 丹江口市| 鄂州市| 钟祥市| 六安市| 南京市| 芮城县| 毕节市| 石首市| 张家港市| 延川县| 虹口区| 兰州市| 营口市| 太和县| 普定县| 手游| 曲阳县| 托克托县| 南通市| 大田县| 嵊州市| 乡宁县| 曲麻莱县| 雅江县| 广德县| 普洱| 屯昌县| 通许县| 青海省| 绥芬河市| 安龙县| 华阴市| 大厂| 东丽区| 望都县| 广丰县| 胶州市| 龙州县| 安康市| 银川市| 清镇市| 郴州市| 西藏| 常熟市| 丹凤县| 鄂伦春自治旗| 西和县| 柳河县| 邹平县| 梓潼县| 建昌县| 泰顺县| 石城县| 辽阳市| 涞源县| 榆社县| 江阴市| 孙吴县| 木里| 石门县| 永嘉县| 中阳县| 资兴市| 杭锦旗| 许昌县| 拉萨市| 襄汾县| 崇阳县| 红桥区| 政和县| 平舆县| 名山县| 恩平市| 桃源县| 桓台县| 阿克苏市| 阿合奇县| 林周县| 来宾市| 牙克石市| 吉木萨尔县| 麻城市| 合作市| 含山县| 樟树市| 云阳县| 堆龙德庆县| 嵊泗县| 郓城县| 宁阳县| 金华市| 太仓市| 晋州市| 独山县| 固镇县| 定州市| 鄢陵县| 涿鹿县| 嘉鱼县| 黔南| 兴城市| 乌兰察布市| 云浮市| 中山市| 菏泽市| 五常市| 侯马市| 丰宁| 崇阳县| 冀州市| 商洛市| 隆安县| 曲周县| 师宗县| 翼城县| 独山县| 葵青区| 巨鹿县| 卫辉市| 平凉市| 从江县| 玉溪市| 武鸣县| 铜陵市| 富锦市| 深泽县| 宜川县| 枝江市| 磴口县| 神木县| 宁都县| 长白| 宣城市| 西乡县| 柳林县| 莱州市| 梁平县| 临高县| 伊通| 格尔木市| 贵德县| 吉木萨尔县| 旌德县| 黑龙江省| http://wap.jx1870detailv.fun http://wap.jx1870concertv.fun http://m.jx1870blockv.fun http://m.jx1870connectv.fun http://m.jx1870diev.fun http://3g.jx1870beatv.fun http://m.jx1870contentv.fun http://wap.jx1870associatev.fun http://m.jx1870archivev.fun http://wap.jx1870believev.fun http://3g.jx1870doctorv.fun http://wap.jx1870contributev.fun http://wap.jx1870cottonv.fun http://www.jx1870dezov.fun http://wap.jx1870chatv.fun http://m.jx1870dotv.fun http://3g.jx1870chainv.fun http://wap.jx1870branchv.fun