CN118260755A - 一种应用层检测进程Hook的方法 - Google Patents
一种应用层检测进程Hook的方法 Download PDFInfo
- Publication number
- CN118260755A CN118260755A CN202410340674.XA CN202410340674A CN118260755A CN 118260755 A CN118260755 A CN 118260755A CN 202410340674 A CN202410340674 A CN 202410340674A CN 118260755 A CN118260755 A CN 118260755A
- Authority
- CN
- China
- Prior art keywords
- address
- detected
- function
- module
- hook
- 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
- 238000000034 method Methods 0.000 title claims abstract description 179
- 230000008569 process Effects 0.000 claims abstract description 152
- 230000006870 function Effects 0.000 claims abstract description 142
- 230000008676 import Effects 0.000 claims abstract description 47
- 238000001514 detection method Methods 0.000 claims description 5
- 238000000547 structure data Methods 0.000 claims description 3
- 238000006243 chemical reaction Methods 0.000 claims description 2
- 230000000875 corresponding effect Effects 0.000 description 14
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 241000700605 Viruses Species 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000004088 simulation Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/554—Detecting local intrusion or implementing counter-measures involving event detection and direct action
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/566—Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
-
- 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)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Physics & Mathematics (AREA)
- Virology (AREA)
- Health & Medical Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种应用层检测进程Hook的方法,属于网络安全领域。为解决在应用层既检测IAT HOOK,又检测INLINE HOOK的问题,本发明获取待检测进程的本地源文件;在当前进程中拉伸待检测进程的源文件到内存中;根据待检测进程源文件的PE格式特征,获取导入表并解析表中内容,使用解析出的相对虚拟地址RVA获取所有模块及函数地址;根据PE格式读取待检测进程内存,获取导入表中的所有模块名、模块地址范围及模块所有函数的地址,同时对所有进程创建快照,通过系统函数获取待检测进程加载的所有模块名、模块基地址和大小,进而获取所有模块及函数地址;循环比较检测IAT HOOK和INLINE HOOK。本发明运行在应用层,不仅对进程的Hook做到一个全面的检测,而且保证了系统的稳定性。
Description
技术领域
本发明属于网络安全领域,具体涉及一种应用层检测进程Hook的方法。
背景技术
Hook(钩子)是一种在计算机程序中实现拦截、修改或增强操作的技术。它可以在特定的事件或操作发生时,使另一个函数或程序接收到通知并采取相应的措施。Hook技术在操作系统、安全软件、游戏等领域得到了广泛应用。
实际环境中可能会存在一些恶意的Hook。恶意Hook是指攻击者使用Hook技术来实现对系统或应用程序的非法修改或控制。它不仅能后窃取用户的信息,还能篡改系统的行为(如修改系统设置、隐藏病毒等)、对计算机实现远程控制导致变成僵尸计算机等。
目前检测Hook的技术主要分为两种:一种是在应用层检测Hook;一种是在驱动层检测Hook。在应用层检测Hook的方式可以检测出IAT HOOK(导入地址表钩子),但是对于INLINE HOOK(内联钩子)的检测没有一种可行的方案。在驱动层检测Hook可以做到一个非常全面的检测,不仅可以检测出IAT HOOK,也可以检测出INLINE HOOK,但是驱动对于操作系统来说是比较危险的,一不小心就可能会导致系统的蓝屏崩溃和其他的一些意外情况。因此基于此背景,能够在应用层做到既可以检测IAT HOOK,又可以检测INLINE HOOK是非常必要的。
发明内容
(一)要解决的技术问题
本发明要解决的技术问题是如何提供一种应用层检测进程Hook的方法,以解决在应用层既可以检测IAT HOOK,又可以检测INLINE HOOK的问题。
(二)技术方案
为了解决上述技术问题,本发明提出一种应用层检测进程Hook的方法,该方法包括如下步骤:
步骤S1、获取待检测进程的本地源文件;
步骤S2、在当前进程中拉伸待检测进程的源文件到内存中,模拟待检测进程在系统中的加载情况;
步骤S3、根据待检测进程源文件的PE格式特征,获取导入表并解析表中内容,使用解析出的相对虚拟地址RVA获取所有模块及函数地址;
步骤S4、根据PE格式读取待检测进程内存,获取导入表中的所有模块名、模块地址范围及模块所有函数的地址,同时对所有进程创建快照,通过系统函数获取待检测进程加载的所有模块名、模块基地址和大小,进而获取所有模块及函数地址;
步骤S5、循环待检测进程内存中的所有函数,从源文件中找到相应的模块和函数地址,并比较,函数地址不同则为IAT HOOK,函数地址相同的话比较5个字节数据,数据不同则为INLINE HOOK,并能找到HOOK的源文件。
进一步地,所述步骤S1具体包括:
步骤S11、使用OpenProcess系统函数打开待检测进程,获取返回的进程句柄;
步骤S12、获取系统库ntdll.dll中未公开的API:ZwQueryInformationProcess,该API获取待检测进程的镜像文件信息ProcessImageFileName并传给第二个参数,将接收文件路径的缓存区指针指向该参数,从而获取待检测进程的本地源文件。
进一步地,所述步骤S2具体包括:
步骤S21、读取源文件内容到内存中,在当前进程中申请第一虚拟内存,读取待检测进程的本地源文件内容,将其加载到第一虚拟内存中;
步骤S22、获取源文件中PE文件的DOS头,读取DOS结构大小内容,获取DOS头结构数据;
步骤S23、申请第二虚拟内存:根据PE DOS头的e_lfanew字段获取偏移量,使用偏移量从源文件数据中获取PE NT头,通过PE NT头中的基地址和大小在当前进程中申请第二虚拟内存,若无法申请到第二虚拟内存,则随机在虚拟内存空间中申请一个空间,并将申请到的空间的起始地址作为第二虚拟内存的起始地址;
步骤S24、根据PE结构,将其记录中的各个节通过RVA依据申请到的第二虚拟内存的起始地址存放到相应的偏移位置;
步骤S25、将导入表拉伸到第二虚拟内存中,根据PE结构中的导入表和RVA获取导入表所在的偏移,根据偏移和第二虚拟内存的起始地址,将导入表中各模块名称及函数地址数据写入到申请的第二虚拟内存中。
进一步地,通过PE NT头中的基地址和大小在当前进程中申请第二虚拟内存包括:根据PE格式从源文件内容中获取PE NT头,根据PE NT头的ImageBase字段确定第二虚拟内存的起始地址,根据PE NT头的SizeOfImage字段,确定申请第二虚拟内存的大小。
进一步地,所述步骤S3具体包括:
步骤S31、获取模块名和函数名:根据步骤S24获取到的导入表结构,循环读取导入表描述符结构IMAGE_IMPORT_DESCRIPTOR中的模块名Name字段,根据链表OriginalFirstThunk字段结构获取函数名,判断OriginalFirstThunk结构的u1.Ordinal是否包含IMAGE_ORDINAL_FLAG标志,若包含则通过u1.AddressOfData字段获取内存偏移量,使用此偏移量即可获取导入表中属于此模块的函数名;
步骤S32、获取函数地址:使用系统函数LoadLibrary接收返回的模块地址,通过此模块地址使用系统函数GetProcAddress获取其他所有系统函数的地址,并读取该地址的前5个字节。
进一步地,所述步骤S4具体包括:
步骤S41、获取待检测进程句柄,使用系统函数OpenProcess接收返回的待检测进程句柄;
步骤S42、获取待检测进程的基址,使用系统函数EunmProcessModules获取第一个模块的地址,即为待检测进程的基址;
步骤S43、获取待检测进程的PE DOS头,在当前进程中申请PE DOS头结构大小的第三虚拟内存用于存放PE DOS头,使用系统函数ReadProcessMemory读取待检测进程相应大小的内存数据,获取并存放PE DOS头结构;
步骤S44、在当前进程中申请第四虚拟内存,根据步骤S43获取的PE DOS头中的e_lfanew字段读取待检测进程的中PE NT头结构大小的数据,获取PE NT头的基地址和大小并申请一块对应的第四虚拟内存,若申请失败则不固定基地址申请一块此大小的虚拟内存空间作为第四虚拟内存,记录此第四虚拟内存的基地址,最后从待检测进程中的基地址位置读取此大小的数据到申请到的第四虚拟内存中;
步骤S45、从第四虚拟内存中获取待检测进程所有模块的基地址和大小,使用系统函数CreateToolhelp32Snapshot,并以常量TH32CS_SNAPALL作为第一个参数以创建所有进程快照,使用系统函数Module32First和Module32Next获取待检测进程中模块的名字、模块基地址和大小,进而获取所有模块的模块地址范围;
步骤S46、获取待检测进程的导入表中的模块名和函数名,从第四虚拟内存中解析PE文件,直接解析PE文件的导入表中的OriginalFirstThunk.u1.Function字段即为函数地址,并读取该地址的前5个字节。
进一步地,所述步骤S46中,待检测进程中使用的虚拟地址不需要进行RVA转换,直接使用。
进一步地,所述步骤S5具体包括:
步骤S51、根据模块名、函数名将从步骤S3和步骤S4中获取到的PE文件函数地址和待检测进程的函数地址进行比对,若相同模块、相同函数名下函数地址不同,则判断为此函数被IAT HOOK;若函数地址相同,则比较两个函数地址中的前5个字节数据是否相同,不同则判断为INLINE HOOK;
步骤S52、INLINE HOOK情况下,若上述5个字节的第一个字节为jmp指令,则解析后4个字节,将4个字节的数据与步骤S45中获取的待检测进程所有模块的模块地址范围作比较,若4个字节的数据表示的地址在某个模块的地址范围内则判断HOOK的源文件即为此文件。
进一步地,所述步骤S52具体包括:若第一个字节为E9,即jmp指令,则继续读取后续4个字节,根据4个字节数据和当前地址计算出跳转地址,比较此跳转地址是否和源文件拉伸后的函数地址是否一样,若不同则代表此函数被INLINE HOOK,并根据jmp后的地址通过检测此地址在待检测进程中哪个模块地址范围内找到其所在的模块,并可获取相应模块名信息。
进一步地,跳转地址= 4字节数据+当前地址+5
(三)有益效果
本发明提出一种应用层检测进程Hook的方法,本发明与现有技术相比,其显著优点是:(1)由于是运行在应用层,所以保证了系统的稳定性,不像驱动会影响系统的稳定性。(2)它可以像驱动似的,能够对进程的Hook做到一个全面的检测,不仅可以检测IAT HOOK,还可以检测INLINE HOOK,并可追溯INLINE HOOK的源头文件。
附图说明
图1为本发明的流程图。
具体实施方式
为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
本发明公开了一种在应用层检测进程是否被Hook的方法,其中包括IAT HOOK和INLINE HOOK两种方式的检测。
本发明的一种应用层检测进程Hook的方法,包括如下步骤:
步骤S1、获取待检测进程的本地源文件;
步骤S2、在当前进程中拉伸待检测进程的源文件到内存中,模拟待检测进程在系统中的加载情况;
步骤S3、根据待检测进程源文件的PE格式特征,获取导入表并解析表中内容,使用解析出的相对虚拟地址RVA获取所有模块及函数地址;
步骤S4、根据PE格式读取待检测进程内存,获取导入表中的所有模块名、模块地址范围及模块所有函数的地址,同时对所有进程创建快照,通过系统函数获取待检测进程加载的所有模块名、模块基地址和大小,进而获取所有模块及函数地址;
步骤S5、循环待检测进程内存中的所有函数,从源文件中找到相应的模块和函数地址,并比较,函数地址不同则为IAT HOOK,函数地址相同的话比较5个字节数据,数据不同则为INLINE HOOK,并能找到HOOK的源文件。
进一步地,步骤S1具体包括:
步骤S11、使用OpenProcess系统函数打开待检测进程,获取返回的进程句柄;
步骤S12、获取微软在系统库ntdll.dll中未公开的API:ZwQueryInformationProcess,该API获取待检测进程的镜像文件信息ProcessImageFileName并传给第二个参数,将接收文件路径的缓存区指针指向该参数,从而获取待检测进程的本地源文件。
进一步地,步骤S2具体包括:
步骤S21、读取源文件内容到内存中,在当前进程(非检测Hook的进程)中申请第一虚拟内存,读取待检测进程的本地源文件内容,将其加载到第一虚拟内存中;
步骤S22、获取源文件中PE文件的DOS头,读取DOS结构大小内容,获取DOS头结构数据;
步骤S23、申请第二虚拟内存:根据PE DOS头的e_lfanew字段获取偏移量,使用偏移量从源文件数据中获取PE NT头,通过PE NT头中的基地址和大小在当前进程中申请第二虚拟内存,具体地,根据PE格式从源文件内容中获取PE NT头,根据PE NT头的ImageBase字段确定第二虚拟内存的起始地址,根据PE NT头的SizeOfImage字段,确定申请第二虚拟内存的大小,若无法申请到第二虚拟内存,则随机在虚拟内存空间中申请一个空间,并将申请到的空间的起始地址作为第二虚拟内存的起始地址;
步骤S24、根据PE结构,将其记录中的各个节通过RVA依据申请到的第二虚拟内存的起始地址存放到相应的偏移位置;
步骤S25、将导入表拉伸到第二虚拟内存中,根据PE结构中的导入表和RVA获取导入表所在的偏移,根据偏移和第二虚拟内存的起始地址,将导入表中各模块名称及函数地址等数据写入到申请的第二虚拟内存中。
进一步地,步骤S3具体包括:
步骤S31、获取模块名和函数名:根据步骤S24获取到的导入表结构,循环读取导入表描述符结构IMAGE_IMPORT_DESCRIPTOR中的模块名Name字段,根据链表OriginalFirstThunk字段结构获取函数名,判断OriginalFirstThunk结构的u1.Ordinal是否包含IMAGE_ORDINAL_FLAG标志,若包含则通过u1.AddressOfData字段获取内存偏移量,使用此偏移量即可获取导入表中属于此模块的函数名;
步骤S32、获取函数地址:使用系统函数LoadLibrary接收返回的模块地址,通过此模块地址使用系统函数GetProcAddress获取其他所有系统函数的地址(原理使用的是系统库在系统加载时其所在的虚拟地址就已经固定了,所以无论是在哪个进程中它的虚拟地址都是一样的),并读取该地址的前5个字节;
进一步地,步骤S4具体包括:
步骤S41、获取待检测进程句柄,使用系统函数OpenProcess接收返回的待检测进程句柄;
步骤S42、获取待检测进程的基址,使用系统函数EunmProcessModules获取第一个模块的地址(即待检测进程的基址);
步骤S43、获取待检测进程的PE DOS头,在当前进程中申请PE DOS头结构大小的第三虚拟内存用于存放PE DOS头,使用系统函数ReadProcessMemory读取待检测进程相应大小的内存数据,获取并存放PE DOS头结构;
步骤S44、在当前进程中申请第四虚拟内存,根据步骤S43获取的PE DOS头中的e_lfanew字段读取待检测进程的中PE NT头结构大小的数据,获取PE NT头的基地址和大小并申请一块对应的第四虚拟内存,若申请失败则不固定基地址申请一块此大小的虚拟内存空间作为第四虚拟内存,记录此第四虚拟内存的基地址,最后从待检测进程中的基地址位置读取此大小的数据到申请到的第四虚拟内存中;
步骤S45、从第四虚拟内存中获取待检测进程所有模块的基地址和大小,使用系统函数CreateToolhelp32Snapshot,并以常量TH32CS_SNAPALL(0x80000000)作为第一个参数以创建所有进程快照,使用系统函数Module32First和Module32Next获取待检测进程中模块的名字、模块基地址和大小,进而获取所有模块的模块地址范围;
步骤S46、获取待检测进程的导入表中的模块名和函数名,从第四虚拟内存中解析PE文件,与步骤S31相同,区别在于待检测进程中使用的虚拟地址不需要进行RVA转换,直接使用即可,函数地址也不需要通过系统获取,直接解析PE文件的导入表中的OriginalFirstThunk.u1.Function字段即为函数地址,并读取该地址的前5个字节。
进一步地,步骤S5具体包括:
步骤S51、根据模块名、函数名将从步骤S3和步骤S4中获取到的PE文件函数地址和待检测进程的函数地址进行比对,若相同模块、相同函数名下函数地址不同,则为IATHOOK;若函数地址相同,则比较两个函数地址中的前5个字节数据是否相同,不同则判断为INLINE HOOK;
步骤S52、INLINE HOOK情况下,若上述5个字节的第一个字节为jmp指令,则解析后4个字节,将4个字节的数据与步骤S45中获取的待检测进程所有模块的模块地址范围作比较,若4个字节的数据表示的地址在某个模块的地址范围内则判断HOOK的源文件(动态库)即为此文件。
实施例1
本发明的目的在于提供一种在应用层能全面检测进程HOOK的方法。
实现本发明目的的技术解决方案为:一种应用层检测进程HOOK的方法,步骤如下:
第一步,获取待检测进程的本地源文件:根据系统接口获取待检测进程在本地的源文件,为第二步的模拟待检测进程在系统中加载做准备;
第二步,将待检测进程的源文件拉伸到当前进程的内存中:根据PE结构,解析本地源文件的内容数据PE结构,从PE结构中读取DOS头、NT头,并依次获取PE文件的导入表,依据导入表结构获取RVA,从而将导入表中各模块名称及函数地址等数据加载到申请的虚拟内存中;
第三步,根据拉伸到虚拟内存中的PE文件获取该文件的导入表,从导入表记录模块名和函数名的RVA获取PE文件的所有模块名和函数名,并使用系统函数获取其他函数的地址,读取该地址的5个字节;
第四步,打开待检测进程,对所有进程创建快照,使用系统函数获取待检测进程加载的所有模块名、模块基地址和大小;
第五步,打开待检测进程,根据PE文件结构,获取进程的PE DOS头,从而找到PE NT头获取进程基地址,由NT头找到待检测进程的导入表结构,根据导入表中记录的模块名、函数名虚拟地址获取导入表中所有的模块名和函数名,并根据导入表结构中的偏移字段获取函数地址,读取该函数地址指向的5个字节;
第六步,根据第三步获取的模块名、模块中包含的函数名找到第五步获取的待检测进程相应的函数,比较其函数地址,函数地址不同则为IAT HOOK;函数地址相同的话比较5个字节数据,数据不同则为INLINE HOOK,将后四个字节与第四步获取的模块范围进行比较,若后四个字节的地址在某个模块内,则HOOK的源文件即为此模块。
实施例2
结合图1,本发明在应用层检测进程Hook的方法,步骤如下:
第一步,根据待检测进程获取源文件;
第二步,在当前进程中拉伸待检测进程的源文件到内存中,模拟待检测进程在系统中的加载情况;
第三步,根据源PE文件的格式,获取PE文件的导入表(IMAGE_IMPORT_DESCRIPTOR结构),使用RVA获取所有模块及函数地址;
第四步,根据PE格式读取待检测进程内存,获取导入表中的所有模块名、模块地址范围及模块所有函数的地址;
第五步,循环进程内存中的所有函数,从源文件中找到相应的的模块和函数地址,并比较;
a.若函数地址不一样,则判断为此函数被IAT HOOK,可根据此地址定位到进程中的相应函数;
b.若函数地址一样,则读取该地址中的数据。若第一个字节为E9(即jmp指令),则继续读取后续4个字节,根据4个字节数据和当前地址计算出跳转地址(跳转地址 = 4字节数据+当前地址+5),比较此跳转地址是否和源文件拉伸后的函数地址是否一样,若不同则代表此函数被INLINE HOOK,并可根据jmp后的地址找到其所在的模块(看此地址在待检测进程中哪个模块地址范围内),并可获取相应模块名等信息。
本发明与现有技术相比,其显著优点是:(1)由于是运行在应用层,所以保证了系统的稳定性,不像驱动会影响系统的稳定性。(2)它可以像驱动似的,能够对进程的Hook做到一个全面的检测,不仅可以检测IAT HOOK,还可以检测INLINE HOOK。并可追溯INLINEHOOK的源头文件。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
Claims (10)
1.一种应用层检测进程Hook的方法,其特征在于,该方法包括如下步骤:
步骤S1、获取待检测进程的本地源文件;
步骤S2、在当前进程中拉伸待检测进程的源文件到内存中,模拟待检测进程在系统中的加载情况;
步骤S3、根据待检测进程源文件的PE格式特征,获取导入表并解析表中内容,使用解析出的相对虚拟地址RVA获取所有模块及函数地址;
步骤S4、根据PE格式读取待检测进程内存,获取导入表中的所有模块名、模块地址范围及模块所有函数的地址,同时对所有进程创建快照,通过系统函数获取待检测进程加载的所有模块名、模块基地址和大小,进而获取所有模块及函数地址;
步骤S5、循环待检测进程内存中的所有函数,从源文件中找到相应的模块和函数地址,并比较,函数地址不同则为IAT HOOK,函数地址相同的话比较5个字节数据,数据不同则为INLINE HOOK,并能找到HOOK的源文件。
2.如权利要求1所述的应用层检测进程Hook的方法,其特征在于,所述步骤S1具体包括:
步骤S11、使用OpenProcess系统函数打开待检测进程,获取返回的进程句柄;
步骤S12、获取系统库ntdll.dll中未公开的API:ZwQueryInformationProcess,该API获取待检测进程的镜像文件信息ProcessImageFileName并传给第二个参数,将接收文件路径的缓存区指针指向该参数,从而获取待检测进程的本地源文件。
3.如权利要求1所述的应用层检测进程Hook的方法,其特征在于,所述步骤S2具体包括:
步骤S21、读取源文件内容到内存中,在当前进程中申请第一虚拟内存,读取待检测进程的本地源文件内容,将其加载到第一虚拟内存中;
步骤S22、获取源文件中PE文件的DOS头,读取DOS结构大小内容,获取DOS头结构数据;
步骤S23、申请第二虚拟内存:根据PE DOS头的e_lfanew字段获取偏移量,使用偏移量从源文件数据中获取PE NT头,通过PE NT头中的基地址和大小在当前进程中申请第二虚拟内存,若无法申请到第二虚拟内存,则随机在虚拟内存空间中申请一个空间,并将申请到的空间的起始地址作为第二虚拟内存的起始地址;
步骤S24、根据PE结构,将其记录中的各个节通过RVA依据申请到的第二虚拟内存的起始地址存放到相应的偏移位置;
步骤S25、将导入表拉伸到第二虚拟内存中,根据PE结构中的导入表和RVA获取导入表所在的偏移,根据偏移和第二虚拟内存的起始地址,将导入表中各模块名称及函数地址数据写入到申请的第二虚拟内存中。
4.如权利要求3所述的应用层检测进程Hook的方法,其特征在于,通过PE NT头中的基地址和大小在当前进程中申请第二虚拟内存包括:根据PE格式从源文件内容中获取PE NT头,根据PE NT头的ImageBase字段确定第二虚拟内存的起始地址,根据PE NT头的SizeOfImage字段,确定申请第二虚拟内存的大小。
5.如权利要求3或4所述的应用层检测进程Hook的方法,其特征在于,所述步骤S3具体包括:
步骤S31、获取模块名和函数名:根据步骤S24获取到的导入表结构,循环读取导入表描述符结构IMAGE_IMPORT_DESCRIPTOR中的模块名Name字段,根据链表OriginalFirstThunk字段结构获取函数名,判断OriginalFirstThunk结构的u1.Ordinal是否包含IMAGE_ORDINAL_FLAG标志,若包含则通过u1.AddressOfData字段获取内存偏移量,使用此偏移量即可获取导入表中属于此模块的函数名;
步骤S32、获取函数地址:使用系统函数LoadLibrary接收返回的模块地址,通过此模块地址使用系统函数GetProcAddress获取其他所有系统函数的地址,并读取该地址的前5个字节。
6.如权利要求5所述的应用层检测进程Hook的方法,其特征在于,所述步骤S4具体包括:
步骤S41、获取待检测进程句柄,使用系统函数OpenProcess接收返回的待检测进程句柄;
步骤S42、获取待检测进程的基址,使用系统函数EunmProcessModules获取第一个模块的地址,即为待检测进程的基址;
步骤S43、获取待检测进程的PE DOS头,在当前进程中申请PE DOS头结构大小的第三虚拟内存用于存放PE DOS头,使用系统函数ReadProcessMemory读取待检测进程相应大小的内存数据,获取并存放PE DOS头结构;
步骤S44、在当前进程中申请第四虚拟内存,根据步骤S43获取的PE DOS头中的e_lfanew字段读取待检测进程的中PE NT头结构大小的数据,获取PE NT头的基地址和大小并申请一块对应的第四虚拟内存,若申请失败则不固定基地址申请一块此大小的虚拟内存空间作为第四虚拟内存,记录此第四虚拟内存的基地址,最后从待检测进程中的基地址位置读取此大小的数据到申请到的第四虚拟内存中;
步骤S45、从第四虚拟内存中获取待检测进程所有模块的基地址和大小,使用系统函数CreateToolhelp32Snapshot,并以常量TH32CS_SNAPALL作为第一个参数以创建所有进程快照,使用系统函数Module32First和Module32Next获取待检测进程中模块的名字、模块基地址和大小,进而获取所有模块的模块地址范围;
步骤S46、获取待检测进程的导入表中的模块名和函数名,从第四虚拟内存中解析PE文件,直接解析PE文件的导入表中的OriginalFirstThunk.u1.Function字段即为函数地址,并读取该地址的前5个字节。
7.如权利要求6所述的应用层检测进程Hook的方法,其特征在于,所述步骤S46中,待检测进程中使用的虚拟地址不需要进行RVA转换,直接使用。
8.如权利要求6所述的应用层检测进程Hook的方法,其特征在于,所述步骤S5具体包括:
步骤S51、根据模块名、函数名将从步骤S3和步骤S4中获取到的PE文件函数地址和待检测进程的函数地址进行比对,若相同模块、相同函数名下函数地址不同,则判断为此函数被IAT HOOK;若函数地址相同,则比较两个函数地址中的前5个字节数据是否相同,不同则判断为INLINE HOOK;
步骤S52、INLINE HOOK情况下,若上述5个字节的第一个字节为jmp指令,则解析后4个字节,将4个字节的数据与步骤S45中获取的待检测进程所有模块的模块地址范围作比较,若4个字节的数据表示的地址在某个模块的地址范围内则判断HOOK的源文件即为此文件。
9.如权利要求8所述的应用层检测进程Hook的方法,其特征在于,所述步骤S52具体包括:若第一个字节为E9,即jmp指令,则继续读取后续4个字节,根据4个字节数据和当前地址计算出跳转地址,比较此跳转地址是否和源文件拉伸后的函数地址是否一样,若不同则代表此函数被INLINE HOOK,并根据jmp后的地址通过检测此地址在待检测进程中哪个模块地址范围内找到其所在的模块,并可获取相应模块名信息。
10.如权利要求9所述的应用层检测进程Hook的方法,其特征在于,跳转地址= 4字节数据+当前地址+5。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410340674.XA CN118260755B (zh) | 2024-03-25 | 2024-03-25 | 一种应用层检测进程Hook的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410340674.XA CN118260755B (zh) | 2024-03-25 | 2024-03-25 | 一种应用层检测进程Hook的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN118260755A true CN118260755A (zh) | 2024-06-28 |
CN118260755B CN118260755B (zh) | 2024-10-01 |
Family
ID=91612417
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410340674.XA Active CN118260755B (zh) | 2024-03-25 | 2024-03-25 | 一种应用层检测进程Hook的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN118260755B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20100031808A (ko) * | 2008-09-16 | 2010-03-25 | 삼성전자주식회사 | 가상 플랫폼을 이용한 프로그램 작성과 디버깅 방법 및 장치 |
JP2011165038A (ja) * | 2010-02-12 | 2011-08-25 | Renesas Electronics Corp | ソフトウェア開発装置、プログラム、記録媒体、及び半導体集積回路装置 |
US20130198527A1 (en) * | 2010-10-28 | 2013-08-01 | Zhou Lu | Execution method of .net program after encryption |
CN112733093A (zh) * | 2021-01-04 | 2021-04-30 | 中国电力科学研究院有限公司 | 基于ring3环对抗的程序行为保护方法、系统及存储介质 |
CN113722712A (zh) * | 2021-09-06 | 2021-11-30 | 杭州安恒信息技术股份有限公司 | 一种基于hook的程序恶意行为的检测方法及相关装置 |
CN114417335A (zh) * | 2022-01-19 | 2022-04-29 | 杭州安恒信息技术股份有限公司 | 一种恶意文件检测方法、装置、电子设备及存储介质 |
CN115952017A (zh) * | 2023-03-09 | 2023-04-11 | 腾讯科技(深圳)有限公司 | 一种内存处理方法、装置、设备及介质 |
WO2023109311A1 (zh) * | 2021-12-13 | 2023-06-22 | 北京有竹居网络技术有限公司 | 资源访问方法、装置、存储介质以及电子设备 |
-
2024
- 2024-03-25 CN CN202410340674.XA patent/CN118260755B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20100031808A (ko) * | 2008-09-16 | 2010-03-25 | 삼성전자주식회사 | 가상 플랫폼을 이용한 프로그램 작성과 디버깅 방법 및 장치 |
JP2011165038A (ja) * | 2010-02-12 | 2011-08-25 | Renesas Electronics Corp | ソフトウェア開発装置、プログラム、記録媒体、及び半導体集積回路装置 |
US20130198527A1 (en) * | 2010-10-28 | 2013-08-01 | Zhou Lu | Execution method of .net program after encryption |
CN112733093A (zh) * | 2021-01-04 | 2021-04-30 | 中国电力科学研究院有限公司 | 基于ring3环对抗的程序行为保护方法、系统及存储介质 |
CN113722712A (zh) * | 2021-09-06 | 2021-11-30 | 杭州安恒信息技术股份有限公司 | 一种基于hook的程序恶意行为的检测方法及相关装置 |
WO2023109311A1 (zh) * | 2021-12-13 | 2023-06-22 | 北京有竹居网络技术有限公司 | 资源访问方法、装置、存储介质以及电子设备 |
CN114417335A (zh) * | 2022-01-19 | 2022-04-29 | 杭州安恒信息技术股份有限公司 | 一种恶意文件检测方法、装置、电子设备及存储介质 |
CN115952017A (zh) * | 2023-03-09 | 2023-04-11 | 腾讯科技(深圳)有限公司 | 一种内存处理方法、装置、设备及介质 |
Non-Patent Citations (1)
Title |
---|
刘勇;江泽涛;甘晟科;李克伟;: "一种双重防范Rootkit的方法", 计算机与现代化, no. 02, 15 February 2009 (2009-02-15) * |
Also Published As
Publication number | Publication date |
---|---|
CN118260755B (zh) | 2024-10-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11176247B2 (en) | System and method for container assessment using sandboxing | |
US7631356B2 (en) | System and method for foreign code detection | |
US9904787B2 (en) | Identifying stored security vulnerabilities in computer software applications | |
US7607122B2 (en) | Post build process to record stack and call tree information | |
US20220035918A1 (en) | System and Method for Validating In-Memory Integrity of Executable Files to Identify Malicious Activity | |
CN109783316B (zh) | 系统安全日志篡改行为的识别方法及装置、存储介质、计算机设备 | |
WO2019013033A1 (ja) | コールスタック取得装置、コールスタック取得方法、および、コールスタック取得プログラム | |
US20120222116A1 (en) | System and method for detecting web browser attacks | |
US10275595B2 (en) | System and method for characterizing malware | |
KR100961146B1 (ko) | 악성 스크립트 코드 복호화 방법 및 시스템 | |
CN118260755B (zh) | 一种应用层检测进程Hook的方法 | |
KR101042858B1 (ko) | 윈도우즈 커널 변조 탐지방법 | |
Sharma et al. | Windows operating system vulnerabilities | |
Newsham et al. | Breaking forensics software: Weaknesses in critical evidence collection | |
US7281271B1 (en) | Exception handling validation system and method | |
CN106682512B (zh) | 一种防止程序被修改的方法及其装置、系统 | |
US10503929B2 (en) | Visually configurable privacy enforcement | |
US7519868B2 (en) | Information processing apparatus, information processing method, computer program, and storage medium | |
KR102226218B1 (ko) | 크로스플랫폼 개발 프레임워크로 제작된 애플리케이션을 식별하기 위한 특징정보 추출 장치 및 방법 | |
CN113779576A (zh) | 一种可执行文件感染病毒的识别方法、装置及电子设备 | |
CN107239703B (zh) | 一种动态链接库缺失的可执行程序的动态分析方法 | |
JP4898823B2 (ja) | アプリケーション情報改竄監視装置及び方法 | |
CN113391874B (zh) | 一种虚拟机检测对抗方法、装置、电子设备及存储介质 | |
CN110610086B (zh) | 非法代码识别方法、系统、装置及存储介质 | |
US8429744B1 (en) | Systems and methods for detecting malformed arguments in a function by hooking a generic object |
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 |