CN103632099A - 未导出的Native API函数获取方法及装置 - Google Patents

未导出的Native API函数获取方法及装置 Download PDF

Info

Publication number
CN103632099A
CN103632099A CN201310455256.7A CN201310455256A CN103632099A CN 103632099 A CN103632099 A CN 103632099A CN 201310455256 A CN201310455256 A CN 201310455256A CN 103632099 A CN103632099 A CN 103632099A
Authority
CN
China
Prior art keywords
api function
native api
function
address
statement
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
CN201310455256.7A
Other languages
English (en)
Other versions
CN103632099B (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.)
Guangzhou Huaduo Network Technology Co Ltd
Original Assignee
Guangzhou Huaduo Network Technology 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 Guangzhou Huaduo Network Technology Co Ltd filed Critical Guangzhou Huaduo Network Technology Co Ltd
Priority to CN201310455256.7A priority Critical patent/CN103632099B/zh
Publication of CN103632099A publication Critical patent/CN103632099A/zh
Application granted granted Critical
Publication of CN103632099B publication Critical patent/CN103632099B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种未导出的Native API函数获取方法,属于计算机技术领域。所述方法包括:获取目标Native API函数所在的模块代码段的范围;获取在调用指定函数时生成的当前栈;根据当前栈获取地址位于模块代码段的范围内的指针数据;在根据指针数据的地址检测存在调用目标Native API函数的语句时,获取目标Native API函数。本发明通过目标Native API函数所在的模块代码段的范围以及在调用指定函数时生成的当前栈,获取符合预定条件的指针数据,根据指针数据获取目标Native API函数;达到了可以很大程度上提高搜索效率和搜索命中率的效果。

Description

