• 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 }
    相关文章
    相关标签/搜索
    四肖八码中特二四六天天好彩免费资料大全香港马会最快开奖现场开奖结果免费资料历史记录大全一肖一码期期准1 一在线查询网 荔浦县| 昌都县| 巴彦淖尔市| 金川县| 松溪县| 商南县| 东港市| 邹平县| 富阳市| 呼伦贝尔市| 清水河县| 古蔺县| 尉犁县| 黄陵县| 莱阳市| 永靖县| 蒙城县| 绿春县| 芒康县| 麟游县| 广州市| 广州市| 西昌市| 三门峡市| 邯郸市| 渭源县| 凭祥市| 方城县| 河西区| 宣威市| 喀喇沁旗| 来安县| 德钦县| 黔西| 巴青县| 天气| 若尔盖县| 漳浦县| 南安市| 霍山县| 大城县| 同仁县| 阳山县| 安吉县| 台江县| 濉溪县| 科尔| 沿河| 观塘区| 临汾市| 富锦市| 湘乡市| 城固县| 尉犁县| 武定县| 来宾市| 姜堰市| 文成县| 曲周县| 洛阳市| 寻甸| 靖远县| 桃园市| 靖江市| 济阳县| 牡丹江市| 伊金霍洛旗| 德清县| 收藏| 多伦县| 醴陵市| 伊春市| 普定县| 溧阳市| 宣威市| 清苑县| 武邑县| 盐城市| 六盘水市| 神木县| 凯里市| 利川市| 奎屯市| 绥滨县| 台南市| 句容市| 台东县| 阿拉善右旗| 陆河县| 明溪县| 南部县| 大名县| 咸宁市| 佛教| 泾川县| 靖远县| 井陉县| 文成县| 桑植县| 赣州市| 宁阳县| 安化县| 海林市| 玛纳斯县| 嫩江县| 佛坪县| 连江县| 中牟县| 通辽市| 新巴尔虎右旗| 平顺县| 通州市| 成都市| 右玉县| 通江县| 当阳市| 新民市| 天全县| 德州市| 资讯| 靖宇县| 景洪市| 宜昌市| 渭南市| 永清县| 启东市| 凤阳县| 嘉善县| 永嘉县| 文水县| 磴口县| 金华市| 饶阳县| 佛冈县| 阜城县| 东莞市| 通化县| 宁陵县| 得荣县| 同德县| 象山县| 汝州市| 平武县| 安岳县| 团风县| 昌乐县| 资兴市| 江油市| 仙游县| 盘锦市| 句容市| 永胜县| 吉林市| 长沙市| 鄂托克旗| 兴山县| 扶绥县| 肇庆市| 衡南县| 平阴县| 上饶县| 双城市| 武清区| 五华县| 克什克腾旗| 古交市| 德保县| 阿瓦提县| 勃利县| 吉首市| 毕节市| 青河县| 南投市| 康乐县| 汽车| 康定县| 普格县| 冕宁县| 简阳市| 都昌县| 徐水县| 建始县| 赤峰市| 驻马店市| 迁西县| 揭西县| 岫岩| 工布江达县| 泽州县| 武清区| 永昌县| 富源县| 襄城县| 镶黄旗| 黔西县| 台州市| 石棉县| 承德县| 罗定市| 阿克苏市| 营口市| 资溪县| 泽州县| 黄浦区| 桦甸市| 突泉县| 苗栗县| 玛纳斯县| 海兴县| 鲜城| 荔浦县| 大丰市| 叶城县| 霍邱县| 错那县| 灵璧县| 蕉岭县| 隆化县| 龙江县| 泸溪县| 桂东县| 舒城县| 莲花县| 金坛市| 四子王旗| 子洲县| 景洪市| 亳州市| 平凉市| 遂平县| 彭阳县| 阿尔山市| 铜鼓县| 丰城市| 高唐县| 枝江市| 修武县| 渝中区| 长宁县| 垫江县| 定陶县| 滨海县| 那曲县| 丹东市| 双桥区| 安泽县| 鄄城县| 察雅县| 盐山县| 嘉鱼县| 周至县| 科技| 文化| 措勤县| 昭通市| 勐海县| 余干县| 和平区| 云龙县| 江陵县| 太谷县| 平远县| 和田市| 枝江市| 宕昌县| 昔阳县| 玉山县| 会昌县| 屯昌县| 广平县| 宁陕县| 开平市| 霍山县| 永寿县| 宜春市| 淳化县| 平潭县| 阆中市| 托克逊县| 含山县| 凤山县| 辽中县| 民权县| 开封县| 威海市| 山东省| 临海市| 武强县| 宜川县| 神农架林区| 九江县| 寻甸| 郎溪县| 乐至县| 天镇县| 将乐县| 宜宾县| 嘉义县| 白山市| 永定县| 上饶市| 成都市| 攀枝花市| 钦州市| 高唐县| 辽阳市| 衡水市| 台北市| 水富县| 竹溪县| 镇坪县| 商都县| 社旗县| 阿荣旗| 长汀县| 舞阳县| 罗定市| 平顶山市| 广水市| 太康县| 福清市| 喀喇| 禹城市| 遵化市| 东源县| 临汾市| 水城县| 嘉荫县| http://3g.bo2020ships.fun http://3g.gz1980seezc.fun http://3g.jvz1j2r5o.fun http://3g.bo2020seasons.fun http://3g.bo2020zoons.fun http://3g.gz1980headc.fun http://3g.yqo0j9rl7v.fun http://3g.bo2020foots.fun http://3g.gz1980partyc.fun http://3g.yqo7j6rl2v.fun http://3g.bo2020lets.fun http://3g.gz1980coolc.fun http://3g.jvz0j0r0o.fun http://3g.gz1980generatec.fun http://3g.yqo8j5rl6v.fun http://3g.bo2020offs.fun http://3g.gz1980centerc.fun http://3g.yqo0j3rl2v.fun