CN111767119A - 一种不触发系统保护的内核挂钩方法 - Google Patents
一种不触发系统保护的内核挂钩方法 Download PDFInfo
- Publication number
- CN111767119A CN111767119A CN202010620502.XA CN202010620502A CN111767119A CN 111767119 A CN111767119 A CN 111767119A CN 202010620502 A CN202010620502 A CN 202010620502A CN 111767119 A CN111767119 A CN 111767119A
- Authority
- CN
- China
- Prior art keywords
- function
- hook
- msr
- address
- lstar
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45591—Monitoring or debugging support
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种不触发系统保护的内核挂钩方法,包括读取并保存MSR中原始MSR_LSTAR函数地址,并将MSR_LSTAR地址写入到驱动程序的全局变量中;组织挂钩数据并调用VMCALL指令传入虚拟机管理器中;虚拟机管理器保存挂钩数据以及虚拟机管理器中原始MSR_LSTAR函数地址,并修改原始MSR_LSTAR函数地址为挂钩地址;SYSCALL指令切入到挂钩地址,判断参数和系统服务描述表索引是否为挂钩的系统服务描述表函数,不是则返回至全局变量中,否则执行挂钩函数。本发明能够对所有系统函数做挂钩操作,使系统内核防护监测不到内核挂钩,能够兼容所有具有vt‑x特性的intel CPU的系统,不限于32位还是64位操作系统。
Description
技术领域
本发明涉及计算机技术领域,更具体的说是涉及一种基于Intel vt-x的不触发系统保护的内核挂钩方法。
背景技术
在win7 32位系统及以前的操作系统上,做内核安全防护时,一般使用内核挂钩(SSDT HOOK)的方法实现,即通过内核基址找到系统的SSDT地址,并找到需要HOOK API的函数索引号(SSDTIndex),通过SSDT地址加上索引号偏移找到要HOOK函数的函数地址,通常直接修改SSDT[SSDTIndex]=HookFuncAddr就可以了。但在win7 64位系统及之后的操作系统上,微软新加入了一种系统保护手段PATCH GUARD(简称PG),使用内核挂钩方法的时候就会被PG监测到,并产生蓝屏,所以在win7 64位及以上的操作系统上,不能使用SSDT HOOK内核挂钩方式。
因此,如何提供一种不触发系统保护的内核挂钩方法是本领域技术人员亟需解决的问题。
发明内容
有鉴于此,本发明提供了一种不触发系统保护的内核挂钩方法,能够对所有系统函数做挂钩操作,监测进程所有行为动作以及调用的系统函数,且使PG监测不到内核挂钩,可以兼容所有具有vt-x特性的intel CPU的系统,不限于32位还是64位操作系统。
为了实现上述目的,本发明采用如下技术方案:
一种不触发系统保护的内核挂钩方法,包括:
步骤一:读取并保存MSR中原始MSR_LSTAR函数地址,并将MSR_LSTAR函数地址写入到驱动程序的全局变量KiSystemCall64Ptr中;
步骤二:组织挂钩数据并调用VMCALL指令传入虚拟机管理器中;
步骤三:虚拟机管理器保存挂钩数据以及虚拟机管理器中原始MSR_LSTAR函数地址,利用挂钩数据修改虚拟机管理器中原始MSR_LSTAR函数地址为挂钩地址;
步骤四:SYSCALL指令切入到挂钩地址,此时传入参数和系统服务描述表索引,判断参数和SSDT索引是否为挂钩的系统服务描述表函数,如果不是,则返回至全局变量KiSystemCall64Ptr中,否则执行挂钩函数。
进一步,执行挂钩函数的具体步骤为:
步骤a:将系统服务描述表索引、HookFuncAdder函数以及HookFuncAdder函数的参数个数记录到全局变量挂钩函数映射表HookTable和函数参数表ArgTble中,并对全局变量HOOK开关HookEnabled[Index]置TRUE,此时开启对应索引的系统服务描述表函数的钩子;
步骤b:当程序调用系统服务描述表中的函数时,通过调用全局变量挂钩函数映射表HookTable中对应的系统服务描述表索引的HookFuncAdder。
进一步,HOOK函数保存在MSR中原始MSR_LSTAR函数地址内。
进一步,包括VT框架,VT框架采用GitHub开源平台开放的工程HyperBone。
进一步,VT框架包括VmExitMSRRead和VmExitMSRWrite退出动作。
经由上述的技术方案可知,与现有技术相比,本发明公开提供了一种不触发系统保护的内核挂钩方法,将钩子的位置存在MSR寄存器的MSR_LSTAR中,SYSCALL指令直接切入到挂钩地址,因为不是在系统服务描述表中修改了系统函数地址,所以使用内核检测工具是无法检测到系统服务描述表中的系统函数被挂钩了,本发明能够对所有系统函数做挂钩操作,监测进程所有行为动作以及调用的系统函数,且使PG监测不到内核挂钩,可以兼容所有具有vt-x特性的intel CPU的系统,不限于32位还是64位操作系统。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1附图为本发明提供的一种不触发系统保护的内核挂钩方法流程图。
图2附图为本发明提供的VT框架结构示意图。
图3附图为本发明提供的PG监测过程原理图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明利用开源的VT技术框架,实现了一套基于Intel vt-x特性的CPU上的不触发PG的SSDT HOOK方法,本发明通过使用VT技术可以做到欺骗系统PG,使PG监测不到内核挂钩,从而不会产生蓝屏,VT框架来自GitHub开源平台开放的工程HyperBone。
其中,VT框架结构图如图2所示,通过实现VMM来接管GUEST的Ring0层和Ring3层的所有处理。
使用VT框架挂钩SSDT要了解MSR(Model Specific Register)的相关概念和MSR_LSTAR(#define MSR_LSTAR 0xC0000082)。MSR是CPU的一组64位寄存器,可以分别通过RDMSR和WRMSR两条指令进行读和写的操作,前提要在ECX中写入MSR的地址。对于RDMSR指令,将会返回相应的MSR中64bit信息到(EDX:EAX)寄存器中。对于WRMSR指令,把要写入的信息存入(EDX:EAX)中,执行写指令后,即可将相应的信息存入ECX指定的MSR中。
MSR_LSTAR是MSR中记录SYSCALL(从应用层到内核层的系统调用)进入内核后的SyscallEntryPoint(程序由应用层到内核层后的第一站)内核地址的寄存器标号,而SyscallEntryPoint中就会调用SSDT中的内核函数。基于VT的SSDT HOOK就是替换MSR中MSR_LSTAR的SyscallEntryPoint内核地址,实现SyscallEntryPoint调用SSDT函数的过程,并在调用SSDT函数时替换需要挂钩的SSDT函数。
VT实现挂钩不触发PG的原理:在VT框架下,程序都是GUEST角色,相当于跑在虚拟机中的,而系统及PG是跑在HOST角色下的,相当于把程序和系统分离了,GUEST-HOST这种模式下,HOST下跑的程序是无法读取到GUEST下的程序的内存的,利用VT的这上特性就可以规避PG的检测了。
如图1所示,本发明具体包括以下步骤:
步骤一:读取并保存MSR中原始MSR_LSTAR函数地址,并将MSR_LSTAR函数地址写入到驱动程序的全局变量KiSystemCall64Ptr中KiSystemCall64Ptr=__readmsr(MSR_LSTAR),用于退出VT框架进行恢复时使用;
步骤二:组织挂钩数据并调用VMCALL指令传入VMM中;
在VT框架里HOST和GUEST的数据传递比较繁琐,需要通过VMCALL指令操作,调用VMCALL指令传递挂钩数据到VMM中,把HOST中的数据先传入VMM,VMM记录到内部维护的全局变量里,当GUEST被触发时可以通过VMM的变量直接写入到GUEST中。
步骤三:在VT框架的VMCALL类型退出事件中记录和替换MSR_LSTAR的函数地址。
通过步骤二调用VMCALL指令时会触发VMM的VmExitVmCall退出动作(由VMCALL指令导致的虚拟机退出事件),就是在这里记录下由步骤2传入的挂钩数据,然后通过挂钩数据修改MSR_LSTAR中的原始数据。
修改MSR_LSTAR的原始地址之前,先记录下原始的地址数据,可做恢复还原之用,再写入挂钩数据中的需要替换的MSR_LSTAR地址,从而HOOK了MSR_LSTAR的入口地址。这样当应用层调用系统函数时会执行到MSR_LSTAR地址函数里。
步骤四:实现MSR中MSR_LSTAR寄存器里的SyscallEntryPoint函数。
在SyscallEntryPoint中判断SSDT Index是否在MAX_SYSCALL_INDEX的SSDT下标中,如果不是的话,返回步骤一中记录下的原始的KiSystemCall64Ptr函数不做任何处理,是则调入处理函数中,在处理函数中完成对参数的判断,所需要数据的获取如果判断失败还是执行KiSystemCall64Ptr,如果成功则执行由步骤五注册到全局变量HookTable中对应SSDT Index的HookFuncAddr。
步骤五:使用SSDT HOOK。
在HOOK SSDT的函数时,需要提供SSDT的索引(SSDT Index),并把SSDT Index,HookFuncAddr及HookFuncAddr的函数参数个数(argCount)一起记录到全局变量HOOK函数映射表HookTable和函数参数表ArgTble中,并对全局变量HOOK开关HookEnabled[Index]置TRUE,此时开启对应的Index的SSDT函数HOOK。最后当程序调用SSDT中的函数时,调用HookTable中对应Index的HookFuncAddr,从而达到了HOOK SSDT的目的。
为了防止PG检测被HOOK的MSR_LSTAR地址,在VT框架中加入VmExitMSRRead和VmExitMSRWrite退出动作,并在退出动作中加入针对MSR_LSTAR的处理。
当HOST访问MSR_LSTAR时(其中就包括PG的检测访问),就会触发到VmExitMSRRead和VmExitMSRWrite的读和写中,当读MSR_LSTAR时,返回步骤三中VMM中的原始MSR_LSTAR地址,当写时把传过来地址更新到VMM记录原始MSR_LSTAR的变量中,恢复时直接恢复此地址,从而达到了避免被PG检测的目的。
本发明程序调用系统函数的流程为:应用层(R3层)调用NTDLL模块中的函数,NTDLL中的函数实现会通过SYSCALL指令切入内核层(R0层)再调用SSDT中对应的系统函数,VT框架下就是直接在SYSCALL指令切入内核层的地方做HOOK,这个HOOK的位置存在MSR寄存器的MSR_LSTAR中,通过调用__readmsr(MSR_LSTAR)就可以直接获得系统进入内核层调用的位置了。在实现中就是利用VT的GUEST-HOST分离的特性,HOOK LSTAR的位置,并欺骗PG,在GUEST访问LSTAR时提供HOOK之后的LSTAR地址,在HOST访问时提供原始的LSTAR地址,从而达到了不触发PG的SSDT HOOK,这种HOOK比常规的SSDT HOOK更具有欺骗性,因为并不是在SSDT表中修改了系统函数地址,所以使用内核检测工具是无法检测到SSDT表中的系统函数被HOOK了,也达到了欺骗检测工具的目的。
需要说明的是,使用VT框架下的SSDT HOOK对系统函数挂钩的方法与传统的SSDTHOOK函数挂钩方法一样,也需要定义系统函数的挂钩函数(HookFunction),及系统函数SSDT索引号(SSDTIndex),调用HOOK后,程序在调用被挂钩的系统函数时就会被转入定义的挂钩函数(HookFunction)中执行,在HookFunction中可以对传入的参数做监视修改,并获取到调用此函数的进程主体以及被操作的目标进程等信息,也可对传出信息及返回值做修改,或者在HookFunction中再次调用原始的系统函数(OriSystemFunction)做透明传递,不做任何处理。
本发明具有以下优点:
1)兼容所有支持具有vt-x特性的intel CPU的系统,不限于32位还是64位操作系统;
2)因为是在VT框架下做的HOOK,所以使用PCHUNTER等ARK工具检测SSDT HOOK无法检测到有函数挂钩的;
3)因为是在VT下实现的,而不是直接在SSDT表的地址上修改,所以不会有同一函数被多次挂钩的限制和影响,不会与其他使用SSDT HOOK技术的进程监视工具或其他使用SSDT HOOK技术的软件产生冲突。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (5)
1.一种不触发系统保护的内核挂钩方法,其特征在于,包括:
步骤一:读取并保存MSR中原始MSR_LSTAR函数地址,并将MSR_LSTAR函数地址写入到驱动程序的全局变量KiSystemCall64Ptr中;
步骤二:组织挂钩数据并调用VMCALL指令传入虚拟机管理器中;
步骤三:虚拟机管理器保存挂钩数据以及虚拟机管理器中原始MSR_LSTAR函数地址,利用挂钩数据修改虚拟机管理器中原始MSR_LSTAR函数地址为挂钩地址;
步骤四:SYSCALL指令切入到挂钩地址,判断传入的参数和系统服务描述表索引是否为挂钩的系统服务描述表函数,如果不是,则返回至全局变量KiSystemCall64Ptr中,否则执行挂钩函数。
2.根据权利要求1所述的一种不触发系统保护的内核挂钩方法,其特征在于,执行挂钩函数的具体步骤为:
步骤a:将系统服务描述表索引、HookFuncAdder函数以及HookFuncAdder函数的参数个数记录到全局变量挂钩函数映射表HookTable和函数参数表ArgTble中,并对全局变量HOOK开关HookEnabled[Index]置TRUE,此时开启对应索引的系统服务描述表函数的钩子;
步骤b:当程序调用系统服务描述表中的函数时,调用全局变量挂钩函数映射表HookTable中对应的系统服务描述表索引的HookFuncAdder。
3.根据权利要求2所述的一种不触发系统保护的内核挂钩方法,其特征在于,挂钩函数保存在MSR中原始MSR_LSTAR函数地址内。
4.根据权利要求3所述的一种不触发系统保护的内核挂钩方法,其特征在于,包括VT框架,VT框架采用GitHub开源平台开放的工程HyperBone。
5.根据权利要求3所述的一种不触发系统保护的内核挂钩方法,其特征在于,VT框架包括VmExitMSRRead和VmExitMSRWrite退出动作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010620502.XA CN111767119B (zh) | 2020-06-30 | 2020-06-30 | 一种不触发系统保护的内核挂钩方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010620502.XA CN111767119B (zh) | 2020-06-30 | 2020-06-30 | 一种不触发系统保护的内核挂钩方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111767119A true CN111767119A (zh) | 2020-10-13 |
CN111767119B CN111767119B (zh) | 2023-05-23 |
Family
ID=72724432
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010620502.XA Active CN111767119B (zh) | 2020-06-30 | 2020-06-30 | 一种不触发系统保护的内核挂钩方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111767119B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101620660A (zh) * | 2009-07-31 | 2010-01-06 | 北京大学 | 一种Windows操作系统下钩子的防御方法 |
CN101620658A (zh) * | 2009-07-14 | 2010-01-06 | 北京大学 | 一种Windows操作系统下钩子的检测方法 |
US8397242B1 (en) * | 2009-06-30 | 2013-03-12 | Symantec Corporation | System and method for managing operations within virtual machines |
CN103559450A (zh) * | 2013-10-11 | 2014-02-05 | 南京邮电大学 | 一种基于内核驱动钩子技术的电子标签数据保护方法 |
CN105303114A (zh) * | 2015-10-26 | 2016-02-03 | 浪潮电子信息产业股份有限公司 | 基于windows的系统服务函数调用方法及装置 |
CN107678923A (zh) * | 2017-09-29 | 2018-02-09 | 郑州云海信息技术有限公司 | 一种分布式文件系统消息处理的优化方法 |
-
2020
- 2020-06-30 CN CN202010620502.XA patent/CN111767119B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8397242B1 (en) * | 2009-06-30 | 2013-03-12 | Symantec Corporation | System and method for managing operations within virtual machines |
CN101620658A (zh) * | 2009-07-14 | 2010-01-06 | 北京大学 | 一种Windows操作系统下钩子的检测方法 |
CN101620660A (zh) * | 2009-07-31 | 2010-01-06 | 北京大学 | 一种Windows操作系统下钩子的防御方法 |
CN103559450A (zh) * | 2013-10-11 | 2014-02-05 | 南京邮电大学 | 一种基于内核驱动钩子技术的电子标签数据保护方法 |
CN105303114A (zh) * | 2015-10-26 | 2016-02-03 | 浪潮电子信息产业股份有限公司 | 基于windows的系统服务函数调用方法及装置 |
CN107678923A (zh) * | 2017-09-29 | 2018-02-09 | 郑州云海信息技术有限公司 | 一种分布式文件系统消息处理的优化方法 |
Non-Patent Citations (2)
Title |
---|
KERNWEAK: "突破patchguard保护完成X64Hook", 《CSDN》 * |
吾无法无天: "基于VT技术的HOOK流程图", 《CSDN》 * |
Also Published As
Publication number | Publication date |
---|---|
CN111767119B (zh) | 2023-05-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8266395B2 (en) | Detecting attempts to change memory | |
KR101835250B1 (ko) | 트랜잭셔널 메모리를 사용한 비인가 메모리 수정 및 액세스의 검출 | |
US20120079594A1 (en) | Malware auto-analysis system and method using kernel callback mechanism | |
US7124327B2 (en) | Control over faults occurring during the operation of guest software in the virtual-machine architecture | |
US6996748B2 (en) | Handling faults associated with operation of guest software in the virtual-machine architecture | |
JP4518564B2 (ja) | 不正コード実行の防止方法、不正コード実行の防止用プログラム、及び不正コード実行の防止用プログラムの記録媒体 | |
CN106055385B (zh) | 监控虚拟机进程的系统和方法、过滤page fault异常的方法 | |
US10984096B2 (en) | Systems, methods, and apparatus for detecting control flow attacks | |
CN108920253B (zh) | 一种无代理的虚拟机监控系统和监控方法 | |
US10380336B2 (en) | Information-processing device, information-processing method, and recording medium that block intrusion of malicious program to kernel | |
CN113051034B (zh) | 一种基于kprobes的容器访问控制方法与系统 | |
CN104321748A (zh) | 用于捕捉轻量虚拟机管理器中的错误条件的方法、系统和装置 | |
CN107450964B (zh) | 一种用于发现虚拟机自省系统中是否存在漏洞的方法 | |
CN106909835B (zh) | 一种基于cpu时空隔离机制实现内核完整性度量的方法 | |
US10089474B2 (en) | Virtual machine introspection | |
CN112464221A (zh) | 内存访问行为的监控方法及系统 | |
US20100205477A1 (en) | Memory Handling Techniques To Facilitate Debugging | |
CN107203410B (zh) | 一种基于系统调用重定向的vmi方法及系统 | |
CN113176926A (zh) | 一种基于虚拟机自省技术的api动态监控方法及系统 | |
CN111931191A (zh) | Linux平台二进制软件堆溢漏洞动态检测方法及系统 | |
CN111767119B (zh) | 一种不触发系统保护的内核挂钩方法 | |
JP2015166952A (ja) | 情報処理装置、情報処理監視方法、プログラム、及び記録媒体 | |
US7818633B2 (en) | Method and apparatus for identification of program check errors indicating code with high potential for storage overlay | |
CN112463286A (zh) | 用于虚拟机操作系统的异常事件监控方法及系统 | |
CN112463287A (zh) | 基于插桩的访问请求处理方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |