CN107102944B - 一种调用函数的分析方法及装置 - Google Patents
一种调用函数的分析方法及装置 Download PDFInfo
- Publication number
- CN107102944B CN107102944B CN201710225618.1A CN201710225618A CN107102944B CN 107102944 B CN107102944 B CN 107102944B CN 201710225618 A CN201710225618 A CN 201710225618A CN 107102944 B CN107102944 B CN 107102944B
- Authority
- CN
- China
- Prior art keywords
- function
- calling
- analysis
- information
- calling function
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3644—Software debugging by instrumenting at runtime
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种调用函数的分析方法及装置,涉及计算机安全技术领域,主要目的是能够兼顾保护后可执行程序的体积和运行效率的平衡。所述方法包括:获取调用函数对应的函数信息,当程序执行至所述调用函数时,根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析,生成调用函数的分析结果。本发明主要用于对调用函数进行分析。
Description
技术领域
本发明涉及计算机安全领域,尤其是一种调用函数的分析方法及装置。
背景技术
在函数保护中,如果对函数的调用情况没有清楚的认识,盲目地对函数进行加壳保护,如代码碎片化、代码虚拟化、代码移植或者代码混淆,很容易无意中对系统函数或者操作中不曾被调用的函数进行了保护,这样不仅影响了加壳后程序的体积,同时还会降低加壳后程序的运行效率。
如果开发人员在程序运行过程中保护了过多的僵尸函数和调用次数特别多的函数,会使得保护后的可执行程序的体积加大,同时会降低保护后的可执行程序的运行效率。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种调用函数的分析方法及装置,能够实现调用函数的分析,从而方便查找关键函数。
本发明实施例的一方面,本发明提供了一种调用函数的分析方法,包括:
获取调用函数对应的函数信息;
当程序执行至所述调用函数时,根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析;
生成调用函数的分析结果。
进一步地,在所述获取调用函数对应的函数信息之前,所述方法还包括:
通过挂起的方式创建分析进程,所述分析进程中包含有预设容量的动态内存;
将预设分析代码载入所述动态内存中;
创建内存映射文件以及统计结果事件,所述内存映射文件中存储有调用函数的函数信息。
进一步地,所述根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析包括:
传递所述分析进程的标识信息,根据所述标识信息加载所述内存映射文件以及统计结果事件;
根据所述内存映射文件将程序执行的起始地址添加至所述预设分析代码中,当所述分析进程执行时跳转至所述程序执行的起始地址;
加载需要注入至所述分析进程的动态链接库,根据所述动态链接库中的监控函数块对所述调用函数进行分析,得到调用函数的调用信息;
将所述调用函数的调用信息实时的保存到内存映射文件当中。
进一步地,所述根据所述动态链接库中的监控函数块对所述调用函数进行分析,得到调用函数的调用信息包括:
启动所述动态链接库中的函数hook被保护程序的函数块作为监控函数块;
根据所述函数hook被保护程序的函数块监控所述调用函数的调用情况,得到所述调用函数的调用信息。
进一步地,在所述启动所述动态链接库中的函数hook被保护程序的函数块作为监控函数块之前,所述方法还包括:
根据所述调用函数的函数信息获取所述调用函数的函数类型;
当所述调用函数的函数类型为可直接执行函数时,通过模块句柄载入动态链接库;
当所述调用函数的函数类型为不可直接执行函数时,通过加载模块载入动态链接库。
进一步地,所述根据所述函数hook被保护程序的函数块监控所述调用函数的调用情况,得到所述调用函数的调用信息包括:
当调用函数被调用时,通过所述函数hook被保护的函数块获取所述调用函数的地址;
根据所述调用函数的地址遍历所述内存映射文件中存储的调用函数的相对虚拟地址;
更新匹配结果相一致的调用函数对应的调用信息,将所述调用信息保存至所述内存映射文件中。
进一步地,所述获取调用函数的函数信息包括:
启动所述分析进程,通过所述内存映射文件获取所述调用函数的函数信息。
依据本发明实施例的另一方面,本发明实施例提供了一种调用函数的分析装置,包括:
获取单元,用于获取调用函数对应的函数信息;
分析单元,用于当程序执行至所述调用函数时,根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析;
生成单元,用于生成调用函数的分析结果。
进一步地,所述装置还包括:
第一创建单元,用于通过挂起的方式创建分析进程,所述分析进程中包含有预设容量的动态内存;
载入单元,用于将所述预设分析代码载入所述动态内存中;
第二创建单元,用于创建内存映射文件以及统计结果事件,所述内存映射文件中存储有调用函数的函数信息。
进一步地,所述分析单元包括:
加载模块,用于传递所述分析进程的标识信息,根据所述标识信息加载所述分析进程中的内存映射文件以及统计结果事件;
添加模块,用于根据所述内存映射文件将程序执行的起始地址添加至所述预设分析代码中,当所述分析进程执行时跳转至所述程序执行的起始地址;
分析模块,用于加载需要注入至所述分析进程的动态链接库,根据所述动态链接库中的监控函数块对所述调用函数进行分析,得到调用函数的调用信息;
保存模块,用于将所述调用函数的调用信息实时的保存到内存映射文件当中。
进一步地,所述分析模块,具体用于启动所述动态链接库中的函数hook被保护程序的函数块作为监控函数块;
所述分析模块,具体还用于根据所述函数hook被保护程序的函数块监控所述调用函数的调用情况,得到所述调用函数的调用信息。
进一步地,所述分析模块,具体还用根据所述调用函数的函数信息获取所述调用函数的函数类型;
所述分析模块,具体还用当所述调用函数的函数类型为可直接执行函数时,通过模块句柄载入动态链接库;
所述分析模块,具体还用当所述调用函数的函数类型为不可直接执行函数时,通过加载模块载入动态链接库。
进一步地,所述分析模块,具体还用于当调用函数被调用时,通过所述函数hook被保护的函数块获取所述调用函数的地址;
所述分析模块,具体还用于根据所述调用函数的地址遍历所述内存映射文件中存储的调用函数的相对虚拟地址,得到匹配结果相一致的调用函数对应的调用信息;
所述分析模块,具体还用于更新匹配结果相一致的调用函数对应的调用信息,将所述调用信息保存至所述内存映射文件中。
进一步地,所述获取单元,具体用于启动所述分析进程,通过所述内存映射文件获取所述调用函数的函数信息。
借由上述技术方案,本发明提供的一种调用函数的分析方法及装置,通过在程序执行到该调用函数时,根据预设分析代码对函数信息所对应调用函数进行分析,能够实时监控调用函数的调用情况,生成调用函数的分析结果。与现有技术的调用函数的分析方法相比,本发明实施例通过在程序运行过程中对调用函数进行分析,能够得到程序执行过程中函数的调用情况,进而根据函数的调用情况实时对程序的函数模块进行优化,提高可执行程序的运行效率,另外,根据调用函数的调用情况可以找到程序运行的核心函数,进而对核心函数进行保护,同时极大地节省了技术人员的时间。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提供的一种调用函数的分析方法流程示意图;
图2示出了本发明实施例提供的另一种调用函数的分析方法流程示意图;
图3示出了本发明实施例提供的一种调用函数的分析装置结构示意图;
图4示出了本发明实施例提供的另一种调用函数的分析装置结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
本发明实施例提供了一种调用函数的分析方法,如图1所示,该方法主要通过启动分析进程对调用函数进行监控,具体步骤包括:
101、获取调用函数对应的函数信息。
其中,调用函数对应的函数信息可以包括但不局限于调用函数的名称,调用函数的相对虚拟地址RVA,调用函数的相对虚拟地址RVA的个数以及程序执行的起始地址等信息。
需要说明的是,调用函数的函数信息通常可以存储在内存映射文件中,以实现不同分析模块之间函数信息的共享,另外,通过内存映射文件可以方便同时启动多个性能分析模块,并且实现模块之间的数据通信,如传递不同调用函数的函数信息。
102、当程序执行至所述调用函数时,根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析。
这里的预设分析代码主要用于对调用函数的调用情况进行分析,具体可以包括进程标识传递模块、程序起始地址添加模块、动态链接库的注入模块、信息保存模块等多个模块,其中,进程标识传递模块用于传递分析进程的标识信息,从而程序根据该标识信息加载内存映射文件以及统计结果事件,这里的内存映射文件中存储有调用函数的函数信息,如函数的名称,函数的相对虚拟地址RVA,函数的相对虚拟地址RVA的个数以及程序执行的起始地址等信息,程序起始地址添加模块用于将内存映射文件中程序执行的起始地址添加至预设分析代码中,以便当调用函数被调用时跳转至预设分析代码执行的起始地址,动态链接库的注入模块用于加载分析进程的动态链接库,根据动态链接库中的存储的分析函数块对调用函数进行监控,得到调用函数的调用信息,这里使用动态链接库可以更为容易地将程序应用与各个模块,并且不影响该程序的其他部分,这样也方便对分析进程进行修改,如需要对调用信息中的内容进行更新,可以通过对动态链接库进行修改即可,从而方便程序的更新,信息保存模块用于根据统计结果事件将调用信息保存至内存映射文件中,以便后续对调用信息的分析,还可以显示在显示界面,从而更直观的展示给用户。
具体地,当程序执行至调用函数时,通过预设分析代码中的各个模块对调用函数进行分析,首先通过进程标识传递模块传递分析进程的标识信息,根据该标识信息加载内存映射文件以及统计结果时间,然后通过程序起始地址添加模块将内存映射文件中程序执行的起始地址添加至预设分析代码中,进一步通过动态链接库加载动态链接库中的监控函数块对调用函数进行分析,得到调用信息,最后通过信息保存模块将调用函数的调用信息实时保存至内存映射文件中。
103、生成调用函数的分析结果。
这里的分析结果为调用函数的调用情况,如调用函数的调用次数以及调用时间等调用信息,需要说明的是,具体分析结果的显示可以根据用户实际需求进行设置,如用户可以设置界面显示某函数最近一次被调用的详细信息,还可以设置界面显示所有调用函数的调用次数等,本发明实施例对分析结果的在界面上显示的内容不进行限定。
结合上述的实现方式可以看出,本发明实施例提供的一种调用函数的分析方法,通过在程序执行到该调用函数时,根据预设分析代码对函数信息所对应调用函数进行分析,能够实时监控调用函数的调用情况,生成调用函数的分析结果。与现有技术的调用函数的分析方法相比,本发明实施例通过在程序运行过程中对调用函数进行分析,能够得到程序执行过程中函数的调用情况,进而根据函数的调用情况实时对程序的函数模块进行优化,提高可执行程序的运行效率,另外,根据调用函数的调用情况可以找到程序运行的核心函数,进而对核心函数进行保护,同时极大地节省了技术人员的时间。
以下为了更加详细地说明本发明提出的一种调用函数的分析方法,特别是在根据预设监控代码对调用函数进行监控的步骤,本发明实施例还提供了另一种调用函数的分析方法,如图2所示,该方法的具体步骤包括:
201、通过挂起的方式创建分析进程。
其中,分析进程用于分析程序执行中调用函数的调用情况,例如,程序在执行过程中函数被调用的次数、被调用的时间等调用情况,另外,由于执行程序都需要一定的内存,为了方便进程的使用,在分析进程中申请预设容量的动态内存,可以用来存放预设分析代码或者其他程序运行数据,如代码段或数据段,本发明实施例对申请动态内存的容量大小不进行限定,可根据应用运行实际需要的内存大小进行申请。
需要说明的是,这里为了用户观察和分析进程,通过挂起的方式创建分析进程,此时该分析进程处于静止状态,从而方便用户对程序进行修改或者其他操作。
对于本发明实施例,通过创建的分析进程对程序执行中调用函数的调用情况进行分析,以便找出程序执行中的核心函数,通常情况下,核心函数在程序运行过程中的肯定会被调用,并且调用次数不会特别多,本发明实施例可以通过分析调用函数的调用次数来获取核心函数,进而对核心函数进行重点保护。
需要说明的是,在创建分析进程之前可以通过分析器对进程中的各个子线程进行性能分析,这里的性能分析主要是通过统计内存使用状况检测可能存在的内存泄露问题以及确定优化内存使用的方向,以防止界面卡死。
202、将预设分析代码载入所述动态内存中。
这里预设分析代码用于监控调用函数的调用信息,具体可以包括进程标识传递模块、程序起始地址添加模块、动态链接库的注入模块、信息保存模块等多个模块,各个模块之间可以互通消息,并且相互之间不会影响。
需要说明的是,这里的预设分析代码可以通过组装shellcode的方式来存储各个模块,然后将shellcode写入到申请的动态内存中,本发明实施例对预设分析代码的编译模式不进行限定。
203、创建内存映射文件以及统计结果事件。
其中,内存映射文件中存储有调用函数的函数信息,例如,调用函数的名称、调用函数的相对虚拟地址RVA、调用函数的相对虚拟地址RVA的个数以及程序执行的起始地址等信息,该统计结果事件用于统计调用函数的调用信息。
对于本发明实施例,通过创建内存映射文件,可以方便同时启动多个性能分析模块,并且实现模块之间的数据通信,通过创建统计结果事件,进一步方便模块之间进行消息传递。
204、启动所述分析进程,通过所述内存映射文件获取所述调用函数的函数信息。
其中,调用函数对应的函数信息可以包括但不局限于调用函数的名称,调用函数的相对虚拟地址RVA,调用函数的相对虚拟地址RVA的个数以及程序执行的起始地址等信息。
205、当程序执行至所述调用函数时,传递所述分析进程的标识信息,根据所述标识信息加载所述内存映射文件以及统计结果事件。
其中,分析进程的标识信息为操作系统的内核用于唯一标识进程的一个数值,这里的标识信息可以作为许多函数调用的参数,用以调整进程的优先级、控制进程行为等。
为了进一步获取调用函数的函数信息以及调用信息,根据传递的分析进程的标识信息加载内存映射文件以及统计结果事件,通过打开内存映射文件获取调用函数的函数信息,通过统计结果时间统计调用函数的调用信息。
206、根据所述内存映射文件将程序执行的起始地址添加至所述预设分析代码中,当所述分析进程执行时跳转至所述程序执行的起始地址。
需要说明的是,这里在预设分析代码中添加程序执行的起始地址的目的是保证当开启分析进程时跳转至程序执行的起始地址,从而对调用函数进行分析,进一步根据监控得到调用函数的调用信息来获取程序的核心函数,对核心函数进行保护。
207、加载需要注入至所述分析进程的动态链接库,根据所述动态链接库中的监控函数块对所述调用函数进行分析,得到调用函数的调用信息。
其中,动态链接库中存储有用于监控调用函数的分析函数块,进一步可以根据内存映射文件获取调用函数的函数信息,然后通过启动动态链接库中函数hook被保护程序的函数块作为分析函数块,对调用函数进行监控,监控调用函数的调用情况,得到调用函数的调用信息。
对于根据动态链接库中存储的分析函数块对调用函数进行监控步骤的过程具体可以包括但不局限于下述实现方式,当调用函数被调用时,通过函数hook被保护的函数块获取调用函数的地址,这里调用函数的地址根据调用函数的地址遍历内存映射文件中存储的调用函数的相对虚拟地址,当通过遍历查找后找到目标函数,调用统计函数将该目标函数的调用次数加1,更新调用函数的调用信息,这里只有当执行调用函数时才能更新相应的调用信息,并将调用信息保存至内存映射文件中。
需要说明的是,在通过动态链接库中的函数hook被保护函数块对调用函数进行监控之前,可以根据调用函数的函数类型的不同采用不同的方式加载动态链接库,具体可以包括但不局限于下述方式,首先根据调用函数的函数信息获取调用函数的函数类型,如该调用函数的函数类型为dll类型或者exe类型,当调用函数的函数类型为exe可直接执行函数时,则说明模块肯定已经被加载过,进一步通过GetModuleHandle获取到模块句柄,通过模块句柄载入动态链接库;当调用函数的函数类型为dll不可直接执行函数时,则说明模块可能已经被加载过可能没被加载过,进一步通过loadlibrary加载模块载入动态链接库。
对于本发明实施例,通过在程序执行过程中加载动态链接库,通过动态链接库取得调用函数的地址进行函数调用,无需在程序运行之初加载所有代码,只有在程序需要用某个调用函数时才从动态链接库中取出调用函数,减少了程序的体积。
208、将所述调用函数的调用信息实时的保存到内存映射文件当中。
需要说明的是,本发明实施例还可通过创建一个缓冲区来存储调用信息,进一步根据统计结果事件将调用信息保存至缓冲区内,本发明实施例对调用信息的存储位置不进行限定。
209、生成调用函数的分析结果。
为了方便用户对调用函数的分析结果进行保存分析,本发明实施例可以将生成调用函数的分析结果保存到内存映射文件中,还可以将分析结果显示在界面上,本发明实施例不进行限定。
由于在程序运行过程中,不同函数的调用情况有所不同,在函数保护的过程中,如果保护了调用次数过多的函数,会导致程序运行效率低下,如果保护了调用次数过少的僵尸函数,会使得保护后的可执行程序体积过大,本发明实施例通过对调用函数的分析,能够兼顾安全的情况下达到程序体积和效率的平衡,在检查应用程序时候,通过对调用函数进行分析,能够找到潜藏在可执行程序当中的僵尸函数和调用次数特别多的函数,帮助软件开发人员优化编写的应用程序,同时在分析应用程序的过程中找到价值较高的关键函数,从而对关键函数进行加壳保护。
本发明实施例的具体应用场景可以包括但不限制于下述实现方式:当程序执行之前,首先创建内存映射文件以及统计结果事件,内存映射文件用于存储调用函数的函数信息,统计结果事件用于统计调用函数的调用信息然后通过挂起的方式,然后创建分析进程,并且在分析进程中申请预设容量的动态内存,并将用于分析调用函数的预设分析代码载入动态内存中,进一步启动分析进程,传递分析进程的标识信息,根据分析进程的标识信息加载内存映射文件以及统计结果事件,当程序执行到调用函数时,跳转至程序执行的起始地址,对程序执行过程中的调用函数进行分析,进一步加载需要注入分析进程的动态链接库,根据动态链接库中函数hook被保护的函数块对调用函数进行监控,若当前执行程序需要调用v412_open函数,进一步通过hook函数块获取v412_open函数的地址,根据v412_open函数的地址遍历内存映射文件中存储的调用函数的相对虚拟地址,找到与v412_open函数地址相匹配的相对虚拟地址,更新匹配结果相一致的调用函数对应的调用信息,将v412_open函数的调用次数加1,最后v412_open函数的调用信息保存至内存映射文件中。
为了进一步保证核心函数的安全性,本发明实施例提供的另一种调用函数的分析方法,通过对调用函数的调用情况进行监控,从而帮助软件开发人员找到价值较高的关键函数,发掘程序运行中的核心函数,进而对核心函数进行加壳保护。
进一步地,作为图1所示方法的具体实现,本发明实施例提供一种调用函数的分析装置,该装置实施例与前述方法实施例对应,为便于阅读,本装置不在对前述方法实施例中的细节内容进行逐一赘述,但应当明确,本实施例中的装置能够对应实现前述方法实施例中的全部内容,如图3所示,所述装置包括:
获取单元31,可以用于获取调用函数对应的函数信息,所述获取按压31为本装置中获取调用函数对应的函数信息的主要功能模块,其中,调用函数对应的函数信息可以包括但不局限于调用函数的名称,调用函数的相对虚拟地址RVA,调用函数的相对虚拟地址RVA的个数以及程序执行的起始地址等信息
分析单元32,可以用于当程序执行至所述调用函数时,根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析,所述分析单元32为本装置中对调用函数进行分析的主要功能模块,这里的预设分析代码主要用于对调用函数的调用情况进行分析,具体可以包括进程标识传递模块、程序起始地址添加模块、动态链接库的注入模块、信息保存模块等多个模块。
生成单元33,可以用于生成调用函数的分析结果,所述生成单元33为本装置中用于生成调用函数的分析结果的主要功能模块。
本发明实施例提供的一种调用函数的分析装置,通过在程序执行到该调用函数时,根据预设分析代码对函数信息所对应调用函数进行分析,能够实时监控调用函数的调用情况,生成调用函数的分析结果。与现有技术的调用函数的分析方法相比,本发明实施例通过在程序运行过程中对调用函数进行分析,能够得到程序执行过程中函数的调用情况,进而根据函数的调用情况实时对程序的函数模块进行优化,提高可执行程序的运行效率,另外,根据调用函数的调用情况可以找到程序运行的核心函数,进而对核心函数进行保护,同时极大地节省了技术人员的时间。
进一步地,作为图2所示方法的具体实现,本发明实施例提供了另一种调用函数的分析装置,该装置实施例与前述方法实施例对应,为便于阅读,本装置不在对前述方法实施例中的细节内容进行逐一赘述,但应当明确,本实施例中的装置能够对应实现前述方法实施例中的全部内容,如图4所示,所述装置包括:
第一创建单元41,可以用于通过挂起的方式创建分析进程,所述分析进程中包含有预设容量的动态内存,所述第一创建单元41为本装置中创建分析进程的主要功能模块,这里为了用户观察和分析进程,通过挂起的方式创建分析进程;
载入单元42,可以用于将预设分析代码载入所述动态内存中,所述载入单元42为本装置中用于将预设分析代码载入动态内存的主要功能模块,具体可以通过组装shellcode的方式来存储各个模块的预设分析代码,然后将shellcode写入到申请的动态内存中;
第二创建单元43,可以用于创建内存映射文件以及统计结果事件,所述内存映射文件中存储有调用函数的函数信息,所述第二创建单元43为本装置中用于创建内存映射文件以及统计结果事件的主要功能模块,其中,内存映射文件中存储有调用函数的函数信息,该统计结果事件用于统计调用函数的调用信息;
获取单元44,可以用于获取调用函数对应的函数信息,所述获取单元44为本装置中获取调用函数对应的函数信息的主要功能模块,其中,调用函数对应的函数信息可以包括但不局限于调用函数的名称,调用函数的相对虚拟地址RVA,调用函数的相对虚拟地址RVA的个数以及程序执行的起始地址等信息
分析单元45,可以用于当程序执行至所述调用函数时,根据所述预设分析代码对所述函数信息所对应调用函数的调用情况进行分析,所述分析单元45为本装置中对调用函数进行分析的主要功能模块,这里的预设分析代码主要用于对调用函数的调用情况进行分析,具体可以包括进程标识传递模块、程序起始地址添加模块、动态链接库的注入模块、信息保存模块等多个模块。
生成单元46,可以用于生成调用函数的分析结果,所述生成单元46为本装置中用于生成调用函数的分析结果的主要功能模块。
进一步地,所述分析单元45包括:
加载模块451,可以用于传递所述分析进程的标识信息,根据所述标识信息加载所述分析进程中的内存映射文件以及统计结果事件;
添加模块452,可以用于根据所述内存映射文件将程序执行的起始地址添加至所述预设分析代码中,当所述分析进程执行时跳转至所述程序执行的起始地址;
分析模块453,可以用于加载需要注入至所述分析进程的动态链接库,根据所述动态链接库中的监控函数块对所述调用函数进行分析,得到调用函数的调用信息;
保存模块454,用于将所述调用函数的调用信息实时的保存到内存映射文件当中。
进一步地,所述分析模块453,具体可以用于根据所述内存映射文件获取所述调用函数的函数信息;
所述分析模块453,具体还可以用于启动所述动态链接库中的函数hook被保护程序的函数块作为监控函数块;
所述分析模块453,具体还可以用于根据所述函数hook被保护程序的函数块监控所述调用函数的调用情况,得到所述调用函数的调用信息。
进一步地,在所述启动所述动态链接库中的函数hook被保护程序的函数块作为监控函数块之前,所述分析模块453,具体还可以用于根据所述调用函数的函数信息获取所述调用函数的函数类型;
所述分析模块453,具体还可以用当所述调用函数的函数类型为可直接执行函数时,通过模块句柄载入动态链接库;
所述分析模块453,具体还可以用当所述调用函数的函数类型为不可直接执行函数时,通过加载模块载入动态链接库。
进一步地,所述分析模块453,具体还可以用于当调用函数被调用时,通过所述函数hook被保护的函数块获取所述调用函数的地址;
所述分析模块453,具体还可以用于根据所述调用函数的地址遍历所述内存映射文件中存储的调用函数的相对虚拟地址,得到匹配结果相一致的调用函数对应的调用信息;
所述分析模块453,具体还可以用于更新匹配结果相一致的调用函数对应的调用信息,将所述调用信息保存至所述内存映射文件中。
进一步地,所述获取单元44,具体可以用于启动所述分析进程,通过所述内存映射文件获取所述调用函数的函数信息。
由于在程序运行过程中,不同函数的调用情况有所不同,在函数保护的过程中,如果保护了调用次数过多的函数,会导致程序运行效率低下,如果保护了调用次数过少的僵尸函数,会使得保护后的可执行程序体积过大,本发明实施例通过对调用函数的分析,能够兼顾安全的情况下达到程序体积和效率的平衡,在检查应用程序时候,通过对调用函数进行分析,能够找到潜藏在可执行程序当中的僵尸函数和调用次数特别多的函数,帮助软件开发人员优化编写的应用程序,同时在分析应用程序的过程中找到价值较高的关键函数,从而对关键函数进行加壳保护。
本发明实施例提供的另一种调用函数的分析装置,通过对调用函数的调用情况进行监控,从而帮助软件开发人员找到价值较高的关键函数,发掘程序运行中的核心函数,进而对核心函数进行加壳保护。
所述调用函数的分析装置包括处理器和存储器,上述获取单元31、分析单元32和生成单元33等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。
处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来节省人力,能够实现调用函数的分析,通过性能分析能够兼顾保护后可执行程序的体积和运行效率的平衡。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。
本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有如下方法步骤的程序代码:获取调用函数对应的函数信息,当程序执行至所述调用函数时,根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析,生成调用函数的分析结果。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。存储器是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。
Claims (10)
1.一种调用函数的分析方法,其特征在于,包括:
通过挂起的方式创建分析进程,所述分析进程中包含有预设容量的动态内存;
将预设分析代码载入所述动态内存中;
创建内存映射文件以及统计结果事件,所述内存映射文件中存储有调用函数的函数信息;
获取调用函数对应的函数信息;
当程序执行至所述调用函数时,根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析;
生成调用函数的分析结果;
其中,所述根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析包括:
传递所述分析进程的标识信息,根据所述标识信息加载所述内存映射文件以及统计结果事件;
根据所述内存映射文件将程序执行的起始地址添加至所述预设分析代码中,当所述分析进程执行时跳转至所述程序执行的起始地址;
加载需要注入至所述分析进程的动态链接库,根据所述动态链接库中的监控函数块对所述调用函数进行分析,得到调用函数的调用信息;
将所述调用函数的调用信息实时的保存到内存映射文件当中。
2.根据权利要求1所述的方法,其特征在于,所述根据所述动态链接库中的监控函数块对所述调用函数进行分析,得到调用函数的调用信息包括:
启动所述动态链接库中的函数hook被保护程序的函数块作为监控函数块;
根据所述函数hook被保护程序的函数块监控所述调用函数的调用情况,得到所述调用函数的调用信息。
3.根据权利要求2所述的方法,其特征在于,在所述启动所述动态链接库中的函数hook被保护程序的函数块作为监控函数块之前,所述方法还包括:
根据所述调用函数的函数信息获取所述调用函数的函数类型;
当所述调用函数的函数类型为可直接执行函数时,通过模块句柄载入动态链接库;
当所述调用函数的函数类型为不可直接执行函数时,通过加载模块载入动态链接库。
4.根据权利要求2所述的方法,其特征在于,所述根据所述函数hook被保护程序的函数块监控所述调用函数的调用情况,得到所述调用函数的调用信息包括:
当调用函数被调用时,通过所述函数hook被保护的函数块获取所述调用函数的地址;
根据所述调用函数的地址遍历所述内存映射文件中存储的调用函数的相对虚拟地址;
更新匹配结果相一致的调用函数对应的调用信息,将所述调用信息保存至所述内存映射文件中。
5.根据权利要求1-4中任一项所述的方法,其特征在于,所述获取调用函数的函数信息包括:
启动所述分析进程,通过所述内存映射文件获取所述调用函数的函数信息。
6.一种调用函数的分析装置,其特征在于,包括:
第一创建单元,用于通过挂起的方式创建分析进程,所述分析进程中包含有预设容量的动态内存;
载入单元,用于将预设分析代码载入所述动态内存中;
第二创建单元,用于创建内存映射文件以及统计结果事件,所述内存映射文件中存储有调用函数的函数信息;
获取单元,用于获取调用函数对应的函数信息;
分析单元,用于当程序执行至所述调用函数时,根据预设分析代码对所述函数信息所对应调用函数的调用情况进行分析;
生成单元,用于生成调用函数的分析结果;
其中,所述分析单元包括:
加载模块,用于传递所述分析进程的标识信息,根据所述标识信息加载所述分析进程中的内存映射文件以及统计结果事件;
添加模块,用于根据所述内存映射文件将程序执行的起始地址添加至所述预设分析代码中,当所述分析进程执行时跳转至所述程序执行的起始地址;
分析模块,用于加载需要注入至所述分析进程的动态链接库,根据所述动态链接库中的监控函数块对所述调用函数进行分析,得到调用函数的调用信息;
保存模块,用于将所述调用函数的调用信息实时的保存到内存映射文件当中。
7.根据权利要求6所述的装置,其特征在于,
所述分析模块,具体用于启动所述动态链接库中的函数hook被保护程序的函数块作为监控函数块;
所述分析模块,具体还用于根据所述函数hook被保护程序的函数块监控所述调用函数的调用情况,得到所述调用函数的调用信息。
8.根据权利要求7所述的装置,其特征在于,
所述分析模块,具体还用根据所述调用函数的函数信息获取所述调用函数的函数类型;
所述分析模块,具体还用当所述调用函数的函数类型为可直接执行函数时,通过模块句柄载入动态链接库;
所述分析模块,具体还用当所述调用函数的函数类型为不可直接执行函数时,通过加载模块载入动态链接库。
9.根据权利要求7所述的装置,其特征在于,
所述分析模块,具体还用于当调用函数被调用时,通过所述函数hook被保护的函数块获取所述调用函数的地址;
所述分析模块,具体还用于根据所述调用函数的地址遍历所述内存映射文件中存储的调用函数的相对虚拟地址,得到匹配结果相一致的调用函数对应的调用信息;
所述分析模块,具体还用于更新匹配结果相一致的调用函数对应的调用信息,将所述调用信息保存至所述内存映射文件中。
10.根据权利要求6-9中任一项所述的装置,其特征在于,
所述获取单元,具体用于启动所述分析进程,通过所述内存映射文件获取所述调用函数的函数信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710225618.1A CN107102944B (zh) | 2017-04-07 | 2017-04-07 | 一种调用函数的分析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710225618.1A CN107102944B (zh) | 2017-04-07 | 2017-04-07 | 一种调用函数的分析方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107102944A CN107102944A (zh) | 2017-08-29 |
CN107102944B true CN107102944B (zh) | 2020-01-24 |
Family
ID=59675217
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710225618.1A Active CN107102944B (zh) | 2017-04-07 | 2017-04-07 | 一种调用函数的分析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107102944B (zh) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107480029B (zh) * | 2017-08-02 | 2019-02-15 | 北京深思数盾科技股份有限公司 | 一种函数调用时间的监控方法及装置 |
CN107861807B (zh) * | 2017-11-20 | 2021-06-25 | 北京奇虎科技有限公司 | 程序调用的优化方法及装置 |
CN108549600A (zh) * | 2018-03-29 | 2018-09-18 | 珠海市魅族科技有限公司 | 一种性能分析方法及装置、服务器和可读存储介质 |
CN108959070B (zh) * | 2018-06-13 | 2022-05-10 | 珠海金山网络游戏科技有限公司 | 一种基于代码对象的Python钩子函数方法和装置 |
CN109145590B (zh) * | 2018-07-27 | 2023-04-07 | 平安科技(深圳)有限公司 | 一种函数hook检测方法、检测设备及计算机可读介质 |
CN109918078A (zh) * | 2019-01-23 | 2019-06-21 | 深圳壹账通智能科技有限公司 | 代码依赖管理方法、装置、计算机设备和存储介质 |
CN112148392B (zh) * | 2019-06-27 | 2024-06-11 | 腾讯科技(深圳)有限公司 | 一种函数调用链获取方法、装置及存储介质 |
CN110781060A (zh) * | 2019-09-20 | 2020-02-11 | 平安普惠企业管理有限公司 | 函数监控方法、装置、计算机设备及存储介质 |
CN111752636B (zh) * | 2020-06-23 | 2024-06-18 | 网易传媒科技(北京)有限公司 | 数据抓取方法及装置、电子设备、存储介质 |
CN113485712B (zh) * | 2021-04-23 | 2024-05-07 | 武汉深之度科技有限公司 | 一种内核裁剪方法及计算设备 |
CN113507487B (zh) * | 2021-09-06 | 2021-12-24 | 蜂巢能源科技有限公司 | Can通信安全的检测方法、装置、电子设备及车辆 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101788949A (zh) * | 2010-03-10 | 2010-07-28 | 中兴通讯股份有限公司 | 一种实现嵌入式系统函数监控的方法及装置 |
CN103853603A (zh) * | 2012-12-07 | 2014-06-11 | 腾讯科技(深圳)有限公司 | 一种函数调用关系的获取方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9304748B2 (en) * | 2013-08-07 | 2016-04-05 | Qualcomm Incorporated | Method for controlling inlining in a code generator |
-
2017
- 2017-04-07 CN CN201710225618.1A patent/CN107102944B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101788949A (zh) * | 2010-03-10 | 2010-07-28 | 中兴通讯股份有限公司 | 一种实现嵌入式系统函数监控的方法及装置 |
CN103853603A (zh) * | 2012-12-07 | 2014-06-11 | 腾讯科技(深圳)有限公司 | 一种函数调用关系的获取方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107102944A (zh) | 2017-08-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107102944B (zh) | 一种调用函数的分析方法及装置 | |
CN107480029B (zh) | 一种函数调用时间的监控方法及装置 | |
KR101740604B1 (ko) | 멀웨어 검출을 위한 애플리케이션들의 제네릭 언패킹 | |
US9552285B2 (en) | Micro-execution for software testing | |
US11256817B2 (en) | Tool for generating security policies for containers | |
CN107807839B (zh) | 一种修改虚拟机内存数据的方法、装置及电子设备 | |
CN110569250B (zh) | 一种物联网网元的解析库的管理方法及装置 | |
CN109951494B (zh) | 仿真数据处理方法、装置、仿真设备及存储介质 | |
US20040060043A1 (en) | Method and apparatus for instrumentation ON/OFF | |
CN111800490A (zh) | 获取网络行为数据的方法、装置及终端设备 | |
CN109492181A (zh) | 页面跳转方法、装置、计算机设备和存储介质 | |
CN113448690B (zh) | 监测方法及装置 | |
US10275595B2 (en) | System and method for characterizing malware | |
US9262301B2 (en) | Observability control with observability information file | |
CN114297630A (zh) | 恶意数据的检测方法、装置、存储介质及处理器 | |
US9535713B2 (en) | Manipulating rules for adding new devices | |
CN106682494B (zh) | 一种信息访问方法、装置和设备 | |
US11544092B2 (en) | Model specific register (MSR) instrumentation | |
CN106484375B (zh) | 一种指令块加载方法、软交换设备及系统 | |
CN112559565A (zh) | 一种异常检测方法、系统及装置 | |
CN111381978B (zh) | 一种接入应用程序的方法、存储介质以及智能电视 | |
CN109684846A (zh) | 一种文件提取方法及装置 | |
CN112631949B (zh) | 一种调试方法、装置、计算机设备及存储介质 | |
CN114979236A (zh) | 数据传输方法、装置、存储介质以及电子设备 | |
CN113590360A (zh) | 一种实现函数hook的方法、装置、计算机设备及存储介质 |
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 | ||
CP01 | Change in the name or title of a patent holder |
Address after: 100193 5th floor 510, No. 5 Building, East Yard, No. 10 Wangdong Road, Northwest Haidian District, Beijing Patentee after: Beijing Shendun Technology Co.,Ltd. Address before: 100193 5th floor 510, No. 5 Building, East Yard, No. 10 Wangdong Road, Northwest Haidian District, Beijing Patentee before: BEIJING SENSESHIELD TECHNOLOGY Co.,Ltd. |
|
CP01 | Change in the name or title of a patent holder |