ring0 SSDTHook】的更多相关文章

SSDT 的全称是 System Services Descriptor Table,系统服务描述符表.这个表就是一个把 Ring3 的 Win32 API 和 Ring0 的内核 API 联系起来.SSDT 并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址.服务函数个数等.通过修改此表的函数地址可以对常用 Windows 函数及 API 进行 Hook,从而实现对一些关心的系统动作进行过滤.监控的目的.一些 HIPS.防毒软件.系统监控.注册表监控软件往往…
#include "HookSSDT.h" #include <ntimage.h> #define SEC_IMAGE 0x001000000 ULONG32 __NtOpenProcessIndex = ; PVOID __ServiceTableBase = NULL; ULONG32 __OldNtOpenProcessOffset = ; PVOID __OldNtOpenProcess = NULL; UCHAR __OldCode[] = {}; BOOLEA…
原博:http://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html 为了安全起见,Windows XP及其以后的系统将一些重要的内存页设置为只读属性,这样就算有权力访问该表也不能随意对其修改,例如SSDT.IDT等.但这种方法很容易被绕过,我们只要将这些部分修改为可写属性就可以了,不过当我们的事情做完后记得把它们恢复为只读属性,不然会造成一些很难预料到的后果. cr0是系统内的控制寄存器之一.控制寄存器是一些特殊的寄存器,它们可以控…
原理: 用ZwQuerySystemInformation 功能号为11(SystemModuleInformation)  得到所有系统模块的地址 遍历搜索得到ntos模块的基地址 读Ntos模块到System进程空间中 在ntos中找到函数真正地址 将地址转换为ssdt的索引 //X64版本#include "ResumeSSDTHook.h" #define SEC_IMAGE 0x1000000 PVOID __NtosModuleBaseAddress = NULL; ULO…
解说怎样写Hook过滤函数,比方NewZwOpenProcess.打开进程. 非常多游戏保护都会对这个函数进行Hook. 因为我们没有游戏保护的代码,无法得知游戏公司是怎样编写这个过滤函数. 我看到非常多奇形怪状的Hook过滤函数的写法.看得蛋痛无比. 比方: http://bbs.pediy.com/showthread.php?t=126802 http://bbs.pediy.com/showthread.php? t=126077 第一个bug: 调用这个函数 status = PsLo…
最近在学习Ring0层Hook的一些知识点,很久就写完SSDTHook的代码了,但是一直没有整理成笔记,最近有时间也就整理整理. 介绍: SSDTHook 实质是利用Ntoskrnl.exe 中全局导出的SSDT来进行Hook,SSDT(SystemServiceDescriptorTable,系统服务描述表),为什么要去用到SSDT表呢? 我们看一下ZwOpenProcess实现就明白了.为什么不用Nt系列函数,可以看我之前的文章. kd> u 0x8485acd8 nt!ZwOpenProc…
在ring0堆栈获取ring3堆栈方式 第一种方式 [esp+4] == [esp+参数个数*4+4] 如果这里不相等就需要用第二种方式 [[esp+参数个数*4+8]] 这里面的值就是Ring3的堆栈.不含参数.也就是Ring3的esp+参数个数*4的位置 第二种方式 待定.虚拟机突然崩溃了.郁闷!!!等待下次的发生…
Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,RING0,RING1,RING2,RING3.Windows只使用其中的两个级别RING0和RING3. RING0层拥有最高的权限,RING3层拥有最低的权限. 按照Intel原有的构想,应用程序工作在RING3层,只能访问RING3层的数据:操作系统工作在RING0层,可以访问所有层的数据:而其他驱动程序位于RING1.RING2层,每一层只能访问本层以及权限更低层的数据. 如果普通应用程序企图执行RING0指令,则…
对付ring0 inline hook的基本思路是这样的,自己写一个替换的内核函数,以NtOpenProcess为例,就是MyNtOpenProcess.然后修改SSDT表,让系统服务进入自己的函数MyNtOpenProcess.而MyNtOpenProcess要做的事就是,实现NtOpenProcess前10字节指令,然后再JMP到原来的NtOpenProcess的十字节后.这样NtOpenProcess函数头写的JMP都失效了,在ring3直接调用OpenProcess再也毫无影响.…
在进行Windows的ring0层开发时,必不可免的要与 ring3 层进行交互.进行数据间的相互传输.可用的方法有DeviceIoCntrol,ReadFile.我平常都是用的DeviceIoControl在ring3 与 ring0 层进行的数据传输.今天就写写DeviceIoControl 和 ring0通过事件通知 ring3! 首先加载驱动之后,在ring3层调用CreateFile() 打开ring0层生成的LinkName,获得设备对象的句柄.然后调用DeviceIoControl…
开发技术讲究封装与模块化,安全技术强调底层安全性.安全技术需要打开封装.追根溯源! <0day 安全:软件漏洞分析技术(第2版)> 第21章 探索 Ring0 笔记 Intel x86 系列处理器使用"环"的概念来实施访问控制,共有 4 个权限级别,由高到低分别为 Ring0.Ring1.Ring2.Ring3,其中 Ring0 权限最高,Ring3 权限最低.Windows(从 NT 开始)和 Linux 等多数操作系统在 Intel x86 处理器上只使用了 Ring0…
这得从CPU指令系统(用于控制CPU完成各种功能的命令)的特权级别说起.在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃.比如:清内存.设置时钟等.如果所有的程序都能使用这些指令,那么你的系统一天死机n回就不足为奇了.所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令.形象地说,特权指令就是那些儿童不宜的东东,而非特权指令则是老少皆宜. Intel的CPU将特权级别分为4个级别:R…
原文链接:浅谈NT下Ring3无驱进入Ring0的方法 (测试环境:Windows 2000 SP4,Windows XP SP2.Windows 2003 未测试) 在NT下无驱进入Ring0是一个老生常谈的方法了,网上也有一些C代码的例子,我之所以用汇编重写是因为上次在[原创/探讨]Windows 核心编程研究系列之一(改变进程 PTE)的帖子中自己没有实验成功(其实已经成功了,只是自己太马虎,竟然还不知道 -_-b),顺面聊聊PM(保护模式)中的调用门的使用情况.鉴于这些都是可以作为基本功…
现在探讨内核程序和应用程序之间的本质区别.除了能用WDK编写内核程序和阅读一部分Windows的内核代码之外,我们还需要了解它们的本质是什么,它们和我们熟悉的应用程序有什么区别. Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,从Ring0到Ring3(后面简称R0.R1.R2.R3).R0层拥有最高的权限,R3层拥有最低的权限.按照Intel原有的构想,应用程序工作在R3层,只能访问R3层的数据:操作系统工作在R0层,可以访问所有层的数据:而其他驱动程序位于R1.R2…
Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3.Windows只使用其中的两个级别RING0和RING3,RING0只给操作系统用,RING3谁都能用.如果普通应用程序企图执行RING0指令,则Windows会显示“非法指令”错误信息.  挑战: 大部分modern CPU 并不支持可虚拟化, 如x86 需直接访问内存和硬件的操作系统特权代码必须在Ring 0执行 CPU虚拟化必须在Guest OS下面添加VMM(Ring 0) 一些关键指令在非Ring…
修改自: https://blog.csdn.net/wzsy/article/details/54929726 控制码方式详解: https://www.cnblogs.com/lsh123/p/7354573.html 0.应用程序与驱动程序通信方式据我所知,细分可以分4种,ReadFile,WirteFile方式的缓冲区设备读写,直接方式读写,和其他方式读写,Io设备控制操作. 1.缓冲区方式设备读写: 在创建Device后,须要指定方式为Device的Flags有 DO_BUFFERED…
内核第三讲,进入ring0,以及编写第一个内核驱动程序. PS: 请下配置双机调试,下方有可能用到.如果不配置,则你可以不用调试, 博客连接: http://www.cnblogs.com/iBinary/p/8260969.html 一丶进入ring0之前的简介 进入0环之前,我们要明白操作系统的设计,操作系统允许驱动程序使用In out等等特权指令来操作高2G的内存.那么必然会有接口. 图示如下. 那么我们可以模拟一个驱动程序来进入0环. 而操作系统提供的接口的,有专门的名称. 叫做DDK,…
同步事件(synchronizationEvent)当事件对象为激发时,如遇到KeWaitForXX等内核函数,事件对象则自动变回未激发态通知事件(NotificationEvent)当事件对象为激发时,如遇到KeWaitForXX等内核函数,事件对象则不会自动变回未激发态 Ring0(创建事件).h #include <ntifs.h> #define EVENT_NAME L"\\BaseNamedObjects\\Ring0KernelEvent" VOID Driv…
应用程序中创建的事件和在内核中创建的事件对象,本质上是同一个东西,在用户模式中,他用句柄表示,在内核模式下,他用KEVENT表示数据结构表示.在应用程序中,所有的内核对象都不会被用户看到,用户看到的知识代表内核对象的对象句柄.这个代码就是要在Ring3与RIng0之间用一个事件对象.解决的第一个问题就是如何将Ring3创建的事件传递给驱动:使用DeviceIoControl,在Ring3中创建一个同步事件,然后用DeviceIoControl将事件句柄传递给驱动程序.需要指出的是句柄和进程是相关…
#include "Unicode_String_Ring0.h" //bp Unicode_String_Ring0!DriverEntry NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath) { NTSTATUS Status = STATUS_SUCCESS; PDEVICE_OBJECT DeviceObject = NULL; DriverObject->Driv…
http://www.cnblogs.com/xusongwei/archive/2012/07/30/2615592.html ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之……  拿Linux+x86来说,  操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断.修改页表.访问设备等等.  应用程序的代码运行在最低运行级别上ring3上,不能做受控操作.如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系…
理论知识 SYSENTER 指令是在 Inter Pentium(R) Ⅱ 处理器上作为"高速系统调用"功能的一部分被首次引用的. SYSENTER 指令进行过专门的优化,能够以最佳性能由 Ring3 层切换到 Ring0 层. 微软首次引用 SYSENTER 指令是在 Windows 2000 的系统上,再次之前微软的系统是通过自陷指令 int 0x2E 进入 Ring0 层的系统空间的. 在 Windows 2000 及以后的系统中,假设想要从 Ring3 层进入 Ring0 层,…
ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之-- 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断.修改页表.访问设备等等. 应用程序的代码运行在最低运行级别上ring3上,不能做受控操作.如果要做,比如要访问磁盘,写文件,那就要通过执行系统调用(函数),执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问…
在学习驱动过程中,一个很重要的内容就是Ring3层与Ring0层的通信,方法有很多种,互斥体,信号量,文件等等,用的比较普遍的,还是事件.所以在学习的过程中,做了一个简单的Demo,主要是体会一下方法. 在驱动程序下,首先要定义一个事件名,前面的一部分必须是BaseNamedObjects,这其实就是一个目录,后面的部分可以自己起,但不要太过简单和普遍,以免与现有的冲突. #define EVENT_NAME   L"\\BaseNamedObjects\\Ring0Event" 定义…
原理:遍历进程ID,然后openprocess,能打开的都枚举出来 ring0 : #include "EnumProcessByForce.h" extern char* PsGetProcessImageFileName(PEPROCESS EProcess); extern POBJECT_TYPE* PsProcessType; NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterP…
当我在说跳转时,说的什么? CPU有很多指令,不是所有的指令都能够随时用,比如 ltr指令就不是随便什么时候能用,在保护模式下,如果你不安规则来执行指令,CPU就会抛出异常,比如你在INTEL手册上就能看到如下文本 意思据是说,如果你当前的CPL不是RING0,那么就会抛出GP(0)异常! 所以要正确使用这个指令,你就需要将CPL跳转到RING0来.这就是跳转! RING3到RING0(用户态到内核态)的特权转变过程 首先得要有一个RING3的代码段,并且该代码段正处于运行状态 1.定义RING…
在前一篇文章里面,我们将了CPU保护模式中的几种特权RING0,RING1,RING2,RING3!操作系统通常运行在RING0,应用程序通常运行在RING3. CPU如何从RING0到RING3 先看实现代码 mov ax, SelectorTSS ltr ax ; push SelectorStack3 push TopOfStack3 push SelectorCodeRing3 retf 每一个特权等级对应一个自己的堆栈, RING0 –- ESP0,SS0 RING1 –- ESP0,…
[0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是干货,前面代码仅供参考的,且source code from orange's implemention of a os. ; ========================================== ; pmtest5a.asm ; 编译方法:nasm pmtest5a.asm -o…
上面说过了隐藏进程,这篇博客我们就简单描述一下暴力搜索进程. 一个进程要运行,必然会加载到内存中,断链隐藏进程只是把EPROCESS从链表上摘除了,但它还是驻留在内存中的.这样我们就有了找到它的方法. 在内核中,传入进程ID,通过ZwOpenProcess得到句柄,再传入句柄,通过ObReferenceObjectByHandle,可以获得EPROCESS,既然获得了EPROCESS,问题就迎刃而解了. 既可以选择用加偏移的方法得到进程名,也可以用PsGetProcessFileName来获取进…
计算机操作系统处理机调度读后感: 笔者在看操作系统西安电子科技大学那本书的时候,初次感觉本科教的不会太难,所以没有认真的看,但是随后这本书讲的刷新了我的世界观.这本书居然是ring0级别的,这时不禁吐槽一下..如果没调试过程序,没接触过ring0的同学,这本书就和马原一样.全背完还不知道学了啥. 由于笔者之前做过逆向工程.而调试的大都是ring3级别的,这本书是ring0级别的.我必须要把这些知识和之前学的连接起来,以便以后接触ring0的时候能更轻松一些. 1.创建进程. 在这个模块我会从一个…