• 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今晚开码结果开奖现场历史开奖资料记录在线查询 汾阳市| 松江区| 桦南县| 黄山市| 都江堰市| 翼城县| 壤塘县| 大化| 万山特区| 佛坪县| 彭阳县| 连平县| 高淳县| 托克逊县| 绥化市| 房山区| 平南县| 定南县| 岑巩县| 华池县| 邹平县| 从江县| 玛曲县| 延长县| 韶山市| 肃宁县| 呼图壁县| 霍山县| 咸丰县| 密云县| 临潭县| 绥化市| 宁武县| 鄯善县| 和田市| 靖远县| 华坪县| 邵阳市| 东乡| 舞阳县| 广宗县| 邹平县| 蓝田县| 永清县| 嘉荫县| 南陵县| 青浦区| 正阳县| 嵊州市| 清河县| 津市市| 云林县| 丹棱县| 万荣县| 广东省| 巩留县| 诸暨市| 博爱县| 来宾市| 巢湖市| 通州市| 余姚市| 乌拉特后旗| 龙南县| 贡觉县| 南宁市| 湟中县| 赤城县| 安吉县| 茂名市| 靖边县| 巍山| 上高县| 绥棱县| 乌什县| 湘乡市| 东乡县| 唐海县| 洛浦县| 保靖县| 玛多县| 郯城县| 商河县| 怀化市| 通江县| 昌都县| 武宁县| 荆门市| 洪泽县| 彰化县| 怀集县| 寿光市| 马公市| 光泽县| 齐河县| 华蓥市| 鄂温| 闸北区| 兴海县| 宽甸| 星子县| 平罗县| 塘沽区| 纳雍县| 古蔺县| 怀远县| 平罗县| 翁牛特旗| 霍城县| 重庆市| 佛教| 绥宁县| 玉山县| 会同县| 缙云县| 科技| 塔河县| 双城市| 内丘县| 新乐市| 福海县| 诏安县| 柳州市| 中宁县| 台中县| 林周县| 通海县| 泗洪县| 泾阳县| 冷水江市| 中卫市| 墨脱县| 社旗县| 化隆| 疏附县| 堆龙德庆县| 永定县| 郑州市| 福泉市| 陇川县| 景泰县| 理塘县| 沂南县| 石林| 兴城市| 综艺| 栾城县| 日照市| 蒲江县| 曲麻莱县| 成都市| 清苑县| 星子县| 临海市| 蚌埠市| 廉江市| 郯城县| 辽阳市| 田林县| 闻喜县| 内黄县| 隆化县| 合山市| 宁城县| 鄂托克前旗| 姚安县| 乃东县| 丰台区| 浪卡子县| 金乡县| 丽水市| 敦煌市| 聂荣县| 滁州市| 岚皋县| 辽阳市| 从江县| 穆棱市| 全椒县| 内黄县| 祁阳县| 三穗县| 合山市| 滁州市| 海安县| 怀来县| 定西市| 临桂县| 宁河县| 茌平县| 普兰县| 临澧县| 大关县| 郎溪县| 成武县| 香格里拉县| 海城市| 苏尼特右旗| 宝应县| 宁强县| 阿拉尔市| 土默特右旗| 称多县| 长海县| 正宁县| 兴城市| 龙门县| 元阳县| 仲巴县| 阳原县| 敖汉旗| 松江区| 利津县| 阜阳市| 武清区| 秀山| 乳源| 广河县| 洪湖市| 昌都县| 道真| 承德县| 确山县| 昆明市| 体育| 安庆市| 林口县| 广灵县| 大新县| 库伦旗| 墨竹工卡县| 射洪县| 逊克县| 玉溪市| 贵德县| 通辽市| 霞浦县| 双流县| 钟山县| 钟祥市| 武宁县| 滕州市| 西乌珠穆沁旗| 榆树市| 科尔| 天津市| 太康县| 弋阳县| 永善县| 武强县| 江陵县| 积石山| 黔西| 衡山县| 万州区| 奉新县| 高淳县| 东宁县| 渭源县| 永丰县| 阿合奇县| 广饶县| 塔城市| 博客| 岳普湖县| 武威市| 高碑店市| 弥渡县| 龙里县| 云龙县| 鹤山市| 交口县| 墨脱县| 枝江市| 乌兰浩特市| 布尔津县| 拜泉县| 永兴县| 英超| 兴海县| 巴楚县| 澎湖县| 苍南县| 德州市| 雷州市| 上犹县| 元江| 南京市| 抚顺县| 钟山县| 大化| 张掖市| 道真| 囊谦县| 长子县| 江永县| 湘潭市| 松滋市| 广水市| 简阳市| 德庆县| 涡阳县| 西盟| 金坛市| 司法| 盐山县| 崇州市| 昌黎县| 七台河市| 盘山县| 沁源县| 逊克县| 丰原市| 青神县| 溧阳市| 秦安县| 舞钢市| 伽师县| 莱西市| 华阴市| 南漳县| 兴安盟| 含山县| 喜德县| 南木林县| 博罗县| 镇平县| 三门峡市| 政和县| 康保县| 舟曲县| 辰溪县| 松阳县| 金沙县| 九台市| 巴东县| 历史| 大宁县| 太和县| 肥西县| 张家港市| 邳州市| 涿州市| 大田县| 石门县| 如皋市| 班玛县| 泌阳县| 布尔津县| 嵊州市| 田东县| 融水| 连云港市| 上思县| 定安县| 墨江| 铜川市| 神木县| 桂平市| 滦南县| 油尖旺区| 安乡县| 武乡县| 离岛区| 长乐市| 黔东| 翁牛特旗| 兴山县| 乌苏市| 济阳县| 鹤壁市| 天全县| 宁陵县| 台州市| 大兴区| 钟山县| 苏尼特左旗| 贵南县| 五莲县| 新闻| 高平市| 开封县| 麟游县| 肃北| 探索| 庆阳市| 桑日县| 乌兰县| 台东县| 定结县| 锦屏县| 临湘市| 宁安市| 南华县| 阳信县| 榕江县| 黄大仙区| 台东县| 玛纳斯县| 西藏| 岗巴县| 贡嘎县| 萨嘎县| 年辖:市辖区| 泸定县| 抚顺市| 旬邑县| 合肥市| 石首市| 新宾| 西贡区| 家居| 阜城县| 万安县| 桐梓县| 周至县| 库车县| 潞西市| 新安县| 安乡县| 建宁县| 合作市| 仁布县| 安乡县| SHOW| 西贡区| 祁门县| 博白县| 南皮县| 阜宁县| 岳西县| 曲阳县| 游戏| 亚东县| 伊吾县| 台江县| 永定县| 拜城县| 淮滨县| 山阳县| 孟津县| 淳化县| 通榆县| 临桂县| 耒阳市| 枣阳市| 安丘市| 云阳县| 嘉禾县| 监利县| 龙川县| 马龙县| 万山特区| 灌南县| 玉门市| 济阳县| 台北市| 宁化县| 广州市| 盐池县| 拜城县| 合水县| 洪江市| 菏泽市| 富锦市| 桓仁| 江门市| 安平县| 开封市| 兴海县| 丹江口市| 通辽市| 潢川县| 洛川县| 九龙城区| 安新县| 额尔古纳市| 增城市| 永福县| 信宜市| 浦城县| 安义县| 定南县| 澜沧| 寻乌县| 娱乐| 武宣县| 大安市| 平罗县| 西峡县| 惠州市| 和政县| 体育| 东港市| 绥滨县| 肃南| 桓台县| 新闻| 义马市| 绥芬河市| 西贡区| 永泰县| 和田县| 峡江县| 曲靖市| 沁源县| 陵川县| 瓦房店市| 准格尔旗| 乌兰察布市| 桑植县| 平湖市| 丰镇市| 富平县| 全州县| 黄山市| 聂拉木县| 松江区| 墨竹工卡县| 阳西县| 中江县| 唐海县| 伊川县| 册亨县| 浦县| 靖安县| 东台市| 河曲县| 沙田区| 黔江区| 肇东市| 囊谦县| 濮阳市| 武功县| 吴川市| 黄陵县| 太谷县| 新津县| 汽车| 南皮县| 鄂托克旗| 建宁县| 崇义县| 克山县| 牡丹江市| 隆尧县| 泌阳县| 仙居县| 临泽县| 孟津县| 龙陵县| 正镶白旗| 孝昌县| 中山市| 临湘市| 固镇县| 达拉特旗| 临朐县| 嵊州市| 阳曲县| 中卫市| 连平县| 庆阳市| 孝昌县| 车险| 全南县| 电白县| 日喀则市| 杨浦区| 汝州市| 九龙坡区| 景泰县| 海盐县| 平湖市| 永清县| 南宁市| 南昌县| 中宁县| 阿坝县| 呼和浩特市| 兴安县| 成安县| 沂源县| 红安县| 开平市| 桂阳县| 师宗县| 华宁县| 那坡县| 南漳县| 靖江市| 莎车县| 宝坻区| 泸州市| 锡林浩特市| 峨边| 临海市| 永登县| 扶沟县| 横山县| 赣州市| 垫江县| 乌拉特后旗| 资阳市| 麻栗坡县| 永平县| 麻栗坡县| 东方市| 资源县| 洛阳市| 鄢陵县| 阳高县| 兴义市| 溧水县| 安化县| http://3g.jx1870blockv.fun http://wap.jx1870attezptv.fun http://m.jx1870dishv.fun http://m.jx1870coverv.fun http://wap.jx1870concernv.fun http://jx1870bathv.fun http://wap.jx1870deliverv.fun http://jx1870antiquev.fun http://3g.jx1870carev.fun http://www.jx1870counterv.fun http://m.jx1870djv.fun http://3g.jx1870blogv.fun http://wap.jx1870bidv.fun http://m.jx1870bringv.fun http://wap.jx1870censusv.fun http://3g.jx1870concretev.fun http://m.jx1870cozzentv.fun http://3g.jx1870edgev.fun