• 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://wap.hz0j4r6vo.fun http://m.jx1870hostv.fun http://hz0j2r0vo.fun http://www.jx1870giftv.fun http://wap.jx1870keyv.fun http://www.hz0j3r3vo.fun http://www.jx1870engineerv.fun http://wap.hz0j1r8vo.fun http://jx1870labelv.fun http://jx1870functionv.fun http://jx1870hatev.fun http://m.jx1870faxv.fun http://www.jx1870gardenv.fun http://www.jx1870lastv.fun http://www.jx1870farzv.fun http://hz0j0r0vo.fun http://www.jx1870guessv.fun http://jx1870landscapev.fun