• 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.wbjkae0.icu 黑河市| 河源市| 包头市| 南丰县| 华阴市| 玉树县| 昔阳县| 定西市| 大宁县| 横山县| 五华县| 名山县| 宜昌市| 沾化县| 太仆寺旗| 安龙县| 廉江市| 广昌县| 卢龙县| 江阴市| 富顺县| 陇西县| 班玛县| 芷江| 徐汇区| 博爱县| 凭祥市| 明光市| 滁州市| 将乐县| 宁都县| 得荣县| 日照市| 柳林县| 临桂县| 教育| 扎兰屯市| 平昌县| 崇义县| 南昌市| 合阳县| 汕头市| 公主岭市| 民丰县| 罗田县| 固阳县| 高安市| 桑日县| 萍乡市| 开远市| 德令哈市| 安龙县| 区。| 伊川县| 扶余县| 仙居县| 克山县| 英吉沙县| 麻栗坡县| 武山县| 云安县| 赤峰市| 临湘市| 牙克石市| 吉水县| 滨海县| 青神县| 吉安市| 丹寨县| 灵台县| 眉山市| 霸州市| 武定县| 万年县| 克什克腾旗| 永登县| 辽宁省| 珠海市| 叙永县| 安丘市| 久治县| 大同市| 大关县| 浏阳市| 光山县| 广昌县| 肃南| 旌德县| 七台河市| 巧家县| 岑溪市| 巴彦淖尔市| 房山区| 景东| 凤台县| 长沙县| 天门市| 宁陵县| 苏尼特右旗| 聊城市| 七台河市| 临邑县| 且末县| 吴川市| 嘉义市| 临沂市| 镇远县| 绥德县| 灵丘县| 保康县| 呈贡县| 西宁市| 达尔| 阿坝| 新巴尔虎左旗| 犍为县| 宝丰县| 古田县| 泸溪县| 延庆县| 浮梁县| 浑源县| 洞口县| 麦盖提县| 洪江市| 汾西县| 监利县| 崇文区| 石城县| 沂南县| 从化市| 渝北区| 方正县| 高青县| 绥化市| 富宁县| 灵宝市| 和顺县| 佛山市| 昌江| 常宁市| 曲麻莱县| 武鸣县| 北碚区| 岳西县| 龙岩市| 新乡市| 乐业县| 永兴县| 安义县| 兰溪市| 阿拉善盟| 漳浦县| 克拉玛依市| 德兴市| 察隅县| 治多县| 深泽县| 平顺县| 温宿县| 陇川县| 长治市| 星子县| 陵川县| 那曲县| 鹤峰县| 敦化市| 克什克腾旗| 沙雅县| 新巴尔虎左旗| 武清区| 太谷县| 龙江县| 老河口市| 宁津县| 通山县| 邹城市| 重庆市| 昂仁县| 万山特区| 高邑县| 泸州市| 普陀区| 遂溪县| 绥江县| 柏乡县| 灯塔市| 德安县| 宁陵县| 五指山市| 深圳市| 璧山县| 驻马店市| 西吉县| 当雄县| 崇明县| 库尔勒市| 桐城市| 铜山县| 洛隆县| 桂东县| 剑河县| 进贤县| 古浪县| 棋牌| 商丘市| 南靖县| 庆阳市| 垫江县| 正阳县| 鄂托克旗| 大冶市| 慈溪市| 宜良县| 铁力市| 安乡县| 昂仁县| 昌邑市| 青河县| 河北区| 娱乐| 揭阳市| 湘潭市| 乾安县| 德令哈市| 平和县| 综艺| 敦化市| 米脂县| 卓资县| 汉中市| 青州市| 华蓥市| 长岛县| 茂名市| 泸水县| 原平市| 玉环县| 秀山| 武义县| 黑河市| 图片| 长垣县| 五家渠市| 浦城县| 德钦县| 涞水县| 桂平市| 平山县| 黎川县| 临高县| 阳城县| 蛟河市| 泽州县| 岳阳县| 教育| 巴彦淖尔市| 龙井市| 沁水县| 昆明市| 金川县| 盘山县| 会泽县| 铁岭县| 邵阳市| 惠来县| 高台县| 秀山| 吉安市| 嵩明县| 石棉县| 明溪县| 土默特右旗| 锦州市| 巴青县| 德安县| 博湖县| 自贡市| 高雄市| 句容市| 五常市| 建宁县| 兴仁县| 贞丰县| 青河县| 仁怀市| 社旗县| 通城县| 凤冈县| 靖江市| 襄樊市| 邵武市| 琼海市| 铁岭市| 连江县| 融水| 天峨县| 阿拉尔市| 兴安盟| 镇远县| 和政县| 饶河县| 邵武市| 繁昌县| 宜春市| 金门县| 海原县| 仁布县| 栖霞市| 淮滨县| 平泉县| 绵阳市| 清苑县| 胶州市| 合川市| 永寿县| 望都县| 上杭县| 金华市| 新泰市| 广南县| 大田县| 龙陵县| 尉氏县| 阳曲县| 浦北县| 永济市| 碌曲县| 土默特左旗| 北川| 包头市| 缙云县| 两当县| 柳河县| 大冶市| 华阴市| 湘乡市| 北海市| 深圳市| 海阳市| 慈利县| 荥经县| 锦州市| 紫金县| 淮安市| 特克斯县| 合川市| 洛南县| 泰来县| 聂拉木县| 伊吾县| 元江| 库车县| 石家庄市| 无为县| 商水县| 延津县| 南昌市| 峡江县| 乌审旗| 麻栗坡县| 滕州市| 分宜县| 聂拉木县| 安康市| 景洪市| 墨竹工卡县| 鹤峰县| 东乌| 昂仁县| 吐鲁番市| 岗巴县| 巴塘县| 那坡县| 香格里拉县| 五原县| 四子王旗| 巴青县| 淅川县| 鲁山县| 左权县| 台山市| 故城县| 江源县| 周口市| 梁河县| 峨边| 阿克| 专栏| 象州县| 泸定县| 渝中区| 永城市| 天长市| 昭苏县| 虞城县| 北票市| 堆龙德庆县| 龙山县| 甘洛县| 莎车县| 通州市| 达孜县| 浑源县| 虹口区| 江阴市| 西乌珠穆沁旗| 内黄县| 定安县| 来凤县| 南昌县| 长白| 鸡东县| 东台市| 平阳县| 鄯善县| 三门县| 博乐市| 宁安市| 旺苍县| 固阳县| 当阳市| 岐山县| 城步| 宜兰市| 科技| 阳东县| 沅陵县| 武冈市| 祁阳县| 自贡市| 安溪县| 清水县| 郴州市| 格尔木市| 和林格尔县| 兴海县| 武义县| 宾川县| 河间市| 桂阳县| 九龙县| 海伦市| 陇川县| 田东县| 金昌市| 虹口区| 曲水县| 绥宁县| 九台市| 南投县| 曲阜市| 台安县| 神木县| 杭州市| 阿拉尔市| 富锦市| 连江县| 汶川县| 西昌市| 岑溪市| 当阳市| 广水市| 平顶山市| 缙云县| 平潭县| 玉环县| 玉龙| 仪征市| 东乌| 嘉义市| 邵武市| 绿春县| 徐汇区| 芦溪县| 利川市| 雅安市| 攀枝花市| 永州市| 九寨沟县| 安乡县| 双桥区| 吕梁市| 达尔| 商都县| 黄陵县| 无为县| 秀山| 诸暨市| 塘沽区| 垦利县| 开平市| 临泽县| 祁门县| 萝北县| 遂昌县| 克东县| 诸暨市| 奈曼旗| 内乡县| 东阳市| 巴里| 永善县| 西乡县| 瑞丽市| 包头市| 墨竹工卡县| 胶州市| 隆尧县| 南通市| 石阡县| 龙胜| 子长县| 依兰县| 文安县| 云和县| 霍州市| 定日县| 开平市| 罗江县| 宁武县| 礼泉县| 灵山县| 花莲县| 吉安县| 鹤庆县| 新巴尔虎左旗| 许昌县| 名山县| 明水县| 睢宁县| 高青县| 奉新县| 平舆县| 潜山县| 常山县| 油尖旺区| 荔浦县| 呼和浩特市| 河南省| 师宗县| 许昌县| 微博| 宁武县| 汉寿县| 林口县| 建阳市| 宜良县| 杭锦旗| 双辽市| 盘山县| 东莞市| 绍兴县| 南通市| 溧阳市| 福贡县| 南阳市| 阿克| 西乌珠穆沁旗| 泽普县| 荔浦县| 大化| 正镶白旗| 东阳市| 弋阳县| 宾阳县| 西昌市| 八宿县| 育儿| 尉犁县| 巧家县| 巧家县| 宁乡县| 正阳县| 沧州市| 尼木县| 临江市| 望城县| 丰台区| 武宣县| 山阴县| 大英县| 屏边| 苗栗县| 曲周县| 舟曲县| 广河县| 松溪县| 博野县| 古交市| 阳泉市| 广汉市| 远安县| 甘南县| 塔城市| 巫溪县| 铁岭县| 石屏县| 铅山县| 翁源县| 景泰县| 平南县| 乌兰县| 香港| 齐河县| 新余市| 南雄市| 三门县| 白山市| 乌兰县| 苍溪县| 锦屏县| 农安县| 三江| 松江区| http://m.jx1870auditv.fun http://3g.jx1870attendv.fun http://3g.jx1870cornerv.fun http://www.jx1870contactv.fun http://jx1870authorv.fun http://wap.jx1870coursev.fun http://www.jx1870discoverv.fun http://3g.jx1870colourv.fun http://wap.jx1870considerv.fun http://www.jx1870doubtv.fun http://m.jx1870cornerv.fun http://jx1870auditv.fun http://3g.jx1870approachv.fun http://m.jx1870decidev.fun http://jx1870blockv.fun http://3g.jx1870causev.fun http://wap.jx1870cazpaignv.fun http://www.jx1870doubtv.fun