一种绕过挂钩的方法和装置制造方法及图纸

技术编号:2915593 阅读:162 留言:0更新日期:2012-04-11 18:40
本发明专利技术涉及一种绕过挂钩的方法和装置,该方法包括:在内存中已存在程序模块的原始映像的情况下,在所述内存中加载所述程序模块的另一映像;计算所述另一映像与所述原始映像之间的基址差;以及,计算所述原始映像的函数的地址与所述基址差之和,作为所述另一映像的函数的地址。本发明专利技术通过加载程序模块的另一映像并调用该另一映像中的函数,从而就绕过了恶意程序或其他程序在该程序模块的原始映像中的挂钩。

【技术实现步骤摘要】

本专利技术涉及计算机安全技术,尤其涉及一种绕过挂钩的方法和装置
技术介绍
计算机及网络技术的迅猛发展极大地促进了信息交互。但是,与此同时,计算机病毒也伴随技术的发展而不断地演化更新,从初期的恶作剧游戏发展到今日,计算机病毒已经严重威胁到了人们对计算机的正常使用。由此,如何防范病毒侵袭已然成为人们关注的一个焦点。随着病毒检测技术的发展,病毒与杀毒软件的对抗手段也不断地更新,Rootkit技术应运而生。目前的Rootkit主要为恶意程序提供隐藏文件、注册表、进程、模块等功能,而实现这一系列隐藏功能最常用的方法就是挂钩系统调用。挂钩(Hooking)是一种修改执行路径的技术,通过修改正常的调用流程来激活钩子处理函数。这种技术被安全软件和恶意程序广泛地使用。不同的是,安全软件通过挂钩来实现监控等技术,而恶意程序则通过挂钩来实现隐藏等恶意行为。当前有两种常用的挂钩方法。第一种方法是基于地址替换的挂钩方法。如果在内存中某个位置以某种格式存放着一个函数地址,那么可以通过把这个地址替换为钩子处理函数的地址来实现挂钩。使用这种方法最典型的有IAT挂钩、IDT挂钩(修改描述符中的异常处理地址)等。第二种方法是基于指令替换的挂钩方法。基于指令替换的挂钩方法是指通过修改执行路径上的一条或几条指令来达到跳转到钩子处理函数地址的挂钩方式。最常见的基于指令替换的钩子是修改函数入口的5个字节为jmp,这样当该函数被调用时便会跳转到其钩子处理函数中。-->基于指令替换的挂钩方式比较通用,但不如地址替换的挂钩方式稳定。一般安全软件多以地址替换的挂钩方式为主了,而恶意软件则多用指令替换的挂钩方法。目前的安全类软件在面对恶意软件的钩子时,一般会采取以下三种方式来绕过。第一种绕过方式是选择更为底层的API进行调用。比如发现nt!NtCreateFile被挂钩后选择更为底层的nt!IoCreateFile进行调用。然而,底层是一个相对的概念,安全软件可以选择更为底层一些的调用,恶意程序同样可以,所以这并不能成为一个有效解决方案。第二种绕过方式是直接恢复钩子。比如发现nt!NtCreateFile的入口被挂钩,便从ntoskrnl.exe中定位到nt!NtCreateFile的代码,并把入口的代码直接复制到内存中的nt!NtCreateFile入口处,然后再进行调用,这样原来的钩子就完全失效了。这种方法也可以恢复基于地址替换的钩子。然而,直接恢复内存中的钩子是非常蛮横的一种做法,因为程序是无法清晰地区分一个钩子是安全软件挂接的还是恶意程序挂接的。所以在恢复恶意程序的钩子的同时,极有可能把一些安全软件的钩子也一并恢复掉,这会使得某些安全软件部分功能受到影响或功能完全失效,反而会给系统带来额外的威胁。另外,内存中恢复这些可重入的函数在多CPU系统是非常不稳定的。第三种绕过方式是抽取部分指令做trampoline。比如发现nt!NtCreateFile的入口代码被挂钩,便从ntoskrnl.exe中定位到nt!NtCreateFile的代码并把入口的几个字节(这里不妨假设是5个)复制到一个缓冲区中,并在后面添加一条指令:jmp nt!NtCreateFile+5,这样就构造了一个trampoline,从而直接调用该trampoline就可以绕过函数入口的钩子。这种方法在这三种方式中是相对最好的,因为这种方法并不直接恢复指令,所以既不会出现多CPU上的重入不稳定性又不会影响其他安全软件的功能。然而,这种绕过方法的缺点也是显而易见的:如果钩子修改的指令比较多,那么就需要抽取至少同样多的指令,这时就不可避免地遇到一些带有相对偏移的跳转指令,这时指令抽取的复杂度就极大地增加了,绝大多数情况会导致抽取的指-->令执行异常。由于恶意程序的挂钩不仅给用户发现病毒、清除病毒带来了很大的困难,而且也给安全软件的扫描带来了更大的挑战,所以,迫切需要一种安全的绕过恶意程序挂钩的方法来解决这类问题。
技术实现思路
本专利技术的目的在于提供一种绕过挂钩的方法和装置,其能够绕过恶意程序和其他程序的挂钩。为了实现本专利技术的目的,按照本专利技术的一种绕过挂钩的方法,包括步骤:在内存中已存在程序模块的原始映像的情况下,在所述内存中加载所述程序模块的另一映像;计算所述另一映像与所述原始映像之间的基址差;以及计算所述原始映像的函数的地址与所述基址差之和,作为所述另一映像的函数的地址。为了实现本专利技术的目的,按照本专利技术的一种绕过挂钩的装置,包括:加载模块,用于在内存中已存在程序模块的原始映像的情况下,在所述内存中加载所述程序模块的另一映像;基址差计算模块,用于计算所述另一映像与所述原始映像之间的基址差;以及地址计算模块,用于计算所述原始映像的函数的地址与所述基址差之和,作为所述另一映像的函数的地址。附图说明图1示出了程序模块的原始映像和Shadow映像的函数调用示意图。图2示出了本专利技术一个实施例的绕过挂钩的方法流程示意图。-->图3示出了本专利技术一个实施例的绕过挂钩的装置示意图。优选实施方式本专利技术用于绕过挂钩的方法称为Shadow映像法,其核心思想是:在内存中已存在程序模块的一个映像(称作原始映像)的情况下,在内存中再加载该程序模块的另一映像(称作shadow映像),然后,计算该程序模块的shadow映像与该程序模块的原始映像之间的基址差,最后,计算原始映像中的函数的地址与基址差之和,作为该程序模块的函数的地址,这样,对程序模块的函数的调用都是从该程序模块的shadow映像而不是从该程序模块的原始映像中进行调用,从而就绕过了恶意程序或其他程序在该程序模块的原始映像中的挂钩。图1示出了程序模块的原始映像和Shadow映像的函数调用示意图。从图1中可以看出,对于常规调用,例如调用程序模块ntoskrnl.exe中的函数nt!NtCreateFile将调用程序模块ntoskrnl.exe的原始映像中的函数nt!NtCreateFile,这样,如果程序模块ntoskrnl.exe的原始映像中的函数nt!NtCreateFile已经被挂钩,那么这个钩子不会受到任何影响,将会发挥作用。然而,在本专利技术中,通过在内存中加载程序模块ntoskrnl.exe的shadow映像shadow ntoskrnl.exe,这是一个和程序模块ntoskrnl.exe的原始映像几乎相同的映像,那么对程序模块ntoskrnl.exe中的函数nt!NtCreateFile的调用可以通过对shadow映像shadow ntoskrnl.exe中的函数nt!NtCreateFile(即图中的shadowed nt!NtCreateFile)的调用来实现。基于这样的设计,如果可以保证程序模块ntoskrnl.exe的shadow映像shadow ntoskrnl.exe是干净的、未被挂钩的,那么对程序模块ntoskrnl.exe的shadow映像的API函数(即图中的shadowed API)的调用就可以认为是可靠的。这不仅对程序模块ntoskrnl.exe是这样,对其他的程序模块也这样。-->下面以PE格式的程序模块A为例,结合图2所示的流程示意图,详细描述本专利技术一个实施例的绕过挂钩的方法。以下以A来表示原始映像;A’来表示shado本文档来自技高网
...