未导出的Native API函数获取方法及装置
技术领域
本发明涉及计算机技术领域,特别涉及一种未导出的Native API函数获取方法及装置。
背景技术
随着WINDOWS API(WINDOWS Application Programming Interface,WINDOWS应用程序编程接口)编程的广泛普及和应用,越来越多的应用程序可以通过调用WINDOWS API函数来完成相应的功能。
目前,应用程序在实现具体功能时,首先需要加载与功能相关的DLL(Dynamic Link Library,动态链接库),然后根据GetProcAddress函数获取DLL中WINDOWS API函数的起始地址,根据这些起始地址调用对应的WINDOWSAPI函数,这些WINDOWS API函数通常会最终调用较低级的Native API函数,这些Native API函数最终完成对驱动层的访问。而恶意程序(比如利用钩子Hook技术的程序)可以预先Hook到GetProcAddress函数,以得到相关的API函数(通常可以包括WINDOWS API函数或者Native API函数)的起始地址,并获取API函数的内容或对API函数的内容进行修改。
由于恶意程序无法Hook到未导出的Native API函数的起始地址,因此可以获取这些未导出的Native API函数,然后直接调用这些未导出的Native API函数以完成相应的功能。目前,存在一种获取未导出的Native API函数的方法,可以包括:首先手工提取指定版本系统文件中某一部分代码作为特征码,该部分代码需要通过人工分析出可能是和所要查找的未导出的Native API函数是相关的;然后根据该特征码在内存的相应模块做暴力搜索,即在内存的相应模块查找是否存在该特征码,如果查找到该特征码,分析这段特征码以获取未导出Native API函数。
在实现本发明的过程中,发明人发现现有技术至少存在以下问题:每次根据特征码在内存的相应模块做暴力搜索时,必须先人工分析系统版本中一个文件以提取一个特征码,而系统版本非常多,对所有的系统版本均进行人工分析出所有的特征码,效率很低,且人工分析出的特征码不一定能够找到想要的未导出Native API函数,因此通过人工分析出的特征码搜索到想要的未导出NativeAPI函数的命中率非常低。且由于特征码是人工分析并提取的一段较长的代码,因此在利用特征码进行暴力搜索时,搜索效率非常低。
发明内容
为了解决现有技术中利用特征码进行暴力搜索时,搜索效率和搜索命中率非常低的问题,本发明实施例提供了一种未导出的Native API函数获取方法及装置。所述技术方案如下:
第一方面,提供了一种未导出的Native API函数获取方法,所述方法,包括:
获取目标Native API函数所在的模块代码段的范围,所述目标Native API函数为指定的未导出的Native API函数;
获取在调用指定函数时生成的当前栈,所述指定函数为在被调用时调用所述目标Native API函数的Windows API函数;
根据所述当前栈,获取地址位于所述模块代码段的范围内的指针数据;
根据所述指针数据的地址,检测所述模块代码段中是否存在用于调用所述目标Native API函数的语句;
若检测结果为存在用于调用所述目标Native API函数的语句,则根据所述用于调用所述目标Native API函数的语句获取所述目标Native API函数。
在第一方面的第一种可能的实施方式中,所述获取在调用指定函数时生成的当前栈,包括:
执行调用所述指定函数的功能;
获取在执行调用所述指定函数的功能时生成的当前栈。
结合第一方面或者第一方面的第一种可能的实施方式,在第二种可能的实施方式中,所述根据所述当前栈获取地址位于所述模块代码段的范围内的指针数据,包括:
利用汇编语言将所述当前栈的地址由第一地址修改为第二地址;
利用汇编语言将具有所述第二地址的所述当前栈中的内容复制到预先在内存中分配的栈内存中;
遍历所述栈内存,获取地址在所述模块代码段的范围内的指针数据。
结合第一方面、第一方面的第一种可能的实施方式或者第一方面的第二种可能的实施方式,在第三种可能的实施方式中,在所述利用汇编语言将具有所述第二地址的所述当前栈中的内容复制到预先在内存中分配的栈内存中之后,还包括:
利用汇编语言将具有所述第二地址的所述当前栈的地址由所述第二地址修改回所述第一地址。
结合第一方面、第一方面的第一种可能的实施方式、第一方面的第二种可能的实施方式或者第一方面的第三种可能的实施方式,在第四种可能的实施方式中,所述根据所述指针数据的地址,检测所述模块代码段中是否存在调用所述目标Native API函数的语句,包括:
根据所述指针数据的地址减去预定字节的长度,得到第一起始地址;
检测以所述第一起始地址为起始地址的语句是否为指定语句,所述指定语句为调用函数的语句;
若检测结果为以所述第一起始地址为起始地址的语句为指定语句,则检测所述指定语句中的指针所指的内容是否包含Native API函数的特征;
若检测结果为所述指定语句中的指针所指的内容包含Native API函数的特征,则检测所述Native API函数是否为所述目标Native API函数;
若检测结果为所述Native API函数为所述目标Native API函数,则判定所述指定语句为存在的用于调用所述目标Native API函数的语句。
结合第一方面、第一方面的第一种可能的实施方式、第一方面的第二种可能的实施方式、第一方面的第三种可能的实施方式或者第一方面的第四种可能的实施方式,在第五种可能的实施方式中,所述根据所述调用所述目标NativeAPI函数的语句获取所述目标Native API函数,包括:
根据所述指定语句中的所述指针所指的内容获取所述目标Native API函数。
结合第一方面、第一方面的第一种可能的实施方式、第一方面的第二种可能的实施方式、第一方面的第三种可能的实施方式、第一方面的第四种可能的实施方式或者第一方面的第五种可能的实施方式,在第六种可能的实施方式中,在所述检测所述Native API函数是否为所述目标Native API函数之前,还包括:
将用于记录检测到Native API函数的次数的记录值加1;
所述检测所述Native API函数是否为所述目标Native API函数,包括:
检测所述记录值是否为预定记录阈值;
若检测结果为所述记录值为预定记录阈值,则判定检测结果为所述NativeAPI函数为所述目标Native API函数。
第二方面,提供了一种未导出的Native API函数获取装置,所述装置,包括:
范围获取模块,用于获取目标Native API函数所在的模块代码段的范围,所述目标Native API函数为指定的未导出的Native API函数;
当前栈获取模块,用于获取在调用指定函数时生成的当前栈,所述指定函数为在被调用时调用所述目标Native API函数的Windows API函数;
指针数据获取模块,用于根据所述当前栈获取模块获取到的所述当前栈,获取地址位于所述范围获取模块获取到的所述模块代码段的范围内的指针数据;
检测模块,用于根据所述指针数据获取模块获取到的所述指针数据的地址,检测所述模块代码段中是否存在用于调用所述目标Native API函数的语句;
目标函数获取模块,用于在所述检测模块的检测结果为存在用于调用所述目标Native API函数的语句时,根据所述用于调用所述目标Native API函数的语句获取所述目标Native API函数。
在第二方面的第一种可能的实施方式中,所述当前栈获取模块,包括:
执行单元,用于执行调用所述指定函数的功能;
当前栈获取单元,用于获取在执行调用所述指定函数的功能时生成的当前栈。
结合第二方面或者第二方面的第一种可能的实施方式,在第二种可能的实施方式中,所述指针数据获取模块,包括:
第一修改单元,用于利用汇编语言将所述当前栈的地址由第一地址修改为第二地址;
复制单元,用于利用汇编语言将具有所述第二地址的所述当前栈中的内容复制到预先在内存中分配的栈内存中;
指针数据获取单元,用于遍历所述栈内存,获取地址在所述模块代码段的范围内的指针数据。
结合第二方面、第二方面的第一种可能的实施方式或者第二方面的第二种可能的实施方式,在第三种可能的实施方式中,所述指针数据获取模块,还包括:
第二修改单元,用于利用汇编语言将具有所述第二地址的所述当前栈的地址由所述第二地址修改回所述第一地址。
结合第二方面、第二方面的第一种可能的实施方式、第二方面的第二种可能的实施方式或者第二方面的第三种可能的实施方式,在第四种可能的实施方式中,所述检测模块,包括:
减去单元,用于根据所述指针数据的地址减去预定字节的长度,得到第一起始地址;
第一检测单元,用于检测以所述第一起始地址为起始地址的语句是否为指定语句,所述指定语句为调用函数的语句;
第二检测单元,用于在所述第一检测单元的检测结果为以所述第一起始地址为起始地址的语句为指定语句时,检测所述指定语句中的指针所指的内容是否包含Native API函数的特征;
第三检测单元,用于在所述第二检测单元的检测结果为所述指定语句中的指针所指的内容包含Native API函数的特征时,检测所述Native API函数是否为所述目标Native API函数;
判定单元,用于在所述第三检测单元的检测结果为所述Native API函数为所述目标Native API函数时,判定所述指定语句为存在的用于调用所述目标Native API函数的语句。
结合第二方面、第二方面的第一种可能的实施方式、第二方面的第二种可能的实施方式、第二方面的第三种可能的实施方式或者第二方面的第四种可能的实施方式,在第五种可能的实施方式中,所述目标函数获取模块,还用于:
根据所述指定语句中的所述指针所指的内容获取所述目标Native API函数。
结合第二方面、第二方面的第一种可能的实施方式、第二方面的第二种可能的实施方式、第二方面的第三种可能的实施方式、第二方面的第四种可能的实施方式或者第二方面的第五种可能的实施方式,在第六种可能的实施方式中,所述检测模块,还包括:
增加单元,用于将用于记录检测到Native API函数的次数的记录值加1;
所述第三检测单元,包括:
检测子单元,用于检测所述记录值是否为预定记录阈值;
判定子单元,用于在所述检测子单元的检测结果为所述记录值为预定记录阈值时,判定检测结果为所述Native API函数为所述目标Native API函数。
本发明实施例提供的技术方案带来的有益效果是:
通过目标Native API函数所在的模块代码段的范围以及在调用指定函数时生成的当前栈,获取符合预定条件的指针数据,根据所述指针数据的地址检测模块代码段是否存在调用所述目标Native API函数的语句;若检测结果为模块代码段存在调用所述目标Native API函数的语句,则根据所述调用所述目标Native 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函数即可完成相应的功能,从而保证应用程序的内容不会被恶意程序监听或篡改,可以大大提高应用程序的安全性。
也就是说,当应用程序执行时,系统会将相关的动态链接库自动加载至内存的固定位置,这样恶意程序就可以获取内存中该固定位置处动态链接库中的函数信息。由于应用程序在执行时需要调用相关的WINDOWS API函数来完成相应的功能,而WINDOWS API函数最终是通过调用未导出的Native API函数完成对内核函数的调用。因此如果能够直接调用未导出的Native API函数就可以保证应用程序完成正确的功能。
下面通过具体的实施例对未导出的Native API函数获取方法进行详细说明。
请参见图1所示,其示出了本发明一个实施例中提供的未导出的Native API函数获取方法的方法流程图。该未导出的Native API函数获取方法可以包括:
101,获取目标Native API函数所在的模块代码段的范围,该目标Native API函数为指定的未导出的Native API函数;
在实际应用中,当应用程序启动执行后,系统首先会将相关的动态链接库加载至内存,这些动态链接库中的内容在内存中的存在形式则为模块代码段。
模块代码段的范围通常是从该模块代码段的起始地址到该模块代码段的结束地址。
102,获取在调用指定函数时生成的当前栈,该指定函数为在被调用时调用目标Native API函数的Windows API函数;
通过应用程序启动执行后,可以执行相关的功能,每一个功能通常都会调用多个Windows API函数,因此如果想要最终得到指定的目标Native API函数,则首先需要启动可以调用指定的Windows API函数的功能,当在执行该功能时,指定的Windows API函数则会调用指定的目标Native API函数。
对应的,当执行该功能时会产生一个当前栈,该当前栈中的内容通常会包含与该目标Native API函数相关的数据。
103,根据该当前栈获取地址位于该模块代码段的范围内的指针数据;
当前栈中的数据通常可以包含很多种类,比如可以为参数、指针或者变量等。
由于当前栈中的所有数据都有对应的一个地址,因此可以从该当前栈中获取地址位于上述模块代码段的范围内的指针数据。
104,根据该指针数据的地址检测模块代码段中是否存在用于调用目标Native API函数的语句;
在实际应用中,在用于调用某个函数的语句的后面,通过会设置一个指针数据,该指针数据通常用于指向调用该函数的语句后面的返回地址,以便于在执行完该函数的代码之后,可以根据该指针数据返回到该用于调用函数的语句后面的地址,以继续执行该语句后面的代码。
105,若检测结果为模块代码段中存在用于调用目标Native API函数的语句,则根据用于调用目标Native API函数的语句获取目标Native API函数。
综上所述,本发明实施例提供的未导出的Native API函数获取方法,通过目标Native API函数所在的模块代码段的范围以及在调用指定函数时生成的当前栈,获取符合预定条件的指针数据,根据所述指针数据的地址检测是否存在调用所述目标Native API函数的语句;若检测结果为存在调用所述目标NativeAPI函数的语句,则根据所述调用所述目标Native API函数的语句获取所述目标Native API函数;解决现有技术中利用特征码进行暴力搜索时,搜索效率和搜索命中率非常低的问题;在应用程序开始执行后,自动根据当前栈里的内容搜索目标Native API函数,在搜索的过程中不受系统版本的限制,也不受人工的限制,达到了可以很大程度上提高搜索效率和搜索命中率的效果。
请参见图2所示,其示出了本发明另一个实施例中提供的未导出的NativeAPI函数获取方法的方法流程图。该未导出的Native API函数获取方法可以包括:
201,获取目标Native API函数所在的模块代码段的范围,目标Native API函数为指定的未导出的Native API函数;
在实际应用中,当应用程序启动执行后,系统首先会将相关的动态链接库加载至内存,这些动态链接库中的内容在内存中的存在形式则为模块代码段。
模块代码段的范围通常是从该模块代码段的起始地址到该模块代码段的结束地址。
202,执行调用指定函数的功能;
通过应用程序启动执行后,可以执行相关的功能,每一个功能通常都会调用一个或多个Windows API函数,因此如果想要最终得到目标Native API函数,则首先需要启动可以调用指定的Windows API函数的功能,当在执行该功能时,指定的Windows API函数则会调用目标Native API函数。
203,获取在执行调用指定函数的功能时生成的当前栈;
对应的,当执行该功能时会产生一个当前栈,当前栈中的内容通常会包含与该目标Native API函数相关的数据。所以,为了获取与该目标Native API函数相关的数据,需要首先获取该当前栈。
204,利用汇编语言将当前栈的地址由第一地址修改为第二地址;
由于从当前栈中获取想要得到的数据时需要一段时间,而这段时间内,还有其他进程需要用到该当前栈,也就是说该当前栈中的数据在这段时间内可能会随时改变,为了避免当前栈中的数据被发生变化,首先暂时将当前栈的地址进行修改,这样其余的进程暂时无法更新该当前栈中的内容。
在实际应用中,为了避免对当前栈中数据的破坏,需要通过内联汇编的操作来完成对该当前栈地址的修改。也就是说,利用汇编语言将当前栈的地址由第一地址修改为第二地址。
205,利用汇编语言将具有第二地址的当前栈中的内容复制到预先在内存中分配的栈内存中;
在实际应用中,在根据当前栈查找与Native API函数相关的数据时,为了保证避免其他进程在使用时修改当前栈中的内容,需要将当前栈中的数据复制出来,此时可以在内存中预先分配好一块区域,用来存储该当前栈中的当前数据。这里为了便于描述,可以将这块区域称之为栈内存。
同样的,为了避免具有第二地址的当前栈中的内容在复制时被破坏掉,因此也需要使用汇编语言完成将具有第二地址的当前栈中的内容复制到预先在内存中分配的栈内存中的过程。
206,遍历栈内存,获取地址在模块代码段的范围内的指针数据;
根据步骤204和步骤205可知,栈内存中的数据和当前栈中的数据是相同的,因此可以遍历该栈内存,以获取地址在模块代码段的范围内的指针数据。
在实际应用中,在每一个用于调用函数语句的后面,通常会设置一个指针数据,该指针数据通常用于指向用于调用该函数语句后面的返回地址,以便于在执行完该函数代码之后,可以根据该指针数据返回到该用于调用函数语句后面的地址,以继续执行后面的代码。
需要注意的是,为了保证其他进程可以继续使用当前栈,在将具有第二地址的当前栈中的数据复制到到栈内存之后,需要将当前栈的第二地址修改回原来的第一地址,以便其他进程可以识别并使用该当前栈。为了保证在将当前栈的第二地址改回为第一地址时,当前栈中的数据不被破坏掉,此时需要使用内联汇编完成将具有第二地址的当前栈的地址由第二地址修改回第一地址的操作。也即,利用汇编语言将具有第二地址的当前栈的地址由第二地址修改回第一地址。
207,根据指针数据的地址减去预定字节的长度,得到第一起始地址;
预定字节的长度通常可以为5个字节。
208,检测以第一起始地址为起始地址的语句是否为指定语句,指定语句为调用函数的语句;
举例来讲,指定语句可以为CALL XXXXXX,其中后面的XXXXXX则为调用的函数的起始地址。
而指定语句CALL XXXXXX通常具有上面所讲的预定字节的长度,即可以为5个字节。
也就是说,根据获取到的指针数据的地址减去该指定语句CALL XXXXXX的长度,即为指定语句CALL XXXXXX的地址,也就是说第一起始地址即为指定语句CALL XXXXXX的地址。
209,若检测结果为以第一起始地址为起始地址的语句为指定语句,则检测指定语句中的指针所指的内容是否包含Native API函数的特征;
举例来讲,当指定语句为CALL XXXXXX时,指定语句中的指针地址即为XXXXXX。
Native API函数的特征即为通用的Native API函数的特征,举例来讲,检测指定语句中的指针所指的内容是否为MOV EAX,YYYYYY(通用的Native API函数的特征),这里的YYYYYY可以为Native API函数的系统调用号。
换句话说,如果以第一起始地址为起始地址的语句为指定语句CALLXXXXXX,则进一步检测指定语句中的指针所指的内容是否包含Native API函数的特征MOV EAX,YYYYYY。
210,若检测结果为指定语句中的指针所指的内容包含Native API函数的特征,则检测Native API函数是否为目标Native API函数;
若指定语句中的指针所指的内容包含Native API函数的特征,也就是说指定语句调用的函数为Native API函数,此时则可以进一步判断该Native API函数是否为目标Native API函数。
举例来讲,可以先将用于记录检测到Native API函数的次数的记录值加1,然后根据该记录值判断Native API函数是否为目标Native API函数。换句话说,当每次检测到指定语句调用的函数为Native API函数时,则将记录值加1,然后可以根据该记录值确定该Native API函数是否为目标Native API函数。
在实际应用中,根据该记录值判断Native API函数是否为目标Native API函数可以包括:检测该记录值是否为预定记录阈值;若检测结果为该记录值为预定记录阈值,则判定检测结果为Native API函数为目标Native API函数。
通常情况下,当前栈中地址位于模块代码段中的指针数据可能会有多个,也就是说,该模块代码段中可能会存在多个Native API函数,但通常在应用程序每次执行时,它们的顺序是不变的,且根据栈的特性可知,每次遍历栈内存,获取指针数据的顺序也是不变的。举例来讲,在实际应用中,可以先人工确认下所要找的目标Native API函数是模块代码段中的第几个,比如目标Native API函数为该模块代码段中的第4个,此时可以将该预定记录阈值设置为4,然后在应用程序执行时,当检测到指定语句调用的函数是第四个被检测到的Native API函数时,则可以确定该函数为目标Native API函数。
需要说明的是,可以通过人工的方式确定应用程序中所需要的所有未导出的Native API函数所对应的预定记录阈值,然后将这些预定记录阈值预先设置在应用程序中,以后在每次执行该应用程序时,均可以自动根据这些预定记录阈值检测是否查找到未导出的目标Native API函数。
211,若检测结果为Native API函数为目标Native API函数,则判定该指定语句为存在的用于调用目标Native API函数的语句;
当Native API函数为目标Native API函数时,则可以确定该指定语句CALLXXXXXX为用于调用目标Native API函数的语句。
212,根据该指定语句中的指针所指的内容获取目标Native API函数。
也就是说,可以根据指定语句CALL XXXXXX中的指针所指的内容获取目标Native API函数的起始地址,也即可以获取到该Native API函数。
综上所述,本发明实施例提供的未导出的Native API函数获取方法,通过目标Native API函数所在的模块代码段的范围以及在调用指定函数时生成的当前栈,获取符合预定条件的指针数据,根据所述指针数据的地址检测是否存在调用所述目标Native API函数的语句;若检测结果为存在调用所述目标NativeAPI函数的语句,则根据所述调用所述目标Native API函数的语句获取所述目标Native API函数;解决现有技术中利用特征码进行暴力搜索时,搜索效率和搜索命中率非常低的问题;在应用程序开始执行后,自动根据当前栈里的内容搜索目标Native API函数,在搜索的过程中不受系统版本的限制,也不受人工的限制,达到了可以很大程度上提高搜索效率和搜索命中率的效果。
请参见图3所示,其示出了本发明一个实施例中提供的未导出的Native API函数获取装置的结构示意图。该未导出的Native API函数获取装置可以包括但不限于:范围获取模块301、当前栈获取模块302、指针数据获取模块303、检测模块304和目标函数获取模块305。
范围获取模块301,可以用于获取目标Native API函数所在的模块代码段的范围,所述目标Native API函数为指定的未导出的Native API函数;
当前栈获取模块302,可以用于获取在调用指定函数时生成的当前栈,所述指定函数为在被调用时调用所述目标Native API函数的Windows API函数;
指针数据获取模块303,可以用于根据所述当前栈获取模块302获取到的所述当前栈,获取地址位于所述范围获取模块301获取到的所述模块代码段的范围内的指针数据;
检测模块304,可以用于根据所述指针数据获取模块303获取到的所述指针数据的地址,检测所述模块代码段中是否存在调用所述目标Native API函数的语句;
目标函数获取模块305,用于在所述检测模块304的检测结果为所述模块代码段中存在调用所述目标Native API函数的语句时,根据所述调用所述目标Native API函数的语句获取所述目标Native API函数。
综上所述,本发明实施例提供的未导出的Native API函数获取装置,通过目标Native API函数所在的模块代码段的范围以及在调用指定函数时生成的当前栈,获取符合预定条件的指针数据,根据所述指针数据的地址检测是否存在调用所述目标Native API函数的语句;若检测结果为存在调用所述目标NativeAPI函数的语句,则根据所述调用所述目标Native API函数的语句获取所述目标Native API函数;解决现有技术中利用特征码进行暴力搜索时,搜索效率和搜索命中率非常低的问题;在应用程序开始执行后,自动根据当前栈里的内容搜索目标Native API函数,在搜索的过程中不受系统版本的限制,也不受人工的限制,达到了可以很大程度上提高搜索效率和搜索命中率的效果。
请参见图4所示,其示出了本发明另一个实施例中提供的未导出的NativeAPI函数获取装置的结构示意图。该未导出的Native API函数获取装置可以包括但不限于:范围获取模块401、当前栈获取模块402、指针数据获取模块403、检测模块404和目标函数获取模块405。
范围获取模块401,可以用于获取目标Native API函数所在的模块代码段的范围,目标Native API函数为指定的未导出的Native API函数;
当前栈获取模块402,可以用于获取在调用指定函数时生成的当前栈,指定函数为在被调用时调用目标Native API函数的Windows API函数;
指针数据获取模块403,可以用于根据当前栈获取模块402获取到的当前栈,获取地址位于范围获取模块401获取到的模块代码段的范围内的指针数据;
检测模块404,可以用于根据指针数据获取模块403获取到的指针数据的地址,检测是否所述模块代码段中存在调用目标Native API函数的语句;
目标函数获取模块405,可以用于在检测模块404的检测结果为所述模块代码段中存在调用目标Native API函数的语句时,根据调用目标Native API函数的语句获取目标Native API函数。
在一个可能实现的实施方式中,当前栈获取模块402可以包括:执行单元402a和当前栈获取单元402b。
执行单元402a,可以用于执行调用指定函数的功能;
当前栈获取单元402b,可以用于获取在执行调用指定函数的功能时生成的当前栈。
在一个可能实现的实施方式中,指针数据获取模块403可以包括:第一修改单元403a、复制单元403b和指针数据获取单元403c。
第一修改单元403a,可以用于利用汇编语言将当前栈的地址由第一地址修改为第二地址;
复制单元403b,可以用于利用汇编语言将具有第二地址的当前栈中的内容复制到预先在内存中分配的栈内存中;
指针数据获取单元403c,可以用于遍历栈内存,获取地址在模块代码段的范围内的指针数据。
在一个可能实现的实施方式中,指针数据获取模块403还可以包括:第二修改单元403d。
第二修改单元403d,可以用于利用汇编语言将具有第二地址的当前栈的地址由第二地址修改回第一地址。
在一个可能实现的实施方式中,检测模块404可以包括:减去单元404a、第一检测单元404b、第二检测单元404c、第三检测单元404d和判定单元404e。
减去单元404a,可以用于根据指针数据的地址减去预定字节的长度,得到第一起始地址;
第一检测单元404b,可以用于检测以第一起始地址为起始地址的语句是否为指定语句;
第二检测单元404c,可以用于在第一检测单元404b的检测结果为以第一起始地址为起始地址的语句为指定语句时,检测指定语句中的指针所指的内容是否包含Native API函数的特征;
第三检测单元404d,可以用于在第二检测单元404c的检测结果为指定语句中的指针所指的内容包含Native API函数的特征时,检测Native API函数是否为目标Native API函数;
判定单元404e,可以用于在第三检测单元404d的检测结果为Native API函数为目标Native API函数时,判定存在调用目标Native API函数的语句。
在一个可能实现的实施方式中,目标函数获取模块405,还可以用于根据指定语句中的指针所指的内容获取目标Native API函数。
在一个可能实现的实施方式中,检测模块404可以包括:增加单元404f。
增加单元404f,可以用于将用于记录检测到Native API函数的次数的记录值加1。
第三检测单元404d还可以包括:检测子单元和判定子单元。
检测子单元,可以用于检测记录值是否为预定记录阈值;
判定子单元,可以用于在检测子单元的检测结果为记录值为预定记录阈值时,判定检测结果为Native API函数为目标Native API函数。
综上所述,本发明实施例提供的未导出的Native API函数获取装置,通过目标Native API函数所在的模块代码段的范围以及在调用指定函数时生成的当前栈,获取符合预定条件的指针数据,根据所述指针数据的地址检测是否存在调用所述目标Native API函数的语句;若检测结果为存在调用所述目标NativeAPI函数的语句,则根据所述调用所述目标Native API函数的语句获取所述目标Native API函数;解决现有技术中利用特征码进行暴力搜索时,搜索效率和搜索命中率非常低的问题;在应用程序开始执行后,自动根据当前栈里的内容搜索目标Native API函数,在搜索的过程中不受系统版本的限制,也不受人工的限制,达到了可以很大程度上提高搜索效率和搜索命中率的效果。
需要说明的是:上述实施例提供的未导出的Native API函数获取装置在获取未导出的Native API函数时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的未导出的Native API函数获取装置与未导出的Native API函数获取方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (14)

