首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ring0下使用内核重载绕过杀软hook

/KiFastCallEntry是必经之路,还有一种的话就是通过hook SSDT表里面的函数,但是那样的话会很麻烦,所以杀软一般都是通过前者来实现ring0的监控 我们这里以某数字杀软为例,通过汇编代码的对比...ring0的监测原理,我们该如何进行绕过呢?...PE拉伸&重定位表修复 这里我把PE拉伸跟重定位表的修复放到一个函数里面,首先我们要进行打开文件的操作,那么这里就要实现几个关于文件的函数操作 主要用到ZwCreateFile、ZwReadFile、...,因为我们已经获取到了节的数量,所以可以直接使用遍历的方式拷贝,这里我们定义三个变量获取节中的VirtualAddress、SizeOfRawData、PointerToRawData属性,分别在0xc...然后再修正SSDT函数中的地址。

61530

ring0下使用内核重载绕过杀软hook

/KiFastCallEntry是必经之路,还有一种的话就是通过hook SSDT表里面的函数,但是那样的话会很麻烦,所以杀软一般都是通过前者来实现ring0的监控 我们这里以某数字杀软为例,通过汇编代码的对比...ring0的监测原理,我们该如何进行绕过呢?...PE拉伸&重定位表修复 这里我把PE拉伸跟重定位表的修复放到一个函数里面,首先我们要进行打开文件的操作,那么这里就要实现几个关于文件的函数操作 主要用到ZwCreateFile、ZwReadFile、...然后再修正SSDT函数中的地址。...,和我们自己写的MyFunction传入的汇编代码是相同的 我们再去通过KiFastCallEntry定位一下hook点,发现也已经被修改 这里为了方便查看效果,我用ssdt hook了NtOpenProcess

