CN101414338A - 一种绕过挂钩的方法和装置 - Google Patents

一种绕过挂钩的方法和装置 Download PDF

Info

Publication number
CN101414338A
CN101414338A CNA2007101624483A CN200710162448A CN101414338A CN 101414338 A CN101414338 A CN 101414338A CN A2007101624483 A CNA2007101624483 A CN A2007101624483A CN 200710162448 A CN200710162448 A CN 200710162448A CN 101414338 A CN101414338 A CN 101414338A
Authority
CN
China
Prior art keywords
reflection
function
module
address
another reflection
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
Application number
CNA2007101624483A
Other languages
English (en)
Other versions
CN101414338B (zh
Inventor
周军
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing net an Technology Limited by Share Ltd
Original Assignee
Beijing Rising International Software Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Rising International Software Co Ltd filed Critical Beijing Rising International Software Co Ltd
Priority to CN2007101624483A priority Critical patent/CN101414338B/zh
Publication of CN101414338A publication Critical patent/CN101414338A/zh
Priority to HK09107194A priority patent/HK1127422A1/xx
Application granted granted Critical
Publication of CN101414338B publication Critical patent/CN101414338B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明涉及一种绕过挂钩的方法和装置,该方法包括:在内存中已存在程序模块的原始映像的情况下,在所述内存中加载所述程序模块的另一映像;计算所述另一映像与所述原始映像之间的基址差;以及,计算所述原始映像的函数的地址与所述基址差之和,作为所述另一映像的函数的地址。本发明通过加载程序模块的另一映像并调用该另一映像中的函数,从而就绕过了恶意程序或其他程序在该程序模块的原始映像中的挂钩。

Description

一种绕过挂钩的方法和装置
技术领域
本发明涉及计算机安全技术,尤其涉及一种绕过挂钩的方法和装置。
背景技术
计算机及网络技术的迅猛发展极大地促进了信息交互。但是,与此同时,计算机病毒也伴随技术的发展而不断地演化更新,从初期的恶作剧游戏发展到今日,计算机病毒已经严重威胁到了人们对计算机的正常使用。由此,如何防范病毒侵袭已然成为人们关注的一个焦点。
随着病毒检测技术的发展,病毒与杀毒软件的对抗手段也不断地更新,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’来表示shadow映像。
如图2所示,首先,根据模块A中的节表来确定映像A’的大小(步骤S10)。然后,根据所确定的大小,在虚拟内存中为映像A’分配虚拟内存(步骤S20)。接着,根据模块A的节表中所描述的各个节数据或代码的位置,在该分配的虚拟内存的相应位置中,为映像A’填充各个节数据(步骤S30)。
然后,在模块A引入其他程序模块的导出函数的情况下,在A’的函数导入表中填充所引入的其他程序模块的导出函数地址(步骤S40)。其中,为了确保安全地绕过挂钩,需要按照本发明的方法递归地加载各个需要引入的模块的shadow映像。
接下来,基于映像A的基址来重定位映像A’(步骤S50),具体的重定位处理在下面详细说明。
上述步骤S10-S50构成了程序模块A的shadow映像A’的加载过程。
然后,计算映像A’与映像A之间的基址差(步骤S60)。
最后,计算程序映像A的函数的地址与基址差之和,作为映像A’的函数的地址(步骤S70)。
下面,详细描述程序模块A的shadow映像A’的重定位处理。
shadow映像的重定位处理是本发明的一个关键技术特征。通常情况下,在内存中加载程序模块的映像时会根据该映像在内存中的基址来重定位该映像的代码对绝对地址的引用,以使该映像中的代码可以正确地引用绝对地址上的数据。然而,程序模块的shadow映像比较特殊,因为它被加载的目的是为了得到一份原始的且没有被挂钩的代码,然而在程序模块的shadow映像载入到内存之前,与其对应的程序模块的原始映像已经加载到内存中并完成了初始化。在这种情况下,如果调用shadow映像的初始化代码来对shadow模块进行初始化,则在很多情况下会出现问题。比如,在内存中已经存在程序模块ntoskrnl.exe的原始映像的情况下,对程序模块ntoskrnl.exe的shadow映像进行初始化是不会成功的。因此,如果按照常规重定位方法来重定位shadow映像,则调用shadow映像中的函数就会因为引用了未被初始化的数据而产生异常。
在本发明的一个实施例中,基于程序模块A的原始映像的基址来对程序模块A的shadow映像A’进行重定位,以解决上述问题。下面以一个简单例子来进行说明。
假设程序模块A的原始映像的基址是0x01000000,即被加载到内存的地址0x01000000处,且程序模块A的原始映像有如下代码:
mov eax,dword ptr[0x01002040]
mov dword ptr[ebx],eax
这段代码引用了绝对地址0x01002040,并把绝对地址[0x01002040]写入到地址[ebx]中。
当程序模块A的shadow映像A’加载到内存地址0x11000000处时,如果按照常规重定位方法来处理程序模块A的shadow映像A’,则在程序模块A的shadow映像A’中上面这两条指令会被修正为:
mov eax,dword ptr[0x11002040]
mov dword ptr[ebx],eax
由于无法再次初始化程序模块A的shadow映像A’,所以当执行到程序模块A的shadow映像A’中的这两条指令时,由于地址0x11002040处的数据可能是无效的,所以这就很有可能会引发异常。
然而,在本发明中根据程序模块A的原始映像的基址来重定位程序模块A的shadow映像A’,所以在程序模块A的shadow映像A’中上面这两天指令被修正为:
mov eax,dword ptr[0x01002040]
mov dword ptr[ebx],eax
这样程序模块A的shadow映像A’就可以引用程序模块A的原始映像的全局数据了,这样既保证了全局的数据的唯一性,又安全地绕过了程序模块A的原始映像中可能存在的钩子。
图3示出了本发明一个实施例的绕过挂钩的装置示意图。如图所示,该绕过挂钩的装置10包括:加载模块101,用于在内存中已存在程序模块的原始映像的情况下,在所述内存中加载所述程序模块的另一映像;基址差计算模块103,用于计算所述另一映像与所述原始映像之间的基址差;以及,地址计算模块105,用于计算所述原始映像的函数的地址与所述基址差之和,作为所述另一映像的函数的地址。
其中,加载模块101进一步包括:确定模块201,用于确定所述另一映像的大小;分配模块203,用于根据所述确定的大小,给所述另一映像分配虚拟内存;写入模块205,用于在所述分配的虚拟内存中写入所述另一映像的各个节数据,以及当所述另一映像存在函数导入表时在所述另一映像的函数导入表中写入所述另一映像引用的各个函数地址;以及,重定位模块207,用于基于所述原始映像的基址,重定位所述另一映像。
虽然在上面实施例中,以PE格式的程序模块为例描述了本发明,但是本发明并不局限用于PE格式的程序模块。实际上,本发明也可以用于其它格式的程序模块,例如ELF格式的程序模块。
本领域技术人员应当理解,一些二进制映像不包含函数导入表,甚至一些二进制映像格式在设计上本身就不存在函数导入表,所以程序模块的shadow映像的加载过程相应地没有包括在shadow映像的函数导入表中填充所引入的函数地址的这一步骤。
本领域技术人员应当理解,本发明不但可以应用于WINDOWS操作系统,而且也可以应用于诸如UNIX、LINUX等这样的操作系统。
本领域技术人员应当理解,本发明所公开的绕过挂钩的方法和装置,可以在不偏离发明实质的情况下,做出各种修改和变形。因此,本发明的保护范围由所附的权利要求书来确定。

Claims (7)

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

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN2007101624483A CN101414338B (zh) 2007-10-15 2007-10-15 一种绕过挂钩的方法和装置
HK09107194A HK1127422A1 (en) 2007-10-15 2009-08-05 Method and apparatus for bypassing hook

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2007101624483A CN101414338B (zh) 2007-10-15 2007-10-15 一种绕过挂钩的方法和装置

Publications (2)

Publication Number Publication Date
CN101414338A true CN101414338A (zh) 2009-04-22
CN101414338B CN101414338B (zh) 2012-11-21

Family

ID=40594870

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2007101624483A Active CN101414338B (zh) 2007-10-15 2007-10-15 一种绕过挂钩的方法和装置

Country Status (2)

Country Link
CN (1) CN101414338B (zh)
HK (1) HK1127422A1 (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109086183A (zh) * 2018-07-12 2018-12-25 武汉斗鱼网络科技有限公司 一种应用程序的监控方法、装置、电子设备及存储介质
CN109933985A (zh) * 2019-02-25 2019-06-25 百度在线网络技术(北京)有限公司 一种绕过挂钩的方法、装置、设备和计算机存储介质
CN115145571A (zh) * 2021-03-31 2022-10-04 武汉斗鱼鱼乐网络科技有限公司 在程序核心代码中隐藏系统函数调用的方法、装置和介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1150454C (zh) * 2001-02-01 2004-05-19 英业达股份有限公司 拦截Win32应用程序界面的方法
CN1282059C (zh) * 2003-03-12 2006-10-25 联想(北京)有限公司 一种加快操作系统的引导方法
CN1936834B (zh) * 2006-09-14 2010-05-12 珠海金山软件股份有限公司 一种Windows平台下对抗API挂接的方法
CN100442228C (zh) * 2006-11-17 2008-12-10 迈普(四川)通信技术有限公司 嵌入式设备引导方法

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109086183A (zh) * 2018-07-12 2018-12-25 武汉斗鱼网络科技有限公司 一种应用程序的监控方法、装置、电子设备及存储介质
CN109933985A (zh) * 2019-02-25 2019-06-25 百度在线网络技术(北京)有限公司 一种绕过挂钩的方法、装置、设备和计算机存储介质
CN109933985B (zh) * 2019-02-25 2022-02-25 百度在线网络技术(北京)有限公司 一种绕过挂钩的方法、装置、设备和计算机存储介质
CN115145571A (zh) * 2021-03-31 2022-10-04 武汉斗鱼鱼乐网络科技有限公司 在程序核心代码中隐藏系统函数调用的方法、装置和介质

Also Published As

Publication number Publication date
HK1127422A1 (en) 2009-09-25
CN101414338B (zh) 2012-11-21

Similar Documents

Publication Publication Date Title
US9852296B2 (en) Rollback feature
US7103913B2 (en) Method and apparatus for determination of the non-replicative behavior of a malicious program
US8856932B2 (en) Rootkit monitoring agent built into an operating system kernel
US20220027452A1 (en) Dynamic switching between pointer authentication regimes
US7293251B2 (en) Initiating and debugging a process in a high assurance execution environment
CN1118750C (zh) 初始化和重新启动操作系统
CN100423013C (zh) 加载可信操作系统的方法和装置
US7913072B2 (en) Information-processing apparatus and activation method thereof
US20120066546A1 (en) System recovery method and computing apparatus having system recovery function
EP1902353A2 (en) Changing code execution path using kernel mode redirection
US20050114578A1 (en) Secure software SMI dispatching using caller address
US9448888B2 (en) Preventing a rollback attack in a computing system that includes a primary memory bank and a backup memory bank
US20110016463A1 (en) Computer-hardware, life-extension apparatus and method
CN101414338B (zh) 一种绕过挂钩的方法和装置
US20190102279A1 (en) Generating an instrumented software package and executing an instance thereof
US20030046524A1 (en) Method for dynamically designating initialization modules as recovery code
KR101455668B1 (ko) 분리 실행 기반의 컨텐츠용 베이식 블록 그룹 정의 장치, 정의 방법 및 그를 기록한 컴퓨터로 판독 가능한 기록매체
CN103593612A (zh) 一种处理恶意程序的方法及装置
Cohen A note on high-integrity PC bootstrapping
JP2005032182A (ja) プログラム、攻撃コード抽出装置およびその方法
KR100755960B1 (ko) 서비스 테이블 변조 감지 및 복원 시스템, 방법 그리고 그방법을 수행하는 프로그램이 기록된 컴퓨터 판독 가능한기록매체
CN102301328B (zh) 将多个设备加载到刀片上
Terzić et al. BASIC INPUT/OUTPUT SYSTEM BIOS FUNCTIONS AND MODIFICATIONS
JP2002318697A (ja) 計算機システムの障害処理プログラム

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 1127422

Country of ref document: HK

ASS Succession or assignment of patent right

Owner name: BEIJING RISING INTERNATIONAL TECHNOLOGY CO., LTD.

Free format text: FORMER OWNER: BEIJING RISING INTERNATIONAL SOFTWARE CO., LTD.

Effective date: 20100413

C41 Transfer of patent application or patent right or utility model
COR Change of bibliographic data

Free format text: CORRECT: ADDRESS; FROM: 100080 ROOM 1305, ZHONGKE BUILDING, NO.22, ZHONGGUANCUN AVENUE, BEIJING CITY TO: 100190 ROOM 1301, ZHONGKE BUILDING, NO.22, ZHONGGUANCUN AVENUE, HAIDIAN DISTRICT, BEIJING CITY

TA01 Transfer of patent application right

Effective date of registration: 20100413

Address after: 100190 Beijing City, Haidian District Zhongguancun Street Branch No. 22 building, room 1301

Applicant after: Beijing Rising Information Technology Co., Ltd.

Address before: 100080, room 1305, Zhongke building, 22 Zhongguancun street, Beijing

Applicant before: Beijing Rising International Software Co., Ltd.

C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
REG Reference to a national code

Ref country code: HK

Ref legal event code: GR

Ref document number: 1127422

Country of ref document: HK

C56 Change in the name or address of the patentee
CP01 Change in the name or title of a patent holder

Address after: 100190 Beijing City, Haidian District Zhongguancun Street Branch No. 22 building, room 1301

Patentee after: Beijing Rising Information Technology Co., Ltd

Address before: 100190 Beijing City, Haidian District Zhongguancun Street Branch No. 22 building, room 1301

Patentee before: Beijing Rising Information Technology Co., Ltd.

CP01 Change in the name or title of a patent holder
CP01 Change in the name or title of a patent holder

Address after: 100190 Beijing City, Haidian District Zhongguancun Street Branch No. 22 building, room 1301

Patentee after: Beijing net an Technology Limited by Share Ltd

Address before: 100190 Beijing City, Haidian District Zhongguancun Street Branch No. 22 building, room 1301

Patentee before: Beijing Rising Information Technology Co., Ltd