1.一种未导出的Native API函数获取方法,其特征在于,所述方法,包括:
获取目标Native API函数所在的模块代码段的范围,所述目标Native API函数为指定的未导出的Native API函数;
获取在调用指定函数时生成的当前栈,所述指定函数为在被调用时调用所述目标Native API函数的Windows API函数;
根据所述当前栈,获取地址位于所述模块代码段的范围内的指针数据;
根据所述指针数据的地址,检测所述模块代码段中是否存在用于调用所述目标Native API函数的指定语句;
若检测结果为所述模块代码段中存在用于调用所述目标Native API函数的语句,则根据所述用于调用所述目标Native API函数的语句获取所述目标NativeAPI函数。
2.根据权利要求1所述的方法,其特征在于,所述获取在调用指定函数时生成的当前栈,包括:
执行调用所述指定函数的功能;
获取在执行调用所述指定函数的功能时生成的当前栈。
3.根据权利要求2所述的方法,其特征在于,所述根据所述当前栈获取地址位于所述模块代码段的范围内的指针数据,包括:
利用汇编语言将所述当前栈的地址由第一地址修改为第二地址;
利用汇编语言将具有所述第二地址的所述当前栈中的内容复制到预先在内存中分配的栈内存中;
遍历所述栈内存,获取地址在所述模块代码段的范围内的指针数据。
4.根据权利要求3所述的方法,其特征在于,在所述利用汇编语言将具有所述第二地址的所述当前栈中的内容复制到预先在内存中分配的栈内存中之后,还包括:
利用汇编语言将具有所述第二地址的所述当前栈的地址由所述第二地址修改回所述第一地址。
5.根据权利要求3所述的方法,其特征在于,所述根据所述指针数据的地址,检测所述模块代码段中是否存在调用所述目标Native API函数的语句,包括:
根据所述指针数据的地址减去预定字节的长度,得到第一起始地址;
检测以所述第一起始地址为起始地址的语句是否为指定语句,所述指定语句为调用函数的语句;
若检测结果为以所述第一起始地址为起始地址的语句为指定语句,则检测所述指定语句中的指针所指的内容是否包含Native API函数的特征;
若检测结果为所述指定语句中的指针所指的内容包含Native API函数的特征,则检测所述Native API函数是否为所述目标Native API函数;
若检测结果为所述Native API函数为所述目标Native API函数,则判定所述指定语句为存在的用于调用所述目标Native API函数的语句。
6.根据权利要求5所述的方法,其特征在于,所述根据所述调用所述目标Native API函数的语句获取所述目标Native API函数,包括:
根据所述指定语句中的所述指针所指的内容获取所述目标Native API函数。
7.根据权利要求5所述的方法,其特征在于,在所述检测所述Native API函数是否为所述目标Native API函数之前,还包括:
将用于记录检测到Native API函数的次数的记录值加1;
所述检测所述Native API函数是否为所述目标Native API函数,包括:
检测所述记录值是否为预定记录阈值;
若检测结果为所述记录值为预定记录阈值,则判定检测结果为所述NativeAPI函数为所述目标Native API函数。
8.一种未导出的Native API函数获取装置,其特征在于,所述装置,包括:
范围获取模块,用于获取目标Native API函数所在的模块代码段的范围,所述目标Native API函数为指定的未导出的Native API函数;
当前栈获取模块,用于获取在调用指定函数时生成的当前栈,所述指定函数为在被调用时调用所述目标Native API函数的Windows API函数;
指针数据获取模块,用于根据所述当前栈获取模块获取到的所述当前栈,获取地址位于所述范围获取模块获取到的所述模块代码段的范围内的指针数据;
检测模块,用于根据所述指针数据获取模块获取到的所述指针数据的地址,检测所述模块代码段中是否存在用于调用所述目标Native API函数的语句;
目标函数获取模块,用于在所述检测模块的检测结果为所述模块代码段中存在用于调用所述目标Native API函数的语句时,根据所述用于调用所述目标Native API函数的语句获取所述目标Native API函数。
9.根据权利要求8所述的装置,其特征在于,所述当前栈获取模块,包括:
执行单元,用于执行调用所述指定函数的功能;
当前栈获取单元,用于获取在执行调用所述指定函数的功能时生成的当前栈。
10.根据权利要求9所述的装置,其特征在于,所述指针数据获取模块,包括:
第一修改单元,用于利用汇编语言将所述当前栈的地址由第一地址修改为第二地址;
复制单元,用于利用汇编语言将具有所述第二地址的所述当前栈中的内容复制到预先在内存中分配的栈内存中;
指针数据获取单元,用于遍历所述栈内存,获取地址在所述模块代码段的范围内的指针数据。
11.根据权利要求10所述的装置,其特征在于,所述指针数据获取模块,还包括:
第二修改单元,用于利用汇编语言将具有所述第二地址的所述当前栈的地址由所述第二地址修改回所述第一地址。
12.根据权利要求10所述的装置,其特征在于,所述检测模块,包括:
减去单元,用于根据所述指针数据的地址减去预定字节的长度,得到第一起始地址;
第一检测单元,用于检测以所述第一起始地址为起始地址的语句是否为指定语句,所述指定语句为调用函数的语句;
第二检测单元,用于在所述第一检测单元的检测结果为以所述第一起始地址为起始地址的语句为指定语句时,检测所述指定语句中的指针所指的内容是否包含Native API函数的特征;
第三检测单元,用于在所述第二检测单元的检测结果为所述指定语句中的指针所指的内容包含Native API函数的特征时,检测所述Native API函数是否为所述目标Native API函数;
判定单元,用于在所述第三检测单元的检测结果为所述Native API函数为所述目标Native API函数时,判定所述指定语句为存在的用于调用所述目标Native API函数的语句。
13.根据权利要求12所述的装置,其特征在于,所述目标函数获取模块,还用于:
根据所述指定语句中的所述指针所指的内容获取所述目标Native API函数。
14.根据权利要求12所述的装置,其特征在于,所述检测模块,还包括:
增加单元,用于将用于记录检测到Native API函数的次数的记录值加1;
所述第三检测单元,包括:
检测子单元,用于检测所述记录值是否为预定记录阈值;
判定子单元,用于在所述检测子单元的检测结果为所述记录值为预定记录阈值时,判定检测结果为所述Native API函数为所述目标Native API函数。
CN201310455256.7A 2013-09-29 2013-09-29 未导出的Native API函数获取方法及装置 Active CN103632099B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310455256.7A CN103632099B (zh) 2013-09-29 2013-09-29 未导出的Native API函数获取方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310455256.7A CN103632099B (zh) 2013-09-29 2013-09-29 未导出的Native API函数获取方法及装置