【技术保护点】
一种绕过挂钩的方法,包括步骤: 在内存中已存在程序模块的原始映像的情况下,在所述内存中加载所述程序模块的另一映像; 计算所述另一映像与所述原始映像之间的基址差;以及 计算所述原始映像的函数的地址与所述基址差之和,作为所述另 一映像的函数的地址。

【技术特征摘要】
1、一种绕过挂钩的方法,包括步骤:在内存中已存在程序模块的原始映像的情况下,在所述内存中加载所述程序模块的另一映像;计算所述另一映像与所述原始映像之间的基址差;以及计算所述原始映像的函数的地址与所述基址差之和,作为所述另一映像的函数的地址。2、如权利要求1所述的方法,其中,所述加载步骤进一步包括:确定所述另一映像的大小;根据所述确定的大小,给所述另一映像分配虚拟内存;以及在所述分配的虚拟内存中写入所述另一映像的各个节数据。3、如权利要求2所述的方法,其中,所述加载步骤还包括:基于所述原始映像的基址,重定位所述另一映像。4、如权利要求2所述的方法,其中,当所述另一映像中存在函数导入表时,所述加载步骤还包括:在所述另一映像的函数导入表中写入所述另一映像引入的各个函数地址。5、一种绕过挂钩的装置,...

【专利技术属性】
技术研发人员:周军
申请(专利权)人:北京瑞星国际软件有限公司
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1