66020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    驱动开发:恢复SSDT内核钩子

    通过前面的学习我们已经可以编写一个驱动程序并挂钩到指定的内核函数上了,接下来我们将一步步的通过编写驱动程序,手动的来解除 NtOpenProcess 函数的驱动保护,以此来模拟如何一步步干掉游戏保护。...那么如何获取到原始函数地址呢?...SSDT_Addr; // 用于存放原始的SSDT地址 // 将NtOpenProcess字符串以Uncode格式写入到NtOpen变量中 RtlInitUnicodeString...字符串 ULONG SSDT_Addr; // 用于存放原始的SSDT地址 // 将NtOpenProcess字符串以Uncode格式写入到NtProcess...既然无法获取到当前函数的地址,那么我们可以尝试获取NtReadVirtualMemory函数的前一个函数的内存地址,并通过相加偏移的方式来获取该函数的地址,首先我们通过Xuetr 查询到 NtReadVirtualMemory

    71230

    驱动开发:恢复SSDT内核钩子

    通过前面的学习我们已经可以编写一个驱动程序并挂钩到指定的内核函数上了,接下来我们将一步步的通过编写驱动程序,手动的来解除 NtOpenProcess 函数的驱动保护,以此来模拟如何一步步干掉游戏保护。...图片那么如何获取到原始函数地址呢?...; // 用于存放原始的SSDT地址// 将NtOpenProcess字符串以Uncode格式写入到NtOpen变量中RtlInitUnicodeString(&NtOpen...字符串ULONG SSDT_Addr; // 用于存放原始的SSDT地址// 将NtOpenProcess字符串以Uncode格式写入到NtProcess变量中RtlInitUnicodeString...// 挂钩代码汇编版本,替换到上方完整代码指定字段即可,此处不做演示。__asm{........} //去掉内核页面保护__asm{//保存写入前的数据,用于驱动卸载恢复。

    74410

    驱动开发:挂接SSDT内核钩子

    ,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序...Windows 系统提供的SSDT表其作用就是方便应用层之间API的调用,所有的API调用都会转到SSDT这张表中进行参考,这样就能够使不同的API调用全部都转到对应的SSDT表中,从而方便管理。...;表结构中的 SERVICE_DESCRIPTOR_TABLE 包含了所有内核导出函数的地址,在32位系统中每个地址长度为4个字节,所以要获得某个函数在SSDT中的偏移量,可以使用 KeServiceDescriptorTable...】输入以下命令完成符号文件的加载。..._SEH_prolog (80538f10)如果符号文件没有加载成功,可以使用下面的方式来查询,找到结构的首地址,然后与函数编号相加来获取。

    82620

    驱动开发:如何枚举所有SSDT表地址

    在前面的博文《驱动开发:Win10内核枚举SSDT表基址》中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则可以定义字符串列表...在下面的示例中,我们将通过 RtlInitUnicodeString() 函数将函数名字符串格式化为 UNICODE_STRING 结构,并使用 MmGetSystemRoutineAddress()...NtOpenFile这个函数的内存地址,输出效果如下所示: 根据上一章节的内容扩展,枚举完整SSDT表我们可以这样来实现,通过将完整的SSDT结构字符串放入到SSDT变量内,然后通过不间断的循环取出每一个...SSDT函数的相对地址信息。...= UnDriver; return STATUS_SUCCESS; } 我们运行这段程序,即可得到整个系统中所有的SSDT表地址信息; 在WinDBG中可看到完整的输出内容,当然有些函数没有被导出

    34040

    一丶读取SSDT表 (KeServiceDescriptorTable)

    SSDT表的方式 1.2.2 重要点2 获取SSDT表以及Shadow表位置 1.2.3 重要点3 SSDT表的加密获取以及使用 二丶两种方式实现获取SSDT表 2.1 常规方式获取SSDT表. 2.2...msr在开启内核隔离模式下获取的是 KiSystemCall64Shadow 而在未开启内核模式下则是获取的 KiSystemCall64 1.2 手动获取SSDT表 windbg链接双机调试....反汇编此函数的地址往下找即可看到获取SSDT表位置代码. 这里我以IDA举例子 如果你能反汇编内核文件,并且为其下载好符号.则在函数列表中直接搜索 KiSystemCall64 即可....来定位SSDT表或者SSDTShadow表 例子: 1.2.2 重要点2 获取SSDT表以及Shadow表位置 重要点2位置的两行代码则是获取SSDT表与Shadow表....核心代码: 提供了两种方式.指针或者数组寻址 都是可以可以的.数组那块我是转换为了ULONG来操作的 因为: char * ary; offset = ary + sizeof(type) * index

    2K11

    驱动开发:Win10枚举完整SSDT地址表

    在前面的博文《驱动开发:Win10内核枚举SSDT表基址》中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则可以定义字符串列表...图片调用MmGetSystemRoutineAddress()得到当前地址很容易实现,只需要将函数名字符串通过RtlInitUnicodeString()格式化一下即可。...NtOpenFile起源地址 = %p \n", source_address);DriverObject->DriverUnload = UnDriver;return STATUS_SUCCESS;}代码获得...NtOpenFile这个函数的内存地址,输出效果如下所示:图片根据上一章节的内容扩展,枚举完整SSDT表我们可以这样来实现。...;return STATUS_SUCCESS;}我们运行这段程序,即可得到整个系统中所有的SSDT表地址信息;图片在WinDBG中可看到完整的输出内容,当然有些函数没有被导出,起源地址是拿不到的。

    54530

    OC简要配置说明(旧)已修正

    我们主要用到的是Add(添加)这一项,其下面子集中需要我们自行填写我们放入的SSDT的信息,如上图所示。结合之前,我的配置中我使用了5个SSDT文件,则需要0-4子集(它的计数是从0开始的)。...关于其他的SSDT的顺序要求,在OC-little中有很详细的说明,大家仔细阅读就可以搞定了。 之后是Delete,如字面意思一样,禁用一些SSDT,个人觉得没啥用,不需要配置这里。...EC的这个名称,前面我就有讲到了在原始DSDT中搜索关键词PNP0C09来获取EC控制器的名称。...如果你要用小憩功能请填8; -v是跑代码,在没装好稳定的黑果前我建议加上,方便定位错误,弄完后再删除-v bootercfg String log=0 debug=0 level=...一些硬件会把硬件EFI写进内存过程中占据必要的UEFI运行空间,所以我们可以通过此项来预留内存来保证UEFI的运行。填写方式可以参考小兵的文章。来寻找指定内存的起始位置,以4K为一个节点。

    8.2K21

    驱动开发:内核实现SSDT挂钩与摘钩

    在前面的文章《驱动开发:内核解析PE结构导出表》中我们封装了两个函数KernelMapFile()函数可用来读取内核文件,GetAddressFromFunction()函数可用来在导出表中寻找指定函数的导出地址...Length, FileInformationClass, ReturnSingleEntry, FileMask, RestartScan); return status; } 接着就是如何挂钩并让其中转到我们自己的代码流程中的问题...,由于挂钩与恢复代码是一样的此处就以挂钩为例,首先调用MmCreateMdl()创建MDL,接着调用MmBuildMdlForNonPagedPool()接收一个 MDL,该MDL指定非分页虚拟内存缓冲区...调用MmMapLockedPages()将此段内存提交为锁定状态,最后就是调用RtlCopyMemory()将新函数地址写出到内存中实现替换,最后释放MDL句柄即可,这段代码如下所示,看过驱动读写篇的你一定很容易就能理解...hSection, &pBaseAddress); if (NT_SUCCESS(status)) { DbgPrint("读取内存地址 = %p \n", pBaseAddress); } // 获取指定模块导出函数地址

    23620

    驱动开发:Win10内核枚举SSDT表基址

    三年前面朝黄土背朝天的我,写了一篇如何在Windows 7系统下枚举内核SSDT表的文章《驱动开发:内核读取SSDT表基址》三年过去了我还是个单身狗,开个玩笑,微软的Windows 10系统已经覆盖了大多数个人...看一款闭源ARK工具的枚举效果:图片直接步入正题,首先SSDT表中文为系统服务描述符表,SSDT表的作用是把应用层与内核层联系起来起到桥梁的作用,枚举SSDT表也是反内核工具最基本的功能,通常在64位系统中要想找到...->DriverUnload = UnDriver;return STATUS_SUCCESS;}如上代码中所提及的步骤我想不需要再做解释了,这段代码运行后即可输出SSDT表的基址。...,代码中rcx寄存器传入SSDT的下标,而rdx寄存器则是传入SSDT表基址。...,如下是读取SSDT的完整代码。

    62720

    64位内核开发第四讲,查看SSDT表与showSSDT表

    一丶SSDT表 1.什么是SSDT表 SSDT表示系统服务表,我们ring3调用的很多函数都会调用这个SSDT表 2.查看步骤 1.使用 x命令 前提需要加载好符号. x nt!...dds命令可以看第三讲.关于windbg调试命令 dds Address L11C 这个命令的意思就是显示地址里面值指向的地址. 以4个字节显示. 显示如下: ?...如果你有符号.则可以看到这些地址里面后面指向的函数名 可以使用 uf 来反汇编这个函数的所有汇编 ?...二丶ShadowSSDT表 1.什么是ShadowSSDT表 ring3的所有GUI会调用的到这个表格中. 2.如何查看....不管是SSDT还是shodowSSDT表.都是有这个表的大小. 在32位下.函数地址是4个字节. 所以用表的大小 / 4 = 函数个数. ? 这个表中的函数都是做绘图用的.

    2.1K30

    驱动开发:Win10枚举完整SSDT地址表

    在前面的博文《驱动开发:Win10内核枚举SSDT表基址》中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则可以定义字符串列表...调用MmGetSystemRoutineAddress()得到当前地址很容易实现,只需要将函数名字符串通过RtlInitUnicodeString()格式化一下即可。...NtOpenFile这个函数的内存地址,输出效果如下所示: 根据上一章节的内容扩展,枚举完整SSDT表我们可以这样来实现。...= UnDriver; return STATUS_SUCCESS; } 我们运行这段程序,即可得到整个系统中所有的SSDT表地址信息; 在WinDBG中可看到完整的输出内容,当然有些函数没有被导出...,起源地址是拿不到的。

    62210

    6.1 Windows驱动开发:内核枚举SSDT表基址

    具体而言,SSDT表包含了系统调用的函数地址以及其他与系统服务相关的信息。每个系统调用对应SSDT表中的一个表项,其中存储了相应系统服务的函数地址。...看一款闭源ARK工具的枚举效果: 直接步入正题,首先SSDT表中文为系统服务描述符表,SSDT表的作用是把应用层与内核层联系起来起到桥梁的作用,枚举SSDT表也是反内核工具最基本的功能,通常在64位系统中要想找到...DriverObject->DriverUnload = UnDriver; return STATUS_SUCCESS; } 如上代码中所提及的步骤我想不需要再做解释了,这段代码运行后即可输出...,代码中rcx寄存器传入SSDT的下标,而rdx寄存器则是传入SSDT表基址。...,如下是读取SSDT的完整代码。

    57910

    「PowerBI」丢弃SSDT选择TabularEditor成为你的首选建模开发工具(上)

    TabularEditor实操 模型创建方面,可以来源于某个现有的文件,如SSDT做好的半成品,读取其BIM文件,或者直接读取发布到服务器上的数据模型。...PowerQuery的方式,没法像SSDT那样可以调出界面化操作,只能接收最终生成的M语言代码,所以真要使用它时,建议从PowerBIDeskTop上将数据加工好,生成M语言代码再复制过来即可。...当源数据表中字段有增减或字段类型、名字有变更时,同样有非常贴心的右键功能去修复和检验变更情况,帮助快速修复。...现在版本比较遗憾的是表达式编辑区对中文支持不友好,会出现显示压缩在一堆的情况,可以先从DAX Studio上写好后再粘贴过来,软件作者在新版本3.0中将会修复,敬请耐心等待。...更为高效的高级功能也如VBA一般可使用脚本代码去作更进一步的自动化操作,这些的介绍将在下一篇中给大家作介绍,欢迎继续关注。

    2.3K20

    驱动开发:内核实现SSDT挂钩与摘钩

    在前面的文章《驱动开发:内核解析PE结构导出表》中我们封装了两个函数KernelMapFile()函数可用来读取内核文件,GetAddressFromFunction()函数可用来在导出表中寻找指定函数的导出地址...FileInformation,Length,FileInformationClass,ReturnSingleEntry,FileMask,RestartScan);return status;}接着就是如何挂钩并让其中转到我们自己的代码流程中的问题...,由于挂钩与恢复代码是一样的此处就以挂钩为例,首先调用MmCreateMdl()创建MDL,接着调用MmBuildMdlForNonPagedPool()接收一个 MDL,该MDL指定非分页虚拟内存缓冲区...调用MmMapLockedPages()将此段内存提交为锁定状态,最后就是调用RtlCopyMemory()将新函数地址写出到内存中实现替换,最后释放MDL句柄即可,这段代码如下所示,看过驱动读写篇的你一定很容易就能理解...hFile, &hSection, &pBaseAddress);if (NT_SUCCESS(status)){DbgPrint("读取内存地址 = %p \n", pBaseAddress);}// 获取指定模块导出函数地址

    30640

    黑客用这项技术攻击你的电脑!

    不同的是,本文要探讨的HOOK并非属于程序原有的逻辑,而是在程序已经编译成可执行文件甚至已经在运行中的时候,如何劫持和修改程序的流程。...IAT HOOK 一个程序的所有代码一般不会全部都编译到一个模块中,分拆到不同的模块既有利于合作开发,也有利于代码管理,降低耦合。...SSDT HOOK 系统调用是操作系统提供给应用程序的编程接口API,应用程序通过这些API得以操作计算机的资源(如进程、网络、文件等)。...Windows上的SSDT向来是兵家必争之地,安全软件为了监控应用程序的行为,通常都会替换SSDT表格中的系统服务函数地址为它们的函数。...统一通过Inline HOOK,操作系统能够修改原来有bug的代码,转而执行修复后的新版本,解决系统漏洞。 你看,技术就是一柄双刃剑,善或恶,一念之间。

    62530
    领券