Publications (2)

Publication Number Publication Date
CN103632099A true CN103632099A (zh) 2014-03-12
CN103632099B CN103632099B (zh) 2016-08-17

Family

ID=50213134

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310455256.7A Active CN103632099B (zh) 2013-09-29 2013-09-29 未导出的Native API函数获取方法及装置

Country Status (1)

Country Link
CN (1) CN103632099B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106445603A (zh) * 2016-09-28 2017-02-22 腾讯科技(深圳)有限公司 程序处理方法和装置
CN106919458A (zh) * 2015-12-25 2017-07-04 腾讯科技(深圳)有限公司 Hook目标内核函数的方法及装置
CN107704376A (zh) * 2016-08-11 2018-02-16 福建省天奕网络科技有限公司 游戏自动化测试方法及其系统
CN115002180A (zh) * 2022-05-26 2022-09-02 上海商米科技集团股份有限公司 一种网络请求运行监测方法、装置和计算机可读介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1622009A1 (en) * 2004-07-27 2006-02-01 Texas Instruments Incorporated JSM architecture and systems
CN1731310A (zh) * 2005-08-04 2006-02-08 西安交通大学 Windows环境下的主机入侵检测方法
CN102024113A (zh) * 2010-12-22 2011-04-20 北京安天电子设备有限公司 快速检测恶意代码的方法和系统
CN102034050A (zh) * 2011-01-25 2011-04-27 四川大学 基于虚拟机和敏感Native API调用感知的恶意软件动态检测方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1622009A1 (en) * 2004-07-27 2006-02-01 Texas Instruments Incorporated JSM architecture and systems
CN1731310A (zh) * 2005-08-04 2006-02-08 西安交通大学 Windows环境下的主机入侵检测方法
CN102024113A (zh) * 2010-12-22 2011-04-20 北京安天电子设备有限公司 快速检测恶意代码的方法和系统
CN102034050A (zh) * 2011-01-25 2011-04-27 四川大学 基于虚拟机和敏感Native API调用感知的恶意软件动态检测方法

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106919458A (zh) * 2015-12-25 2017-07-04 腾讯科技(深圳)有限公司 Hook目标内核函数的方法及装置
CN106919458B (zh) * 2015-12-25 2020-09-01 腾讯科技(深圳)有限公司 Hook目标内核函数的方法及装置
CN107704376A (zh) * 2016-08-11 2018-02-16 福建省天奕网络科技有限公司 游戏自动化测试方法及其系统
CN107704376B (zh) * 2016-08-11 2023-07-07 福建省天奕网络科技有限公司 游戏自动化测试方法及其系统
CN106445603A (zh) * 2016-09-28 2017-02-22 腾讯科技(深圳)有限公司 程序处理方法和装置
CN106445603B (zh) * 2016-09-28 2018-02-02 腾讯科技(深圳)有限公司 程序处理方法和装置
CN115002180A (zh) * 2022-05-26 2022-09-02 上海商米科技集团股份有限公司 一种网络请求运行监测方法、装置和计算机可读介质
CN115002180B (zh) * 2022-05-26 2024-05-14 上海商米科技集团股份有限公司 一种网络请求运行监测方法、装置和计算机可读介质

