SQL Server 导入和导出数据向导只可以处理简单的数据传送,对于复杂的传送数据的需求,还需要使用SSDT来实现。
SSDT表(System Service Descriptor Table)是Windows操作系统内核中的关键组成部分,负责存储系统服务调用的相关信息。具体而言,SSDT表包含了系统调用的函数地址以及其他与系统服务相关的信息。每个系统调用对应SSDT表中的一个表项,其中存储了相应系统服务的函数地址。SSDT表在64位和32位系统上可能有不同的结构,但通常以数组形式存在。
三年前面朝黄土背朝天的我,写了一篇如何在Windows 7系统下枚举内核SSDT表的文章《驱动开发:内核读取SSDT表基址》三年过去了我还是个单身狗,开个玩笑,微软的Windows 10系统已经覆盖了大多数个人PC终端,以前的方法也该进行迭代更新了,或许在网上你能够找到类似的文章,但我可以百分百肯定都不能用,今天LyShark将带大家一起分析Win10 x64最新系统SSDT表的枚举实现。
在64位系统下我们可以通过读取msr 寄存器来获取内核函数入口. msr在开启内核隔离模式下获取的是 KiSystemCall64Shadow 而在未开启内核模式下则是获取的 KiSystemCall64
KeServiceDescriptorTableShadow是ShadowSSDT表 KeServiceDescriptorTable是SSDT表.
SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的。
我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数地址则是操作系统给的.
SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序,来实现搜索 SSDT 函数的地址,并能够实现简单的内核 Hook 挂钩。
【详细过程】 这次主要说说核心层的hook。包括SSDT-hook,IDT-hook,sysenter-hook。欢迎讨论,指正!内核层需要驱动,有这方面的基础最好,如果不会,了解下其中的思路也可以的。 II. SSDT-hook,IDT-hook,sysenter-hook 一.SSDT-hook (一)一般思路: 1.先来了解一下,什么是SSDT SSDT既System Service Dispath Table。在了解他之前,我们先了解一下NT的基本组建。在 Windows NT 下,NT 的 executive(NTOSKRNL.EXE 的一部分)提供了核心系统服务。各种 Win32、OS/2 和 POSIX 的 APIs 都是以 DLL 的形式提供的。这些dll中的 APIs 转过来调用了 NT executive 提供的服务。尽管调用了相同的系统服务,但由于子系统不同,API 函数的函数名也不同。例如,要用Win32 API 打开一个文件,应用程序会调用 CreateFile(),而要用 POSIX API,则应用程序调用 open() 函数。这两种应用程序最终都会调用 NT executive 中的 NtCreateFile() 系统服务。
PVOID ServiceTableBase;
首发于跳跳糖社区:https://tttang.com/archive/1546/
在前面的博文《驱动开发:Win10内核枚举SSDT表基址》中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则可以定义字符串列表,以此循环调用GetSSDTFunctionAddress()函数得到,当然在此之间也可以调用系统提供的MmGetSystemRoutineAddress()函数顺便把当前地址拿到,并通过循环方式得到完整的SSDT列表。
在SSDT中开发SSAS数据模型,整体体验是非常棒的,继承了微软一贯的图形化界面操作的友好度,特别是对Excel和PowerBIDeskTop群体来说,无缝过渡到SSDT的操作。
我们知道杀软在API函数的监控上一般有两种手段,一种是在3环直接通过挂钩到自己的函数判断是否调用了这个API,另外一种方式就是在0环去往SSDT表的路径上挂钩来判断进0环后的操作。那么我们如果不想杀软监控我们的行为,之前提过的内核重载是一种绕过的方式,但是内核重载的动静太大,这里我们就通过直接重写3环到0环的API,通过重写KiFastCallEntry来自己调用内核的函数,以达到规避杀软的效果。
SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。
SSDT 的全称是 System Services Descriptor Table,系统服务描述符表。这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来。SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。通过修改此表的函数地址可以对常用 Windows 函数及 API 进行 Hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些 HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。
64位内核第一讲,和32位内核的区别 双击调试配置请查看 连接: https://www.cnblogs.com/aliflycoris/p/5877323.html 一丶编译的区
x64下可以设置回调来进行过滤我们想要的功能.当然如果你简单的过一下PatchGuard也可以设置SSDT HOOK.
对于PowerBI爱好者群体,多数是玩Excel和PowerBIDesktop,没有上升到企业级BI的层次,对在企业级BI的SSAS上建模的工具比较陌生,这里简单给大家作一点点工具介绍。
内核重载听起来是一个很高大上的概念,但其实跟PE的知识息息相关,那么为什么会有内核重载的出现呢?
首发于奇安信攻防社区: https://forum.butian.net/share/1423
开调试可以关patch guard,因为int3会修改内核,如果pg还发挥作用就会蓝屏,没法调试了,所以调试即可关pg。bat代码如下:
要恢复SSDT,首先要获得SSDT各个函数的原始地址,而SSDT各个函数的原始地址,自然是存储在内核文件里的。于是,有了以下思路:
在前面的博文《驱动开发:内核读取SSDT表基址》中已经教大家如何寻找SSDT表基地址了,今天给大家分享两个适用于WinDBG调试器上的脚本文件,该脚本文件可以很好的枚举出当前系统内的SSDT以及SSSDT表中的数据,可以方便后续文章的学习参考之用,当然脚本不是我写的,文章末尾我会给出参考原文链接。
注意事项:OC对于有依赖的SSDT/KEXT加载顺序有严格要求,注意在config配置中的顺序。 主要适用于UEFI启动的电脑。 本文当前写作时OC正式版为0.5.9,0.6.0测试版。以下的配置适用于这两个版本,后续OC的更新可能会有些许改动,到时候应该再参考官方文档进行修改。
在软件开发行业,团队式开发是再正常不过了,不同的人从git中开一个分支进行开发,开发完后测试通过后进行合并到主项目中。
1、HOOK SERVICE TABLE:HOOK SSDT 这种方法对于拦截 NATIVE API 来说用的比较多。
******************************************************* 1,SSDT SSDT即系统服务描述符表,它的结构如下(参考《Undocument Windows 2000 Secretes》第二章): typedef struct _SYSTEM_SERVICE_TABLE { PVOID ServiceTableBase; //这个指向系统服务函数地址表 PULONG ServiceCounterTableBase; ULONG NumberOfService; //服务函数的个数,NumberOfService*4 就是整个地址表的大小 ULONG ParamTableBase; }SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE; typedef struct _SERVICE_DESCRIPTOR_TABLE { SYSTEM_SERVICE_TABLE ntoskrnel; //ntoskrnl.exe的服务函数 SYSTEM_SERVICE_TABLE win32k; //win32k.sys的服务函数,(gdi.dll/user.dll的内核支持) SYSTEM_SERVICE_TABLE NotUsed1; SYSTEM_SERVICE_TABLE NotUsed2; }SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE; 内核中有两个系统服务描述符表,一个是KeServiceDescriptorTable(由ntoskrnl.exe导出),一个是KeServieDescriptorTableShadow(没有导出)。两者的区别是,KeServiceDescriptorTable仅有ntoskrnel一项,KeServieDescriptorTableShadow包含了ntoskrnel以及win32k。一般的Native API的服务地址由KeServiceDescriptorTable分派,gdi.dll/user.dll的内核API调用服务地址由KeServieDescriptorTableShadow分派。还有要清楚一点的是win32k.sys只有在GUI线程中才加载,一般情况下是不加载的,所以要Hook KeServieDescriptorTableShadow的话,一般是用一个GUI程序通过IoControlCode来触发(想当初不明白这点,蓝屏死机了N次都想不明白是怎么回事)。 2,SSDT HOOK SSDT HOOK 的原理其实非常简单,我们先实际看看KeServiceDescriptorTable是什么样的。 lkd> dd KeServiceDescriptorTable 8055ab80 804e3d20 00000000 0000011c 804d9f48 8055ab90 00000000 00000000 00000000 00000000 8055aba0 00000000 00000000 00000000 00000000 8055abb0 00000000 00000000 00000000 00000000 在windbg.exe中我们就看得比较清楚,KeServiceDescriptorTable中就只有第一项有数据,其他都是0。其中804e3d20就是 KeServiceDescriptorTable.ntoskrnel.ServiceTableBase,服务函数个数为0x11c个。我们再看看804e3d20地址里是什么东西: lkd> dd 804e3d20 804e3d20 80587691 805716ef 8057ab71 80581b5c 804e3d30 80599ff7 80637b80 80639d05 80639d4e 804e3d40 8057741c 8064855b 80637347 80599539 804e3d50 8062f4ec 8057a98c 8059155e 8062661f 如上,80587691 805716ef 8057ab71 80581b5c 这些就是系统服务函数的地址了。比如当我们在ring3调用O
在前面的文章《驱动开发:内核解析PE结构导出表》中我们封装了两个函数KernelMapFile()函数可用来读取内核文件,GetAddressFromFunction()函数可用来在导出表中寻找指定函数的导出地址,本章将以此为基础实现对特定SSDT函数的Hook挂钩操作,与《驱动开发:内核层InlineHook挂钩函数》所使用的挂钩技术基本一致,不同点是前者使用了CR3的方式改写内存,而今天所讲的是通过MDL映射实现,此外前者挂钩中所取到的地址是通过GetProcessAddress()取到的动态地址,而今天所使用的方式是通过读取导出表寻找。
此插件作了一些权限的封装,让用户可以有登录的功能,不同用户登录看到的内容不一样,实现企业对数据权限的管理
在前面的章节《X86驱动:挂接SSDT内核钩子》我们通过代码的方式直接读取 KeServiceDescriptorTable 这个被导出的表结构从而可以直接读取到SSDT表的基址,而在Win64系统中 KeServiceDescriptorTable 这个表并没有被导出,所以我们必须手动搜索到它的地址。
在Windows内核中,SSSDT(System Service Shadow Descriptor Table)是SSDT(System Service Descriptor Table)的一种变种,其主要用途是提供Windows系统对系统服务调用的阴影拷贝。SSSDT表存储了系统调用的函数地址,类似于SSDT表,但在某些情况下,Windows系统会使用SSSDT表来对系统服务进行引导和调用。
示例配置: CPU i5 7500 主板 ASUS Prime B250-Plus 板载声卡 alc887 板载网卡 rtl8111H 内存 FURY 8GB DDR4 2400 x4 显卡 Sapphire Radeon NITRO+ RX 570 4G 硬盘 WDC SN750 无线网卡 BCM943602CS 显示器 VX2478-4K-HD
OpenCore(OC)是一种新的引导方式,随着越来越多的kexts开始放弃Clover, 我相信提早使用OC会对你未来使用黑苹果会有很大的帮助。这是一个自然的现象,就像变色龙被Clover淘汰,而现在OC代替Clover也是大势所趋。你应该需要看一些相关的文章,来帮助你理解我的正文内容,同时也需要下载我推荐的软件:
32位系统逐渐淘汰,转到64位编程相当重要. 但苦于64位驱动编程网上的资料比较杂乱
关于SSDT,描述得最清楚的应该算《SSDT Hook的妙用-对抗ring0 inline hook》一文了,作者是堕落天才。这里引用一下他写的开头部分,略有个别字符的修改:
花了2天时间参加微软的SQL Server 2012开发者训练营,全面的学习了SQL Server 2012上面的新特性,尝试使用微博做笔记。现在把它摘录到博客,在做个整理,下面是微博原文,微博的里头的链接是相关的网络上的资料。 张善友: #SQL Server#SQL Server 2012 Analysis service的新东西:BI 语义模型,传统SQL Server提供了统一维度模型、报表模型和PowerPivot模型,BI语义模型是这三种模型的结合体,面向最终用户。http://url.cn
作为一款自助式BI的轻量ETL工具,PowerQuery的确可以让我们享受许多数据处理的便利,无需专业的能力,大部分仅需通过界面的操作即可完成,无可否认PowerQuery的使用体验是非常棒的。
这一切的背后到底是人性的扭曲,还是道德的沦丧,尽请收看今天的专题文章:《什么是HOOK技术?》
在笔者上一篇文章《驱动开发:Win10枚举完整SSDT地址表》实现了针对SSDT表的枚举功能,本章继续实现对SSSDT表的枚举,ShadowSSDT中文名影子系统服务描述表,SSSDT其主要的作用是管理系统中的图形化界面,其Win32子系统的内核实现是Win32k.sys驱动,属于GUI线程的一部分,其自身没有导出表,枚举SSSDT表其与SSDT原理基本一致。
映射DLL其实很简单 在内核中使用4个函数即可映射. 而这方面网上资料也很多.这里推荐几个 也不再重复叙述了. 转载链接: 内核映射文件 简而言之只需要熟悉四个API即可. 而核心API其实就三个 分别为如下:
领取专属 10元无门槛券
手把手带您无忧上云