CN103530552B - Native API函数重构方法及装置 - Google Patents
Native API函数重构方法及装置 Download PDFInfo
- Publication number
- CN103530552B CN103530552B CN201310455970.6A CN201310455970A CN103530552B CN 103530552 B CN103530552 B CN 103530552B CN 201310455970 A CN201310455970 A CN 201310455970A CN 103530552 B CN103530552 B CN 103530552B
- Authority
- CN
- China
- Prior art keywords
- function
- custom
- loading
- code segment
- ntdll
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 44
- 230000006870 function Effects 0.000 claims abstract description 505
- 238000005315 distribution function Methods 0.000 claims description 51
- 238000004088 simulation Methods 0.000 abstract 1
- 230000008569 process Effects 0.000 description 12
- 238000010586 diagram Methods 0.000 description 4
- 238000012544 monitoring process Methods 0.000 description 2
- 239000008186 active pharmaceutical agent Substances 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 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/556—Detecting local intrusion or implementing counter-measures involving covert channels, i.e. data leakage between processes
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种Native API函数重构方法及装置,属于计算机技术领域。所述方法包括:获取加载函数的系统调用号;将每个加载函数的系统调用号分别拷贝至自定义加载函数的代码体中;根据自定义加载函数将NTDLL.DLL加载至内存的指定位置;利用NTDLL.DLL中的Native API函数分别重构自定义代码段内各个自定义Native API函数。本发明通过模拟加载函数对NTDLL.DLL进行加载,利用加载后的NTDLL.DLL对Native API函数进行重构;解决了现有技术中调用API函数时存在较大安全隐患的问题;在应用程序运行时可以直接调用重构后的自定义Native API函数,达到了避免应用程序被恶意程序处理,提高应用程序安全性的效果。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种Native API函数重构方法及装置。
背景技术
随着WINDOWS API(WINDOWS Application Programming Interface,WINDOWS应用程序编程接口)编程的广泛普及和应用,越来越多的应用程序可以通过调用WINDOWS API函数来完成相应的功能。
目前,应用程序在实现具体功能时,在应用层,首先需要加载与功能相关的DLL(Dynamic Link Library,动态链接库),然后根据GetProcAddress函数获取DLL中WINDOWS API函数的起始地址,根据这些起始地址调用对应的WINDOWS API函数,这些WINDOWS API函数通常会最终调用较低级的NativeAPI函数,这些Native API函数最终完成对驱动层的访问。
在实现本发明的过程中,发明人发现现有技术至少存在以下问题:在应用层上,恶意程序(比如利用钩子HOOK技术的程序)可以预先处理GetProcAddress函数,以得到相关的API函数(通常可以包括WINDOWS API函数或者NativeAPI函数)的起始地址,并获取API函数的内容或对API函数的内容进行修改。因此,在应用层上,恶意程序均可以非法监听、拦截或篡改API函数中的内容,从而使得应用程序存在较大的安全隐患。
发明内容
为了解决现有技术中调用API函数的过程中容易被恶意程序预先处理,使得应用程序存在较大的安全隐患的问题,本发明实施例提供了一种Native API函数重构方法及装置。所述技术方案如下:
第一方面,提供了一种Native API函数重构方法,所述方法,包括:
获取加载函数的系统调用号,所述加载函数用于将动态链接库NTDLL.DLL加载至内存,所述NTDLL.DLL中包含Native API函数;
将每个所述加载函数的系统调用号分别拷贝至与所述加载函数对应的各个自定义加载函数的代码体中,所述自定义加载函数位于用于执行应用程序的自定义代码段中,所述自定义加载函数的代码体中的初始代码与所述加载函数中的代码相同;
根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置;
利用位于所述指定位置的NTDLL.DLL中的Native API函数中的代码分别重构所述自定义代码段内与所述Native API函数对应的各个自定义Native API函数中的代码。
在第一方面的第一种可能的实施方式中,在所述根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置之前,还包括:
获取分配函数的系统调用号,所述分配函数用于为所述加载函数分配内存读写执行权限;
将所述分配函数的系统调用号拷贝到所述自定义分配函数的代码体内,所述自定义分配函数位于所述自定义代码段中;
利用包含有所述分配函数的系统调用号的所述自定义分配函数为所述自定义加载函数分配内存读写执行权限。
结合第一方面或者第一方面的第一种可能的实施方式,在第二种可能的实施方式中,所述根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置之前,还包括:
将用于调用内核函数的公用代码段拷贝到所述自定义代码段中;
所述根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置,包括:
根据包含有所述加载函数的系统调用号的所述自定义加载函数以及所述自定义代码段中的所述公用代码段将所述NTDLL.DLL加载至所述内存的指定位置。
结合第一方面、第一方面的第一种可能的实施方式或者第一方面的第二种可能的实施方式,在第三种可能的实施方式中,在所述将用于调用内核函数的公用代码段拷贝到所述自定义代码段中之前,还包括:
遍历内存中NTDLL的导出表,获取指定的测试函数的起始地址;
根据所述测试函数的起始地址调用所述测试函数以获取系统类型;
所述将用于调用内核函数的公用代码段拷贝到所述自定义代码段中,包括:
根据所述系统类型将用于调用与所述系统类型对应的内核函数的公用代码段拷贝至所述自定义代码段中。
结合第一方面、第一方面的第一种可能的实施方式、第一方面的第二种可能的实施方式或者第一方面的第三种可能的实施方式,在第四种可能的实施方式中,所述系统类型为64位WOW64模式、32位或64位,所述根据所述系统类型将用于调用与所述系统类型对应的内核函数的公用代码段拷贝至所述自定义代码段中,包括:
当所述系统类型为64位时,将用于调用64位WOW64模式的内核函数的公用代码段拷贝到所述自定义代码段中的第一指定位置;
或者,
当所述系统类型为32位时,将用于调用32位的内核函数的公用代码段拷贝到所述自定义代码段中的第二指定位置;
或者,
当所述系统类型为64位时,将用于调用64位的内核函数的公用代码段拷贝到所述自定义代码段中的第三指定位置。
第二方面,提供了一种Native API函数重构装置,所述装置,包括:
第一获取模块,用于获取加载函数的系统调用号,所述加载函数用于将动态链接库NTDLL.DLL加载至内存,所述NTDLL.DLL中包含Native API函数;
第一拷贝模块,用于将每个所述加载函数的系统调用号分别拷贝至与所述加载函数对应的各个自定义加载函数的代码体中,所述自定义加载函数位于用于执行应用程序的自定义代码段中,所述自定义加载函数的代码体中的初始代码与所述加载函数中的代码相同;
加载模块,用于根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置;
重构模块,用于利用位于所述指定位置的NTDLL.DLL中的Native API函数中的代码分别重构所述自定义代码段内与所述Native API函数对应的各个自定义Native API函数中的代码。
在第二方面的第一种可能的实施方式中,所述装置,还包括:
第二获取模块,用于获取分配函数的系统调用号,所述分配函数用于为所述加载函数分配内存读写执行权限;
第二拷贝模块,用于将所述分配函数的系统调用号拷贝到所述自定义分配函数的代码体内,所述自定义分配函数位于所述自定义代码段中;
分配模块,用于利用包含有所述分配函数的系统调用号的所述自定义分配函数为所述自定义加载函数分配内存读写执行权限。
结合第二方面或者第二方面的第一种可能的实施方式,在第二种可能的实施方式中,所述装置,还包括:
代码段拷贝模块,用于将用于调用内核函数的公用代码段拷贝到所述自定义代码段中;
所述加载模块,还用于:
根据包含有所述加载函数的系统调用号的所述自定义加载函数以及所述自定义代码段中的所述公用代码段将所述NTDLL.DLL加载至所述内存的指定位置。
结合第二方面、第二方面的第一种可能的实施方式或者第二方面的第二种可能的实施方式,在第三种可能的实施方式中,所述装置,还包括:
遍历模块,遍历内存中NTDLL的导出表,获取指定的测试函数的起始地址;
类型获取模块,用于根据所述测试函数的起始地址调用所述测试函数以获取系统类型;
所述代码段拷贝模块,用于:
根据所述系统类型将用于调用与所述系统类型对应的内核函数的公用代码段拷贝至所述自定义代码段中。
结合第二方面、第二方面的第一种可能的实施方式、第二方面的第二种可能的实施方式或者第二方面的第三种可能的实施方式,在第四种可能的实施方式中,所述系统类型为64位WOW64模式、32位或64位,所述代码段,包括:
第一拷贝单元,用于当所述系统类型为64位WOW64模式时,将用于调用64位WOW64模式的内核函数的公用代码段拷贝到所述自定义代码段中的第一指定位置;
或者,
第二拷贝单元,用于当所述系统类型为32位时,将用于调用32位的内核函数的公用代码段拷贝到所述自定义代码段中的第二指定位置;
或者,
第三拷贝单元,用于当所述系统类型为64位时,将用于调用64位的内核函数的公用代码段拷贝到所述自定义代码段中的第三指定位置。
本发明实施例提供的技术方案带来的有益效果是:
通过根据包含有加载函数的系统调用号的自定义加载函数将NTDLL.DLL加载至内存的指定位置,位于自定义代码段中的每个自定义加载函数中包含有对应的加载函数的代码,利用位于指定位置的NTDLL.DLL中的Native API函数中的代码分别重构自定义代码段内与Native API函数对应的各个自定义Native API函数中的代码;解决了现有技术中调用API函数的过程中容易被恶意程序预先处理,使得应用程序存在较大安全隐患的问题;将Native API函数进行重构,在应用程序运行时可以通过自定义代码段直接调用重构后的自定义Native API函数,实现应用程序的相关功能,达到了可以避免应用程序被恶意程序处理,大大提高了应用程序安全性的效果。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一个实施例提供的Native API函数重构方法的方法流程图;
图2是本发明另一个实施例提供的Native API函数重构方法的方法流程图;
图3是本发明一个实施例提供的Native API函数重构装置的结构示意图;
图4是本发明另一个实施例提供的Native API函数重构装置的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
在实现本发明的过程中,发明人发现现有技术中在调用执行应用程序所需的WINDOWS API函数或者Native API函数之前,WINDOWS API函数的地址或者Native API函数的地址容易被恶意程序优先获取,这样应用程序最终得到的结果很可能被恶意程序监听到或者被恶意程序修改掉,因此对于应用程序来讲,存在很大的安全隐患。而发明人发现应用程序在执行的过程中,调用的WINDOWS API函数最终会调用较低级的Native API函数以完成相应的功能,且应用程序中自己写的代码段(称为自定义代码段)不易被恶意程序监听到,因此发明人将Native API函数放入到自己定义的自定义代码段中,并利用一种特殊的方法重构自定义代码段中的Native API函数,这样在应用程序执行时,直接调用自定义代码段中的Native API函数即可完成相应的功能,从而保证应用程序的内容不会被恶意程序监听或篡改,可以大大提高应用程序的安全性。
也就是说,当应用程序执行时,系统会将相关的动态链接库(包括NTDLL.DLL)自动加载至内存的固定位置,这样恶意程序就可以获取内存中该固定位置处动态链接库中的函数信息。由于应用程序在执行时需要调用相关的WINDOWS API函数来完成相应的功能,而WINDOWS API函数最终是通过Native API函数完成对内核函数的调用。因此如果能够保证WINDOWS API函数正确或者Native API函数正确就可以保证应用程序完成正确的功能。通常,自己定义的代码段是不容易被恶意程序Hook到的,因此可以将所需要的WINDOWS API函数或者Native API函数放入自己定义的代码段中,以完成应用程序的相关功能,且可以避免被Hook到。但在实际应用中WINDOWS API函数的种类较多,不容易被重构,因此发明人通过重构Native API函数来实现应用程序的相关功能。
下面通过具体的实施例对Native API函数重构方法进行详细说明。
请参见图1,其示出了本发明一个实施例中提供的Native API函数重构方法的方法流程图。该Native API函数重构方法可以包括:
101,获取加载函数的系统调用号,加载函数用于将动态链接库NTDLL.DLL加载至内存,该NTDLL.DLL中包含Native API函数;
为了避免恶意程序监听并篡改NTDLL.DLL中的Native API函数,可以通过模拟的加载函数对NTDLL.DLL进行重新加载,以将NTDLL.DLL重新加载至内存中自己指定的位置,这样就可以避免恶意程序监听并篡改NTDLL.DLL中的Native API函数。
而在模拟加载函数时,需要获取加载函数的系统调用号,以便于模拟加载函数。举例来讲,当应用程序被执行后,系统首先加载一个NTDLL.DLL至内存的固定位置,此时则可以获取系统加载的NTDLL.DLL中的加载函数的系统调用号。
102,将每个加载函数的系统调用号分别拷贝至与加载函数对应的各个自定义加载函数的代码体中,自定义加载函数位于用于执行应用程序的自定义代码段中,自定义加载函数的代码体中的初始代码与加载函数中的代码相同;
自定义代码段是应用程序中自己定义的一段代码,该自定义代码段中初始定义了该应用程序所需要的Native API函数,比如可以用于将动态链接库NTDLL.DLL加载至内存的加载函数等。
由于自定义代码段中Native API函数的初始代码都是从系统中直接获取到的,在实际应用中,这些函数的初始代码很可能已经被恶意程序Hook过,因此这些代码可能是不安全的。
此时,需要模拟出加载函数,即自定义加载函数。由于自定义加载函数是模拟的加载函数,在生成自定义加载函数时是不知道该自定义加载函数的系统调用号的,且在利用自定义加载函数需要使用到与自定义加载函数相关的系统调用号,因此需要首先获取加载函数的系统调用号,然后将该系统调用号拷贝至模拟的自定义加载函数中。
103,根据包含有加载函数的系统调用号的自定义加载函数将NTDLL.DLL加载至内存的指定位置;
也就是说,通过模拟的自定义加载函数加载NTDLL.DLL的过程可以包括:获取加载函数的系统调用号,并将加载函数的系统调用号拷贝至自定义代码段中的自定义加载函数中,利用该包含有加载函数的系统调用号的自定义加载函数将NTDLL.DLL加载至内存的指定位置。这样由于自定义代码段中的自定义加载函数无法被恶意程序Hook到,因此,利用模拟出来的自定义加载函数来加载NTDLL.DLL至内存的指定位置后,内存的指定位置处的NTDLL.DLL也无法被恶意程序Hook到。这样,也就保证了NTDLL.DLL中的所有Native API函数都是安全的。
需要说明的是,当应用程序开始执行时,首先系统加载NTDLL.DLL至内存的固定位置后,然后可以获取该固定位置处NTDLL.DLL中的加载函数的系统调用号,将该系统调用号拷贝至自定义代码段中的自定义加载函数中;随后通过模拟的自定义加载函数加载NTDLL.DLL至内存的指定位置。固定位置处的NTDLL.DLL的内容容易被Hook到,而自己加载的指定位置处的NTDLL.DLL则不容易被Hook到。
104,利用位于指定位置的NTDLL.DLL中的Native API函数中的代码分别重构自定义代码段内与Native API函数对应的各个自定义Native API函数中的代码。
由于内存的指定位置处的NTDLL.DLL中的所有Native API函数都是安全的,因此可以根据自定义代码段中设置的自定义Native API函数,从NTDLL.DLL中找到与这些自定义Native API函数对应的Native API函数,并根据这些NativeAPI函数分别重构自定义代码段内与Native API函数对应的各个自定义NativeAPI函数中的代码。
由此可知,自定义代码段中重构后的自定义Native API函数具有对应的原有Native API的功能,且自定义Native API函数中的代码是安全的。由于自定义Native API函数是放置在自定义代码段中的,因此这些自定义Native API函数也不易被恶意程序Hook到。
在本实施例中的第一种可能的实现方式中,在所述根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置之前,还包括:
获取分配函数的系统调用号,所述分配函数用于为所述加载函数分配内存读写执行权限;
将所述分配函数的系统调用号拷贝到所述自定义分配函数的代码体内,所述自定义分配函数位于所述自定义代码段中;
利用包含有所述分配函数的系统调用号的所述自定义分配函数为所述自定义加载函数分配内存读写执行权限。
在本实施例中的第二种可能的实现方式中,所述根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置之前,还包括:
将用于调用内核函数的公用代码段拷贝到所述自定义代码段中;
所述根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置,包括:
根据包含有所述加载函数的系统调用号的所述自定义加载函数以及所述自定义代码段中的所述公用代码段将所述NTDLL.DLL加载至所述内存的指定位置。
在本实施例中的第三种可能的实现方式中,在所述将用于调用内核函数的公用代码段拷贝到所述自定义代码段中之前,还包括:
遍历内存中NTDLL的导出表,获取指定的测试函数的起始地址;
根据所述测试函数的起始地址调用所述测试函数以获取系统类型;
所述将用于调用内核函数的公用代码段拷贝到所述自定义代码段中,包括:
根据所述系统类型将用于调用与所述系统类型对应的内核函数的公用代码段拷贝至所述自定义代码段中。
在本实施例中的第四种可能的实现方式中,所述系统类型为64位WOW64模式、32位或64位,所述根据所述系统类型将用于调用与所述系统类型对应的内核函数的公用代码段拷贝至所述自定义代码段中,包括:
当所述系统类型为64位WOW64模式时,将用于调用64位WOW64模式的内核函数的公用代码段拷贝到所述自定义代码段中的第一指定位置;
或者,
当所述系统类型为32位时,将用于调用32位的内核函数的公用代码段拷贝到所述自定义代码段中的第二指定位置;
或者,
当所述系统类型为64位时,将用于调用64位的内核函数的公用代码段拷贝到所述自定义代码段中的第三指定位置。
综上所述,本发明实施例提供的Native API函数重构方法,通过根据包含有加载函数的系统调用号的自定义加载函数将NTDLL.DLL加载至内存的指定位置,位于自定义代码段中的每个自定义加载函数中包含有对应的加载函数的代码,利用位于指定位置的NTDLL.DLL中的Native API函数中的代码分别重构自定义代码段内与Native API函数对应的各个自定义Native API函数中的代码;解决了现有技术中调用API函数的过程中容易被恶意程序预先处理,以使得应用程序存在较大的安全隐患的问题;将Native API函数进行重构,在应用程序运行时可以通过自定义代码段直接调用重构后的自定义Native API函数,实现应用程序的相关功能,达到了可以避免应用程序被恶意程序处理,大大提高了应用程序安全性的效果。
请参见图2,其示出了本发明另一个实施例中提供的Native API函数重构方法的方法流程图。该Native API函数重构方法可以包括:
201,获取加载函数的系统调用号,加载函数用于将动态链接库NTDLL.DLL加载至内存,NTDLL.DLL中包含Native API函数;
由于本实施例是对Native API函数进行重构,因此需要模拟的加载函数将包含Native API函数的NTDLL.DLL加载至内存,以获取安全的NTDLL.DLL。举例来讲,当应用程序被执行后,系统首先加载一个NTDLL.DLL至内存的固定位置,此时则可以获取系统加载的NTDLL.DLL中的加载函数的系统调用号。
在一个可能的实现方式中,加载函数可以为ZwCreateFile,ZwCreateSection,ZwMapViewOfSection,ZwAllocateVirtualMemory,ZwFreeVirtualMemory等,这些加载函数均是在将NTDLL.DLL加载至内存时需要用到的函数。
202,将每个加载函数的系统调用号分别拷贝至与加载函数对应的各个自定义加载函数的代码体中,自定义加载函数位于用于执行应用程序的自定义代码段中,自定义加载函数的代码体中的初始代码与加载函数中的代码相同;
自定义代码段是应用程序中自己定义的一段代码,该自定义代码段中初始定义了该应用程序所需要的自定义Native API函数,比如可以用于将NTDLL.DLL加载至内存的加载函数等,当然自定义Native API函数还可以包括其他函数,比如可以用于生成文档的函数、可以用于加载其他动态数据链接库的函数或可以用于实现拷贝功能的函数等。
自定义代码段中已经设置了应用程序执行时需要用到的自定义Native API函数,通常,自定义Native API函数的初始代码都是获取的与该自定义Native API函数对应的Native API函数中的代码。举例来讲,当应用程序需要用到NtQueryInformationProcess这一Native API函数时,自定义代码段中会设置一个自定义NtQueryInformationProcess函数,该自定义NtQueryInformationProcess函数中的初始代码即为NtQueryInformationProcess函数的代码。
值得注意的是,由于自定义Native API函数是自己定义的,因此这些函数在初始时是没有系统调用号的。由于需要模拟的加载函数对NTDLL.DLL进行加载,因此需要将每个加载函数的系统调用号分别拷贝至与加载函数对应的各个自定义加载函数的代码体中,以便使用这些自定义加载函数。
203,获取分配函数的系统调用号,分配函数用于为加载函数分配内存读写执行权限;
举例来讲,当应用程序被执行后,系统首先加载一个NTDLL.DLL至内存的固定位置,此时则可以获取系统加载的NTDLL.DLL中的分配函数的系统调用号。
通常来讲,如果加载函数想要对NTDLL.DLL进行加载,这些加载函数首先需要具备内存读写执行权限,为这些加载函数分配内存读写执行权限的函数即为分配函数。而模拟的自定义加载函数在初始时是没有加载权限的,因此,需要为这些自定义加载函数分配内存读写执行权限,即通过分配函数为这些自定义加载函数分配内存读写执行权限。在实际应用中,可以通过分配函数ZwProtectVirtualMemory为自定义加载函数分配内存读写执行权限。
204,将分配函数的系统调用号拷贝到自定义分配函数的代码体内,自定义分配函数位于自定义代码段中;
由于分配函数也可以被恶意程序Hook,因此这里也需要在自定义代码段中模拟一个分配函数,即自定义分配函数。很显然,这个自定义分配函数在初始时也是没有系统调用号的,因此首先需要获取分配函数的系统调用号。
在获取到分配函数的系统调用号之后,将分配函数的系统调用号拷贝至自定义分配函数的代码体内,以模拟出可用于为自定义加载函数分配内存读写权限的自定义分配函数。
205,利用包含有分配函数的系统调用号的自定义分配函数为自定义加载函数分配内存读写执行权限;
当为自定义分配函数拷贝过分配函数的系统调用号之后,即该自定义分函数模拟成功,此时可以通过该自定义分配函数为自定义加载函数分配内存读写执行权限。
206,将用于调用内核函数的公用代码段拷贝到自定义代码段中;
公用代码段是指所有Native API函数调用内核函数时均需要使用的代码段。
在一个可能的实现方式中,可以首先通过遍历peb,获取NTDLL的指针ModuleBase,即用来模拟GetMoudleHandle(“NTDLL”);然后遍历内存中NTDLL.DLL的导出表,对该导出表进行遍历以获取指定的测试函数的起始地址,即用来模拟GetProcAddress;然后根据测试函数的起始地址调用测试函数以获取系统类型。
举例来讲,这里的测试函数可以为ZwTestAlert,在调用测试函数ZwTestAlert获取系统的类型时,由于ZwTestAlert测试函数通常没人使用,也就不会被恶意程序Hook到,且该函数在使用时不需要系统调用号,因此可以直接根据获取到的测试函数ZwTestAlert来获取系统类型。当然,在实际应用中,也可以通过其他类似的函数获取系统类型。
通常来讲,系统类型可以为64位WOW64模式、32位或64位。一般的,Native API函数都会通过一段公用的代码段来调用内核函数,这段代码段可以称之为公用代码段。当系统类型不同时,调用内核函数的公用代码段也会不同,也就是说,64位的系统、32位的系统和64位WOW64模式的系统中调用内核函数的公用代码段是不同的。因此,为了避免这段公用代码段被恶意程序Hook到,可以根据系统类型将用于调用与系统类型对应的内核函数的公用代码段拷贝至自定义代码段中,以便于后续的Native API使用这段公用代码段。
为了使得自定义代码段可以共享在不同的类型的系统中,可以在该自定义代码段中设置三个位置,这三个位置可以分别用于存放在64位系统WOW64模式中需要调用内核函数的公用代码段、在32位系统中需要调用内核函数的公用代码段和在64位系统中需要调用内核函数的公用代码段。举例来讲,当系统类型为64位WOW64模式时,将用于调用64位WOW64模式的内核函数的公用代码段拷贝到自定义代码段中的第一指定位置;当系统类型为32位时,将用于调用32位的内核函数的公用代码段拷贝到自定义代码段中的第二指定位置;当系统类型为64位时,将用于调用64位的内核函数的公用代码段拷贝到自定义代码段中的第三指定位置。这里所讲的第一指定位置、第二指定位置和第三指定位置即为自定义代码段中为不同的公用代码段指定的三个不同的位置空间。
207,根据包含有加载函数的系统调用号的自定义加载函数以及自定义代码段中的公用代码段将NTDLL.DLL加载至内存的指定位置;
通常,加载函数在将NTDLL.DLL加载至内存时,需要使用到调用内核函数的公用代码段,因此需要模拟好的自定义加载函数以及拷贝至自定义代码段中的公用代码段将NTDLL.DLL加载至内存的指定位置。这个指定位置可以是根据实际情况自由设置,这样也就避免了恶意程序Hook到这个内存中的NTDLL.DLL。
由此可知,通过模拟的安全的自定义加载函数以及安全的公用代码段实现了将NTDLL.DLL加载至内存的指定位置,这样NTDLL.DLL中的Native API函数就是安全的了。
208,利用位于内存的指定位置的NTDLL.DLL中的Native API函数中的代码分别重构自定义代码段内与Native API函数对应的各个自定义Native API函数中的代码。
由于应用程序中所需要的Native API函数可能并不是NTDLL.DLL中所有的Native API函数,因此,只需要将应用程序需要用到的Native API函数重构即可。
举例来讲,当应用程序需要n个Native API函数时,首先在自定义代码段中自定义n个自定义Native API函数,通常来讲,这些自定义Native API函数的初始代码都是通过系统调用得到的Native API函数的代码,这些代码可能是不安全的,因此需要对这些自定义Native API函数中的代码进行重构。此时由于位于内存的指定位置的NTDLL.DLL中的Native API函数中的代码都是安全的,因此可以对应将与这n个自定义Native API函数对应的Native API函数中的代码拷贝出来,然后将每个Native API函数中的代码分别覆盖对应的自定义Native API函数中的代码,进而完成对该Native API函数进行的重构。
需要说明的是,当应用程序开始执行时,首先系统加载NTDLL.DLL至内存的固定位置后,然后可以获取该固定位置处NTDLL.DLL中的加载函数的系统调用号、分配函数的系统调用号以及其他需要的Native API函数的系统调用号,将每一个Native API函数的系统调用号分别拷贝至自定义代码段中的对应的自定义加载函数中;随后通过模拟的自定义分配函数为自定义加载函数分配内存读写访问权限;最后通过模拟的自定义加载函数加载NTDLL.DLL至内存的指定位置。固定位置处的NTDLL.DLL的内容容易被Hook到,而自己加载的指定位置处的NTDLL.DLL则不容易被Hook到。
还需要说明的是,上述实施例中仅示意性描述了加载NTDLL.DLL时用到的几个Native API函数,当然,在实际应用中,应用程序可能还需要其他的NativeAPI加载其他需要的动态链接库,因此还可能需要其他的Native API函数,比如LdrLoadDll函数、LdrUnLoadDll函数等。
综上所述,本发明实施例提供的Native API函数重构方法,通过根据包含有加载函数的系统调用号的自定义加载函数将NTDLL.DLL加载至内存的指定位置,位于自定义代码段中的每个自定义加载函数中包含有对应的加载函数的代码,利用位于指定位置的NTDLL.DLL中的Native API函数中的代码分别重构自定义代码段内与Native API函数对应的各个自定义Native API函数中的代码;解决了现有技术中调用API函数的过程中容易被恶意程序预先处理,以使得应用程序存在较大的安全隐患的问题;将Native API函数进行重构,在应用程序运行时可以通过自定义代码段直接调用重构后的自定义Native API函数,实现应用程序的相关功能,达到了可以避免应用程序被恶意程序处理,大大提高了应用程序安全性的效果。
请参见图3所示,其示出了本发明一个实施例中提供的Native API函数重构装置。该Native API函数重构装置可以包括但不限于:第一获取模块301、第一拷贝模块302、加载模块303和重构模块304。
第一获取模块301,可以用于获取加载函数的系统调用号,加载函数用于将动态链接库NTDLL.DLL加载至内存,NTDLL.DLL中包含Native API函数;
第一拷贝模块302,可以用于将每个加载函数的系统调用号分别拷贝至与加载函数对应的各个自定义加载函数的代码体中,自定义加载函数位于用于执行应用程序的自定义代码段中,自定义加载函数的代码体中的初始代码与加载函数中的代码相同;
加载模块303,可以用于根据包含有加载函数的系统调用号的自定义加载函数将NTDLL.DLL加载至内存的指定位置;
重构模块304,可以用于利用位于指定位置的NTDLL.DLL中的Native API函数中的代码分别重构自定义代码段内与Native API函数对应的各个自定义Native API函数中的代码。
综上所述,本发明实施例提供的Native API函数重构装置,通过根据包含有加载函数的系统调用号的自定义加载函数将NTDLL.DLL加载至内存的指定位置,位于自定义代码段中的每个自定义加载函数中包含有对应的加载函数的代码,利用位于指定位置的NTDLL.DLL中的Native API函数中的代码分别重构自定义代码段内与Native API函数对应的各个自定义Native API函数中的代码;解决了现有技术中调用API函数的过程中容易被恶意程序预先处理,以使得应用程序存在较大的安全隐患的问题;将Native API函数进行重构,在应用程序运行时可以通过自定义代码段直接调用重构后的自定义Native API函数,实现应用程序的相关功能,达到了可以避免应用程序被恶意程序处理,大大提高了应用程序安全性的效果。
请参见图4所示,其示出了本发明另一个实施例中提供的Native API函数重构装置。该Native API函数重构装置可以包括但不限于:第一获取模块401、第一拷贝模块402、加载模块403和重构模块404。
第一获取模块401,可以用于获取加载函数的系统调用号,加载函数用于将动态链接库NTDLL.DLL加载至内存,NTDLL.DLL中包含Native API函数;
第一拷贝模块402,可以用于将每个加载函数的系统调用号分别拷贝至与加载函数对应的各个自定义加载函数的代码体中,自定义加载函数位于用于执行应用程序的自定义代码段中,自定义加载函数的代码体中的初始代码与加载函数中的代码相同;
加载模块403,可以用于根据包含有加载函数的系统调用号的自定义加载函数将NTDLL.DLL加载至内存的指定位置;
重构模块404,可以用于利用位于指定位置的NTDLL.DLL中的Native API函数中的代码分别重构自定义代码段内与Native API函数对应的各个自定义Native API函数中的代码。
在本实施例的第一种可能的实现方式中,该Native API函数重构装置还可以包括:第二获取模块405、第二拷贝模块406和分配模块407。
第二获取模块405,可以用于获取分配函数的系统调用号,分配函数用于为加载函数分配内存读写执行权限;
第二拷贝模块406,可以用于将分配函数的系统调用号拷贝到自定义分配函数的代码体内,自定义分配函数位于自定义代码段中;
分配模块407,可以用于利用包含有分配函数的系统调用号的自定义分配函数为加载函数分配内存读写执行权限。
在本实施例的第二种可能的实现方式中,该Native API函数重构装置还可以包括:代码段拷贝模块408。
代码段拷贝模块408,可以用于将用于调用内核函数的公用代码段拷贝到自定义代码段中;
加载模块403,还可以用于:
根据包含有加载函数的系统调用号的自定义加载函数以及自定义代码段中的公用代码段将NTDLL.DLL加载至内存的指定位置。
在本实施例的第三种可能的实现方式中,该Native API函数重构装置还可以包括:遍历模块409和类型获取模块410。
遍历模块409,可以遍历NTDLL.DLL的导出表,获取指定的测试函数的起始地址;
类型获取模块410,可以用于根据测试函数的起始地址调用测试函数以获取系统类型;
代码段拷贝模块408,还可以用于根据系统类型将用于调用与系统类型对应的内核函数的公用代码段拷贝至自定义代码段中。
在本实施例的第四种可能的实现方式中,系统类型为64位WOW64模式、32位或64位,代码段拷贝模块408可以包括:第一拷贝单元408a、第二拷贝单元408b和第三拷贝单元408c。
第一拷贝单元408a,可以用于当系统类型为64位WOW64模式时,将用于调用64位WOW64模式的内核函数的公用代码段拷贝到自定义代码段中的第一指定位置;
第二拷贝单元408b,可以用于当系统类型为32位时,将用于调用32位的内核函数的公用代码段拷贝到自定义代码段中的第二指定位置;
第三拷贝单元408c,可以用于当系统类型为64位时,将用于调用64位的内核函数的公用代码段拷贝到自定义代码段中的第三指定位置。
综上所述,本发明实施例提供的Native API函数重构装置,通过根据包含有加载函数的系统调用号的自定义加载函数将NTDLL.DLL加载至内存的指定位置,位于自定义代码段中的每个自定义加载函数中包含有对应的加载函数的代码,利用位于指定位置的NTDLL.DLL中的Native API函数中的代码分别重构自定义代码段内与Native API函数对应的各个自定义Native API函数中的代码;解决了现有技术中调用API函数的过程中容易被恶意程序预先处理,以使得应用程序存在较大的安全隐患的问题;将Native API函数进行重构,在应用程序运行时可以通过自定义代码段直接调用重构后的自定义Native API函数,实现应用程序的相关功能,达到了可以避免应用程序被恶意程序处理,大大提高了应用程序安全性的效果。
需要说明的是:上述实施例提供的Native API函数重构装置在Native API函数重构时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的Native API函数重构装置与Native API函数重构方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种Native API函数重构方法,其特征在于,所述方法,包括:
获取加载函数的系统调用号,所述加载函数用于将动态链接库NTDLL.DLL加载至内存,所述NTDLL.DLL中包含Native API函数;
将每个所述加载函数的系统调用号分别拷贝至与所述加载函数对应的各个自定义加载函数的代码体中,所述自定义加载函数位于用于执行应用程序的自定义代码段中,所述自定义加载函数的代码体中的初始代码与所述加载函数中的代码相同;
根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置;
利用位于所述指定位置的NTDLL.DLL中的Native API函数中的代码分别重构所述自定义代码段内与所述Native API函数对应的各个自定义Native API函数中的代码。
2.根据权利要求1所述的方法,其特征在于,在所述根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置之前,还包括:
获取分配函数的系统调用号,所述分配函数用于为所述加载函数分配内存读写执行权限;
将所述分配函数的系统调用号拷贝到自定义分配函数的代码体内,所述自定义分配函数位于所述自定义代码段中;
利用包含有所述分配函数的系统调用号的所述自定义分配函数为所述自定义加载函数分配内存读写执行权限。
3.根据权利要求2所述的方法,其特征在于,所述根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置之前,还包括:
将用于调用内核函数的公用代码段拷贝到所述自定义代码段中;
所述根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置,包括:
根据包含有所述加载函数的系统调用号的所述自定义加载函数以及所述自定义代码段中的所述公用代码段将所述NTDLL.DLL加载至所述内存的指定位置。
4.根据权利要求3所述的方法,其特征在于,在所述将用于调用内核函数的公用代码段拷贝到所述自定义代码段中之前,还包括:
遍历内存中NTDLL的导出表,获取指定的测试函数的起始地址;
根据所述测试函数的起始地址调用所述测试函数以获取系统类型;
所述将用于调用内核函数的公用代码段拷贝到所述自定义代码段中,包括:
根据所述系统类型将用于调用与所述系统类型对应的内核函数的公用代码段拷贝至所述自定义代码段中。
5.根据权利要求4所述的方法,其特征在于,所述系统类型为64位WOW64模式、32位或64位,所述根据所述系统类型将用于调用与所述系统类型对应的内核函数的公用代码段拷贝至所述自定义代码段中,包括:
当所述系统类型为64位WOW64模式时,将用于调用64位WOW64模式的内核函数的公用代码段拷贝到所述自定义代码段中的第一指定位置;
或者,
当所述系统类型为32位时,将用于调用32位的内核函数的公用代码段拷贝到所述自定义代码段中的第二指定位置;
或者,
当所述系统类型为64位时,将用于调用64位的内核函数的公用代码段拷贝到所述自定义代码段中的第三指定位置。
6.一种Native API函数重构装置,其特征在于,所述装置,包括:
第一获取模块,用于获取加载函数的系统调用号,所述加载函数用于将动态链接库NTDLL.DLL加载至内存,所述NTDLL.DLL中包含Native API函数;
第一拷贝模块,用于将每个所述加载函数的系统调用号分别拷贝至与所述加载函数对应的各个自定义加载函数的代码体中,所述自定义加载函数位于用于执行应用程序的自定义代码段中,所述自定义加载函数的代码体中的初始代码与所述加载函数中的代码相同;
加载模块,用于根据包含有所述加载函数的系统调用号的所述自定义加载函数将所述NTDLL.DLL加载至所述内存的指定位置;
重构模块,用于利用位于所述指定位置的NTDLL.DLL中的Native API函数中的代码分别重构所述自定义代码段内与所述Native API函数对应的各个自定义Native API函数中的代码。
7.根据权利要求6所述的装置,其特征在于,所述装置,还包括:
第二获取模块,用于获取分配函数的系统调用号,所述分配函数用于为所述加载函数分配内存读写执行权限;
第二拷贝模块,用于将所述分配函数的系统调用号拷贝到自定义分配函数的代码体内,所述自定义分配函数位于所述自定义代码段中;
分配模块,用于利用包含有所述分配函数的系统调用号的所述自定义分配函数为所述自定义加载函数分配内存读写执行权限。
8.根据权利要求7所述的装置,其特征在于,所述装置,还包括:
代码段拷贝模块,用于将用于调用内核函数的公用代码段拷贝到所述自定义代码段中;
所述加载模块,还用于:
根据包含有所述加载函数的系统调用号的所述自定义加载函数以及所述自定义代码段中的所述公用代码段将所述NTDLL.DLL加载至所述内存的指定位置。
9.根据权利要求8所述的装置,其特征在于,所述装置,还包括:
遍历模块,遍历内存中NTDLL的导出表,获取指定的测试函数的起始地址;
类型获取模块,用于根据所述测试函数的起始地址调用所述测试函数以获取系统类型;
所述代码段拷贝模块,用于:
根据所述系统类型将用于调用与所述系统类型对应的内核函数的公用代码段拷贝至所述自定义代码段中。
10.根据权利要求9所述的装置,其特征在于,所述系统类型为64位WOW64模式、32位或64位,所述代码段拷贝模块,包括:
第一拷贝单元,用于当所述系统类型为64位WOW64模式时,将用于调用64位WOW64模式的内核函数的公用代码段拷贝到所述自定义代码段中的第一指定位置;
或者,
第二拷贝单元,用于当所述系统类型为32位时,将用于调用32位的内核函数的公用代码段拷贝到所述自定义代码段中的第二指定位置;
或者,
第三拷贝单元,用于当所述系统类型为64位时,将用于调用64位的内核函数的公用代码段拷贝到所述自定义代码段中的第三指定位置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310455970.6A CN103530552B (zh) | 2013-09-29 | 2013-09-29 | Native API函数重构方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310455970.6A CN103530552B (zh) | 2013-09-29 | 2013-09-29 | Native API函数重构方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103530552A CN103530552A (zh) | 2014-01-22 |
CN103530552B true CN103530552B (zh) | 2016-08-17 |
Family
ID=49932556
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310455970.6A Active CN103530552B (zh) | 2013-09-29 | 2013-09-29 | Native API函数重构方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103530552B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104392169B (zh) * | 2014-12-15 | 2018-05-01 | 福建天晴数码有限公司 | 一种Native API函数重构方法和装置 |
CN105303122B (zh) * | 2015-10-13 | 2018-02-09 | 北京大学 | 基于重构技术实现敏感数据云端锁定的方法 |
CN108228434A (zh) * | 2016-12-21 | 2018-06-29 | 中国科学院信息工程研究所 | 一种内核源码级的系统调用跟踪方法 |
CN108958824A (zh) * | 2017-05-18 | 2018-12-07 | 龙芯中科技术有限公司 | 应用程序的启动方法、装置、电子设备及存储介质 |
CN109634571A (zh) * | 2018-12-17 | 2019-04-16 | 武汉烽火信息集成技术有限公司 | 一种api编排方法、存储介质、电子设备及系统 |
CN111427550A (zh) * | 2019-01-10 | 2020-07-17 | 武汉瓯越网视有限公司 | 一种对象创建方法、终端装置及存储介质 |
CN111506437A (zh) * | 2020-03-31 | 2020-08-07 | 北京安码科技有限公司 | 基于windows原始调用接口的靶场应用程序调用方法、系统、电子设备及存储介质 |
CN113986889B (zh) * | 2021-12-28 | 2022-04-05 | 天津南大通用数据技术股份有限公司 | 一种实现数据库函数智能扩展的方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102999354A (zh) * | 2012-11-15 | 2013-03-27 | 北京奇虎科技有限公司 | 文件加载方法和装置 |
CN103019765A (zh) * | 2012-11-15 | 2013-04-03 | 北京奇虎科技有限公司 | 一种文件重定向方法、装置和计算机系统 |
-
2013
- 2013-09-29 CN CN201310455970.6A patent/CN103530552B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102999354A (zh) * | 2012-11-15 | 2013-03-27 | 北京奇虎科技有限公司 | 文件加载方法和装置 |
CN103019765A (zh) * | 2012-11-15 | 2013-04-03 | 北京奇虎科技有限公司 | 一种文件重定向方法、装置和计算机系统 |
Also Published As
Publication number | Publication date |
---|---|
CN103530552A (zh) | 2014-01-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103530552B (zh) | Native API函数重构方法及装置 | |
EP2959392B1 (en) | Memory introspection engine for integrity protection of virtual machines | |
US9547346B2 (en) | Context agent injection using virtual machine introspection | |
JP6761476B2 (ja) | 仮想マシンを監査するためのシステムおよび方法 | |
CN107807839B (zh) | 一种修改虚拟机内存数据的方法、装置及电子设备 | |
US8484641B2 (en) | Implementing a versioned virtualized application runtime environment | |
US9766958B2 (en) | Runtime emulating static thread local storage of portable executable software code | |
WO2018099292A1 (zh) | 一种进程管理方法及装置 | |
US20180218148A1 (en) | System call policies for containers | |
JP2008276763A (ja) | メモリエラーの検出法 | |
CN104731622B (zh) | 一种应用程序的加载方法、装置和移动终端 | |
CN104008060A (zh) | 插件与宿主兼容性的检测方法及检测服务器 | |
CN106056000B (zh) | 基于系统权限的移动设备存储分区配置方法及装置 | |
US20110264841A1 (en) | Sharing of class data among virtual machine applications running on guests in virtualized environment using memory management facility | |
WO2019237713A1 (zh) | 一种根据pci设备的类型分配资源的方法、装置及介质 | |
KR102254159B1 (ko) | 운영체제 커널 메모리의 실시간 오류 검출 방법 | |
US20210311740A1 (en) | Circular shadow stack in audit mode | |
US20190392136A1 (en) | Sandboxing of software plug-ins | |
CN114756296A (zh) | 可读写挂载启动方法、装置、存储介质及电子设备 | |
EP3191943B1 (en) | Memory privilege of a computing system | |
CN106708619B (zh) | 资源管理方法及装置 | |
CA2935248A1 (en) | User-mode component injection and atomic hooking | |
CN111428240A (zh) | 一种用于检测软件的内存违规访问的方法及装置 | |
WO2017142525A1 (en) | Allocating a zone of a shared memory region | |
US10796008B2 (en) | Executing privileged code in a process |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C56 | Change in the name or address of the patentee | ||
CP02 | Change in the address of a patent holder |
Address after: 511446 Guangzhou City, Guangdong Province, Panyu District, South Village, Huambo Business District Wanda Plaza, block B1, floor 28 Patentee after: Guangzhou Huaduo Network Technology Co., Ltd. Address before: 510655, Guangzhou, Whampoa Avenue, No. 2, creative industrial park, building 3-08, Patentee before: Guangzhou Huaduo Network Technology Co., Ltd. |