Also Published As

Publication number Publication date
CN103632099B (zh) 2016-08-17

Similar Documents

Publication Publication Date Title
US8561033B2 (en) Selective branch-triggered trace generation apparatus and method
CN109471697B (zh) 一种监控虚拟机中系统调用的方法、装置及存储介质
CN106681897B (zh) 一种代码调试方法及装置
CN104932972B (zh) 一种反动态调试应用程序的方法及装置
CN107015841B (zh) 一种程序编译的预处理方法及程序编译设备
CN105302717A (zh) 一种大数据平台的检测方法及装置
CN111796831A (zh) 一种多芯片兼容的编译方法和装置
CN103632099A (zh) 未导出的Native API函数获取方法及装置
CN103019787A (zh) 函数调用关系确定方法、热补丁升级方法及装置
CN104391787A (zh) 一种针对目标方法的监控、热切入方法及装置
CN104407886A (zh) 一种引导与目标分离的嵌入式软件固化、加载方法
CN103886229A (zh) 一种提取pe文件特征的方法及装置
KR101979329B1 (ko) 바이너리의 취약점을 유발하는 입력데이터 위치 추적 방법 및 그 장치
CN106202100A (zh) 页面的加载方法及装置
CN103839007A (zh) 一种检测异常线程的方法及系统
KR102545765B1 (ko) 메모리 오류를 검출하는 방법 및 시스템
CN107544811B (zh) IOS平台隐藏dylib文件的方法、存储介质、电子设备及系统
KR20080096518A (ko) 해석가능한 코드를 실행시키는 것과 연관된 위험의 사정을용이하게 하는 컴퓨터 구현 방법, 컴퓨터 프로그램 제품,및 컴퓨팅 시스템
KR20180129623A (ko) 연관된 다중 파일 정적 분석 장치
CN114003269A (zh) 组件处理方法、装置、电子设备及存储介质
CN104933359B (zh) 一种恶意软件的多执行路径构造方法
CN102831334A (zh) 一种目标地址定位方法和系统
US20150007139A1 (en) Optimizing error parsing in an integrated development environment
US9940068B2 (en) Device and method for determining memory leaks
CN116302095A (zh) 指令跳转判断方法、装置、电子设备及可读存储介质

Legal Events

Date Code Title Description
PB01 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.