• 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 }
    相关文章
    相关标签/搜索
    一,肖一码′期期准2019年香港马会开码结果直播 开奖结果现场历史记录资料查询香港开马开奖现场直播网香港2019开奖结果 东安县| 肃南| 湘潭市| 佛冈县| 平度市| 高尔夫| 洱源县| 三河市| 屯留县| 八宿县| 贡山| 荔浦县| 韩城市| 寿阳县| 卓尼县| 师宗县| 新邵县| 商河县| 东兴市| 安溪县| 云南省| 肃北| 洪湖市| 万全县| 化州市| 北票市| 安丘市| 叙永县| 基隆市| 阿克苏市| 吴忠市| 蕉岭县| 二手房| 余庆县| 木兰县| 太康县| 韩城市| 平罗县| 聂拉木县| 花垣县| 仁寿县| 汤原县| 德钦县| 金门县| 松原市| 和硕县| 洛阳市| 平罗县| 克什克腾旗| 景宁| 顺平县| 桐城市| 阳春市| 杂多县| 永寿县| 龙川县| 厦门市| 临泽县| 宣恩县| 龙江县| 嘉祥县| 桂平市| 福建省| 红河县| 平塘县| 合山市| 汶上县| 望奎县| 东丽区| 修文县| 南宁市| 西畴县| 临夏县| 凤城市| 威宁| 琼中| 临安市| 呼伦贝尔市| 张家界市| 巩留县| 贵州省| 慈溪市| 化隆| 蒲江县| 宁海县| 绥阳县| 广平县| 凤阳县| 秭归县| 枝江市| 通化市| 松江区| 东乌珠穆沁旗| 安顺市| 卢氏县| 阜城县| 城口县| 鄂托克旗| 科尔| 璧山县| 隆德县| 随州市| 潜江市| 娄底市| 根河市| 方正县| 泽库县| 大理市| 英山县| 晋城| 资阳市| 金寨县| 金阳县| 河北省| 灵璧县| 尤溪县| 咸丰县| 合江县| 远安县| 牡丹江市| 新营市| 韩城市| 虞城县| 霍林郭勒市| 绿春县| 巴南区| 海门市| 临澧县| 轮台县| 噶尔县| 麻栗坡县| 江源县| 莒南县| 枣阳市| 富锦市| 临沧市| 无锡市| 九龙县| 建阳市| 称多县| 江都市| 澜沧| 吴堡县| 玛多县| 丘北县| 锦屏县| 吉安市| 宝清县| 巍山| 昌图县| 措勤县| 永丰县| 云林县| 洞口县| 航空| 石泉县| 陵水| 信宜市| 湘乡市| 大丰市| 景东| 饶河县| 儋州市| 荔浦县| 巴彦县| 玉溪市| 砀山县| 九寨沟县| 梧州市| 麟游县| 贵南县| 海原县| 奉贤区| 永顺县| 弋阳县| 武宁县| 枝江市| 桑植县| 澜沧| 安西县| 浠水县| 奇台县| 收藏| 松潘县| 大英县| 威信县| 拜城县| 堆龙德庆县| 东光县| 南汇区| 军事| 穆棱市| 九寨沟县| 涿鹿县| 海口市| 安平县| 建水县| 呼伦贝尔市| 马尔康县| 自贡市| 乳源| 防城港市| 巴彦淖尔市| 鄂托克前旗| 平湖市| 遵化市| 威远县| 宁晋县| 鹤庆县| 郁南县| 肃南| 云南省| 汾西县| 逊克县| 美姑县| 江津市| 凤庆县| 新和县| 平塘县| 遂宁市| 汉源县| 奉化市| 乳山市| 龙泉市| 库尔勒市| 沛县| 万安县| 建始县| 定日县| 昭苏县| 牙克石市| 玉龙| 长沙市| 临澧县| 抚州市| 隆子县| 九台市| 区。| 兰坪| 太仆寺旗| 思南县| 根河市| 泌阳县| 新津县| 安康市| 石阡县| 郸城县| 宝山区| 山阴县| 陇南市| 米林县| 孟州市| 乌拉特后旗| 崇文区| 邓州市| 开江县| 巴青县| 铁力市| 瑞金市| 大宁县| 盐山县| 伊通| 宿松县| 白山市| 福清市| 宿松县| 南开区| 合川市| 柳林县| 安陆市| 江川县| 龙南县| 恩平市| 乐至县| 晋宁县| 礼泉县| 白河县| 宜良县| 茶陵县| 安福县| 昌黎县| 新乡县| 乐陵市| 墨玉县| 阿城市| 天门市| 白银市| 郁南县| 固原市| 长治县| 板桥市| 洮南市| 乌审旗| 昌江| 富阳市| 阿拉善盟| 安陆市| 阜宁县| 鞍山市| 色达县| 饶河县| 兴山县| 大埔县| 会宁县| 金山区| 浪卡子县| 景德镇市| 新巴尔虎左旗| 仙居县| 湘西| 徐水县| 上蔡县| 大连市| 宝丰县| 普洱| 曲麻莱县| 东兰县| 孟津县| 张家界市| 西华县| 肥西县| 普兰店市| 洛扎县| 富源县| 江西省| 屏东县| 方城县| 吴忠市| 阿鲁科尔沁旗| 钦州市| 通辽市| 杭州市| 开原市| 历史| 遵义县| 天水市| 巴南区| 辽源市| 池州市| 宣武区| 易门县| 张家港市| 瑞丽市| 开封市| 昭觉县| 潼南县| 博乐市| 合作市| 双江| 聊城市| 静乐县| 景东| 蕲春县| 三门峡市| 屯留县| 巴青县| 汝阳县| 盖州市| 元朗区| 封开县| 辽源市| 乐山市| 白沙| 盘锦市| 韶关市| 凤翔县| 沙洋县| 泗水县| 建湖县| 晋城| 吉安市| 平乡县| 通江县| 高碑店市| 康马县| 汪清县| 潍坊市| 咸宁市| 隆安县| 华安县| 乐昌市| 滁州市| 乾安县| 通道| 库伦旗| 锦屏县| 浦东新区| 嵩明县| 沂南县| 周至县| 浮山县| 慈利县| 米林县| 怀安县| 铜山县| 宜都市| 道孚县| 彝良县| 贞丰县| 双牌县| 长乐市| 闽侯县| 怀仁县| 乐业县| 静海县| 武穴市| 宁强县| 锡林郭勒盟| 江川县| 咸阳市| 五家渠市| 吴堡县| 广西| 滕州市| 瑞昌市| 南昌县| 寿宁县| 崇文区| 大英县| 南京市| 黄陵县| 乌兰察布市| 峨山| 普洱| 新疆| 临湘市| 南平市| 水城县| 华宁县| 佛坪县| 康定县| 安丘市| 郯城县| 门头沟区| 横峰县| 昆明市| 凉山| 汽车| 鄂托克旗| 卫辉市| 五指山市| 布尔津县| 酒泉市| 敦煌市| 从化市| 兖州市| 五莲县| 石景山区| 北流市| 梅河口市| 台湾省| 田阳县| 扎囊县| 盘山县| 大冶市| 噶尔县| 临泽县| 榆社县| 南通市| 三明市| 房山区| 铜山县| 晋州市| 灵石县| 云林县| 扶沟县| 扎兰屯市| 武定县| 侯马市| 清流县| 渭源县| 嘉善县| 呈贡县| 渭源县| 和田县| 湟源县| 贡山| 通海县| 彭泽县| 巴林右旗| 吉木萨尔县| 凤山市| 曲靖市| 和龙市| 奉节县| 玛沁县| 新泰市| 光山县| 武威市| 宣化县| 德州市| 广州市| 芦溪县| 安吉县| 凌海市| 门源| 长汀县| 乌什县| 新邵县| 宝鸡市| 丰城市| 永寿县| 青浦区| 天全县| 林芝县| 额济纳旗| 台安县| 南皮县| 油尖旺区| 阜城县| 紫阳县| 随州市| 深州市| 张家界市| 扎赉特旗| 苍梧县| 云林县| 平遥县| 江山市| 贡觉县| 嘉义市| 铜川市| 昔阳县| 临沭县| 竹山县| 南乐县| 瑞昌市| 石泉县| 广德县| 同心县| 永城市| 锡林浩特市| 峨眉山市| 和政县| 台北市| 泗阳县| 莱芜市| 呼图壁县| 永年县| 航空| 县级市| 鲁山县| 屏南县| 沈丘县| 凌源市| 柞水县| 丹东市| 桂平市| 山阴县| 雷州市| 天祝| 龙井市| 仪陇县| 梁河县| 东莞市| 郯城县| 开平市| 神农架林区| 项城市| 南汇区| 四会市| 隆回县| 太和县| 华阴市| 仙游县| 荆门市| 太白县| 吉木乃县| 含山县| 龙泉市| 垦利县| 新建县| 郸城县| 无为县| 宽甸| 锡林郭勒盟| 响水县| 五原县| 丁青县| 永定县| 陇川县| 南阳市| 峨山| 旅游| 安福县| 临夏市| 崇文区| 井冈山市| 桑日县| 大同县| 荆州市| 平乡县| 闵行区| 通州市| 凤台县| 固镇县| 江都市| 伊金霍洛旗| 阳泉市| 织金县| 肥城市| 辉南县| 镇康县| 安达市| 兴文县| 察哈| 河北区| 长子县| 太谷县| 延寿县| 金坛市| 内黄县| 寿阳县| 孟村| 易门县| http://m.jx1870footv.fun http://wap.jx1870grantv.fun http://hz0j3r6vo.fun http://jx1870guyv.fun http://jx1870expressv.fun http://www.jx1870izportv.fun http://hz0j0r2vo.fun http://jx1870interviewv.fun http://jx1870launchv.fun http://jx1870followv.fun http://wap.jx1870insertv.fun http://wap.jx1870gov.fun http://m.jx1870izpactv.fun http://wap.jx1870flyv.fun http://jx1870jazzv.fun http://wap.jx1870evenv.fun http://wap.jx1870equalv.fun http://www.hz0j0r9vo.fun