CN113190235A - 一种代码的分析方法、装置、电子终端及存储介质 - Google Patents

一种代码的分析方法、装置、电子终端及存储介质 Download PDF

Info

Publication number
CN113190235A
CN113190235A CN202110584754.6A CN202110584754A CN113190235A CN 113190235 A CN113190235 A CN 113190235A CN 202110584754 A CN202110584754 A CN 202110584754A CN 113190235 A CN113190235 A CN 113190235A
Authority
CN
China
Prior art keywords
function
root
target
name
linked list
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
CN202110584754.6A
Other languages
English (en)
Other versions
CN113190235B (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.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu 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 Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN202110584754.6A priority Critical patent/CN113190235B/zh
Publication of CN113190235A publication Critical patent/CN113190235A/zh
Application granted granted Critical
Publication of CN113190235B publication Critical patent/CN113190235B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明实施例公开了一种代码的分析方法、装置、电子终端及存储介质,该方法包括:获取汇编代码的目标函数链表对象;目标函数链表对象中包含与根函数对应的函数信息对象;对根函数设置第一钩子函数;基于接收的目标功能的触发指令运行汇编代码,并于运行结束时,根据第一钩子函数的回调结果,确定热点函数信息对象;确定与热点函数信息对象对应的热点根函数,将热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对目标子函数设置第二钩子函数;再次基于触发指令运行汇编代码,并于运行结束时,根据第二钩子函数的回调结果,以及预先生成的目标子函数的引用列表,生成分析结果。从而能够对汇编代码进行自动分析,分析效率高。

Description

一种代码的分析方法、装置、电子终端及存储介质
技术领域
本发明实施例涉及计算机技术,尤其涉及一种代码的分析方法、装置、电子终端及存储介质。
背景技术
现有技术中,存在一些在没有源码的情况下,对汇编代码进行分析的需求。例如,针对第三方模块,在没有其源码的情况下,存在对第三方模块中某个功能对应的程序执行代码的分析需求。因此,亟需一种计算机可执行的方式,对大量汇编的机器代码进行自动分析,以提高分析效率。
发明内容
有鉴于此,本发明实施例提供了一种代码的分析方法、装置、电子终端及存储介质,能够对汇编代码进行自动分析,分析效率高。
第一方面,本发明实施例提供了一种代码的分析方法,包括:
获取汇编代码的目标函数链表对象;其中所述目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,与所述汇编代码对应的源码中,调用除本函数外其他函数的函数;其中,所述函数信息对象中包含所述根函数的函数名称;
获取所述目标函数链表对象中函数信息对象的函数名称,并对与所述函数名称对应的根函数,设置第一钩子函数;
接收目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象;
确定与所述热点函数信息对象的函数名称对应的热点根函数,将所述热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对所述目标子函数设置第二钩子函数;
再次接收所述目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果;其中,所述引用列表根据引用所述目标子函数的函数生成。
第二方面,本发明实施例还提供了一种代码的分析装置,包括:
链表对象获取模块,用于获取汇编代码的目标函数链表对象;其中所述目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,与所述汇编代码对应的源码中,调用除本函数外其他函数的函数;其中,所述函数信息对象中包含所述根函数的函数名称;
钩子函数设置模块,用于获取所述目标函数链表对象中函数信息对象的函数名称,并对与所述函数名称对应的根函数,设置第一钩子函数;
热点对象确定模块,用于接收目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象;
所述钩子函数设置模块,还用于确定与所述热点函数信息对象的函数名称对应的热点根函数,将所述热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对所述目标子函数设置第二钩子函数;
结果生成模块,用于再次接收所述目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果;其中,所述引用列表根据引用所述目标子函数的函数生成。
第三方面,本发明实施例还提供了一种电子终端,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如本申请任意实施例提供的代码的分析方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如本申请任意实施例提供的代码的分析方法。
本发明实施例提供的一种代码的分析方法、装置、电子终端及存储介质,该代码的分析方法包括:获取汇编代码的目标函数链表对象;其中目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,汇编代码中调用除本函数外其他函数的函数;其中,函数信息对象中包含根函数的函数名称;获取目标函数链表对象中函数信息对象的函数名称,并对与函数名称对应的根函数,设置第一钩子函数;接收目标功能的触发指令,基于触发指令运行汇编代码,并于汇编代码运行结束时,根据第一钩子函数的回调结果,从函数信息对象中,确定热点函数信息对象;确定与热点函数信息对象的函数名称对应的热点根函数,将热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对目标子函数设置第二钩子函数;再次接收目标功能的触发指令,基于触发指令运行汇编代码,并于汇编代码运行结束时,根据第二钩子函数的回调结果,以及预先生成的目标子函数的引用列表,生成分析结果;其中,引用列表根据引用目标子函数的函数生成。
通过对汇编代码中根函数进行第一次hook,能够确定执行与目标功能对应代码过程中根函数的调用情况,从而确定出与目标功能对应的热点根函数。通过对热点根函数中目标子函数进行第二次hook,能够进一步确定执行与目标功能对应代码过程中目标子函数的调用情况,进而可综合预先生成的目标子函数的引用列表,分析得到汇编代码在执行与目标功能对应代码过程中的函数调用情况。从而能够实现对汇编代码实现目标功能时所调用的函数进行自动分析,分析效率高。
此外,通过首先对根函数进行第一次hook,再对热点根函数中目标子函数进行第二次hook,而非对全部函数进行同时hook,能够减少函数钩挂数量,从而可以保证代码的正常运行,避免代码性能下降。并且,在进行第二次hook时,通过对非循环调用的子函数进行hook,而非对循环调用的子函数也进行hook,能够避免由于循环调用的子函数被调用次数太多,而导致性能下降的情况,进一步保证了代码运行性能。
附图说明
图1是本发明实施例一提供的一种代码的分析方法的流程示意图;
图2是本发明实施例二提供的一种代码的分析方法中目标函数链表对象的获取步骤的流程示意图;
图3是本发明实施例二提供的一种代码的分析方法中第一函数链表对象的过滤步骤的流程示意图;
图4是本发明实施例三提供的一种代码的分析方法中引用列表的预先生成步骤的流程示意图;
图5是本发明实施例四提供的一种代码的分析装置的结构示意图;
图6是本发明实施例五提供的一种电子终端的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,以下降参照本发明实施例中的附图,通过实施方式清楚、完整地描述本发明的技术方案,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。下述各实施例中,每个实施例中同时提供了可选特征和示例,实施例中记载的各个特征可进行组合,形成多个可选方案,不应将每个编号的实施例仅视为一个技术方案。
实施例一
图1为本发明实施例一提供的一种代码的分析方法的流程示意图。本实施例可适用于对汇编代码进行分析的情况,例如适用于在没有源码时,对汇编代码实现某功能过程中所调用的函数进行自动分析的情况。该方法可以由本发明实施例提供的代码的分析装置来执行,该装置采用软件和/或硬件的方式实现,优选是配置于安装有代码的分析功能的软件的电子终端中,例如计算机中。
参见图1,本实施例提供的代码的分析方法,可包括如下步骤:
S110、获取汇编代码的目标函数链表对象;其中所述目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,与所述汇编代码对应的源码中,调用除本函数外其他函数的函数;其中,所述函数信息对象中包含所述根函数的函数名称。
本发明实施例中,执行本实施提供的分析方法的分析装置,可以是基于交互式反汇编器(Interactive Disassembler,IDA),或者交互式反汇编器专业版(InteractiveDisassembler Professional,IDA Pro)提供的开源脚本程序基础上,进行开发得到的。
其中,汇编代码可以认为是,源代码(或称源码)经编译后得到的机器指令(或称机器代码);其中,汇编代码例如可以为第三方模块的汇编代码。在没有第三方模块的源码情况下,可以通过执行本实施例提供的代码的分析方法,分析出汇编代码实现各功能时函数的调用情况。例如,分析出第三方模块的某个功能的程序执行代码的位置,即实现该功能需要调用的函数,以及调用的函数之间的调用链关系(即调用顺序)等。通过得到各功能对应函数的调用情况,有利于分析功能实现原理,可协助实现在第三方模块基础上进行业务功能扩展等操作。
链表对象可以认为是,由指针链接n个结点组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构。相应的,本实施例中的目标函数链表对象,可以认为是,存储与根函数对应的函数信息对象的链表对象。
其中,在执行本实施例提供的分析方法之前,可以预先对源码中的根函数进行识别。其中,根函数可以认为是与汇编代码对应的源码中,可以调用除本函数之外其他函数的函数。示例性的,假设与汇编代码对应的源码中包括函数A,且函数A可以调用源码中的函数B,那么可以认为函数A包含函数B,即可以用树形图的根节点表示函数A,将叶节点表示函数B。此时,可以将函数A称为根函数。通过识别函数之间的包含关系,可以确定出源码中的各根函数,从而为对根函数进行第一次hook奠定基础。
S120、获取所述目标函数链表对象中函数信息对象的函数名称,并对与所述函数名称对应的根函数,设置第一钩子函数。
本发明实施例中,对根函数设置第一钩子函数,即对根函数进行hook。其中,对根函数进行hook的过程,主要可以包括:首先,根据根函数的函数名称获取根函数的地址;接着,将该地址设置为可读可写的属性;然后,申请一段内存空间,用于保存将要hook的函数的内容;最后,根据根函数的地址,申请的内存空间,对与根函数对应的汇编代码进行修改和保存,从而完成对根函数的hook。其中,可以利用现有的其他hook方式对根函数进行hook,在此不做穷举。
通过从根函数开始进行第一次hook,而非对全部函数进行hook,能够减少对函数hook的数量,从而可以提升程序的性能,不至于因为hook了太多函数而导致程序太卡、性能降低。
S130、接收目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象。
本发明实施例中,目标功能可以认为是,通过执行汇编代码所能实现的各功能中,当前正在分析的任意一个功能。其中,可以通过用户界面接收用户输入的目标功能的触发指令,例如接收用户对用户界面中某功能入口的触发指令等。相应的,汇编代码可以根据目标功能的触发指令,执行可实现目标功能的部分函数。
在汇编代码运行结束时,由于一些根函数被调用了,一些根函数未被调用,根据第一钩子函数返回的各根函数的回调结果,可以确定被调用的根函数。进而,根据被调用的根函数的函数信息,可以确定热点函数信息对象。
在一些可选的实施方式中,根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象,包括:根据所述第一钩子函数返回的根函数的第一函数名称,和与所述第一函数名称对应的调用次数,从所述函数信息对象中,确定热点函数信息对象。
其中,第一钩子函数的回调结果可以包括但不限于,各根函数的函数名称,以及各根函数的调用次数,即第一函数名称和与第一函数名称对应的调用次数。相应的,根据第一函数名称和第一函数名称对应的调用次数,可以确定被调用的根函数的函数名称。从而,可以将函数信息对象中,包含该函数名称的函数信息对象,作为热点函数信息对象。此外,第一钩子的回调结果,例如还可以包括根函数的函数地址,且该函数地址可以与第一函数名称一同确定被调用的根函数。
在这些可选的实施方式中,在触发目标功能后,可通过hook根函数,打印出各根函数的函数名称、地址以及调用次数等回调信息。而如果一些根函数被调用并且打印了包含回调信息的日志,那么可以认为这些根函数是目标功能的热点根函数,而其他函数可以先忽略。进而,通过只对热点根函数进一步分析,可以节省分析时间,提高分析效率。
S140、确定与所述热点函数信息对象的函数名称对应的热点根函数,将所述热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对所述目标子函数设置第二钩子函数。
本发明实施例中,热点函数信息对象中函数名称对应的根函数,即为热点根函数。在确定热点根函数后,可进一步对热点根函数中的子函数进行hook,以细致分析为实现目标功能,各子函数的调用情况。
其中,在执行本实施例提供的分析方法之前,在识别到函数之间的包含关系之后,还可以对根函数与子函数之间是否为循环调用关系进行识别。相应的,在执行分析方法过程中,对热点根函数中的子函数进行hook时,可以对非循环调用的子函数进行hook,可以减少hook次数,从而保证程序性能。其中,对子函数进行hook的过程可参考上文,在此不做赘述。
示例性的,假设根函数A与子函数B为循环调用关系,那么根函数A在循环中每次都会调用子函数B。对于这种情况,如果对子函数B进行了hook,那么容易出现由于其调用次数太多导致程序性能下降的情况。
S150、再次接收所述目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果;其中,所述引用列表根据引用所述目标子函数的函数生成。
其中,函数的引用列表中可以包含,引用该函数的函数(可称为引用函数)的函数信息,例如包含引用函数的函数名称、函数地址等信息。在在执行本实施例提供的分析方法之前,可以预先生成每个函数的引用列表。相应的,在确定目标子函数后,可以从预先生成的引用列表中,查找目标子函数的引用列表。
本发明实施例中,对实现目标功能的部分汇编代码再次运行,运行结束后,由于根函数中的一些子函数被调用了,一些子函数未被调用,根据第二钩子函数返回的各子函数的回调结果,可以确定被调用的目标子函数。进而,根据目标子函数的被调用情况,以及预先生成的目标子函数的引用列表,能够生成分析结果,即分析出汇编代码实现各功能时函数的调用情况。
在一些可选的实施方式中,根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果,包括:根据所述第二钩子函数返回的目标子函数的第二函数名称、与所述第二函数名称对应的调用次数,以及所述引用列表中对所述目标子函数进行引用的引用函数,生成所述汇编代码基于所述触发指令运行过程中,根函数间的调用顺序,以及各根函数内目标子函数的调用顺序。
其中,第二钩子函数的回调结果可以包括但不限于,各目标子函数的函数名称,以及各目标子函数的调用次数,即第二函数名称和与第二函数名称对应的调用次数。相应的,根据第二函数名称和第二函数名称对应的调用次数,以及目标子函数的引用列表,可以生成实现目标功能,所需要的根函数内各目标子函数的调用链、以及根函数内部的目标子函数和其他根函数直之间的调用链。
在这些可选的实施方式中,通过确定根函数间的调用顺序,以及各根函数内目标子函数的调用顺序,可以帮助用户了解实现目标功能的的关键函数和调用逻辑,可协助用户实现在第三方模块基础上进行业务功能扩展等操作。
本发明实施例提供的一种代码的分析方法,获取汇编代码的目标函数链表对象;其中目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,汇编代码中调用除本函数外其他函数的函数;其中,函数信息对象中包含根函数的函数名称;获取目标函数链表对象中函数信息对象的函数名称,并对与函数名称对应的根函数,设置第一钩子函数;接收目标功能的触发指令,基于触发指令运行汇编代码,并于汇编代码运行结束时,根据第一钩子函数的回调结果,从函数信息对象中,确定热点函数信息对象;确定与热点函数信息对象的函数名称对应的热点根函数,将热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对目标子函数设置第二钩子函数;再次接收目标功能的触发指令,基于触发指令运行汇编代码,并于汇编代码运行结束时,根据第二钩子函数的回调结果,以及预先生成的目标子函数的引用列表,生成分析结果;其中,引用列表根据引用目标子函数的函数生成。
通过对汇编代码中根函数进行第一次hook,能够确定执行与目标功能对应代码过程中根函数的调用情况,从而确定出与目标功能对应的热点根函数。通过对热点根函数中目标子函数进行第二次hook,能够进一步确定执行与目标功能对应代码过程中目标子函数的调用情况,进而可综合预先生成的目标子函数的引用列表,分析得到汇编代码在执行与目标功能对应代码过程中的函数调用情况。从而能够实现对汇编代码实现目标功能时所调用的函数进行自动分析,分析效率高。
此外,通过首先对根函数进行第一次hook,再对热点根函数中目标子函数进行第二次hook,而非对全部函数进行同时hook,能够减少函数钩挂数量,从而可以保证代码的正常运行,避免代码性能下降。并且,在进行第二次hook时,通过对非循环调用的子函数进行hook,而非对循环调用的子函数也进行hook,能够避免由于循环调用的子函数被调用次数太多,而导致性能下降的情况,进一步保证了代码运行性能。
实施例二
本实施例提供的代码的分析方法,能够与上述实施例中所提供的代码的分析方法中各个可选方案相结合。本实施例提供的生代码的分析方法,对获取汇编代码的目标函数链表对象的步骤进行了详细描述。通过首先获取汇编代码的函数列表;接着将函数列表中各函数的函数信息保存至预设文件;然后将函数信息从预设文件进行内部存储,得到内存的第一函数链表对象;最后可对第一函数链表对象进行过滤,能够实现获取到与汇编代码对应的目标函数链表对象,为对汇编代码中根函数进行hook奠定基础。
图2是本发明实施例二提供的一种代码的分析方法中目标函数链表对象的获取步骤的流程示意图。参见图2,本实施例提供的代码的分析方法中目标函数链表对象的获取步骤,可以包括:
S210、获取汇编代码的函数列表,遍历所述函数列表,获取所述函数列表中各函数的函数信息,将所述函数信息存储至预设文件中;其中,所述函数信息包含函数名称;其中,所述预设文件中每行保存一个函数的函数信息。
本实施例中,汇编代码的函数列表,可以认为是由与汇编代码对应的源码中所有函数生成的列表。可以通过调用IDA Pro提供脚本功能,来获取函数列表。具体可以为,利用funcs=Functions()语句来得到函数列表,其中Functions()为从源码中识别函数对应的代码的语句;且识别到函数对应的代码后,将函数添加至变量funcs。当源码识别完毕时,即可获取到汇编代码的函数列表funcs。
其中,遍历函数列表,获取函数列表中各函数的函数信息,可以包括:
首先,可以利用for循环语句对函数列表funcs进行遍历。具体可以为,利用for itin funcs语句对funcs进行遍历,其中it可以认为是funcs中当前正在遍历的函数。
然后,可以利用get语句获取当前正在遍历的函数的函数信息。具体可以为,利用name=GetFunctionName(it)语句对当前正在遍历的函数it的函数名称进行获取;利用Addr=GetFunctionAddr(it)语句对当前正在遍历的函数it的相对地址偏移进行获取;利用Len=GetFunctionLength(it)语句对当前正在遍历的函数it的汇编代码指令长度进行获取。此外,还可以对其他函数信息进行获取,在此不做穷举。
在得到每个函数的函数信息后,可以将其函数信息保存到一个预设文件中。并且,预设文件可以是以每一个函数作为一行进行保存。示例性的,可以按下述模式进行保存:
Name1 addr1 Len1;
Name2 addr2 Len2。
S220、逐行读取所述预设文件,根据每行的函数信息创建函数信息对象,并将所述函数信息对象存储至第一函数链表对象中。
本实施例中,通过逐行读取预设文件的文件内容,可以一次性获取一个函数对应的函数信息,从而可以根据每行的函数信息,创建与一个函数对应的函数信息对象。其中,将函数信息从预设文件转移到函数信息对象的过程,可以看成将函数信息存储至分析装置内存的过程,有利于分析装置根据内部存储的函数信息对象进行汇编代码分析。
其中,逐行读取预设文件,根据每行的函数信息创建函数信息对象,并将函数信息对象存储至第一函数链表对象中,具体实现可以如下:
首先,可利用ifstream readfile语句来定义一个读取文件的文件流变量readfile。其次,可利用readfile.open("name",ios::binary)语句来调用打开操作以打开预设文件,其中“name”可以认为是预设文件的名称。再次,可利用string line语句来定义存储读取的内容。接着可利用while(getline(readfile,line)){}循环来逐行读取预设文件内容,直到读取到最后一行停止;其中,系统函数getline表示读取一行内容。
在将函数信息对象存储至第一函数链表对象之前,可以利用struct FuncInfo{}语句来定义一个结构体;其中,struct为结构体的关键字,FuncInfo可以表示函数信息对象的名称。其中,结构体内部可以至少定义有字符串格式的函数名称String name、长整型变量格式的函数地址Long address和长整型变量格式的函数的汇编指令长度Long length。可以认为,结构对象中包含的属性,与预设文件中每行所包含的函数信息一一对应。相应的,在利用while语句循环读取预设文件过程中,每次读取一行内容,可以将读取内容赋值给结构体内上述的属性,以创建一个函数信息对象FuncInfo。
并且,在将函数信息对象存储至第一函数链表对象之前,还可以利用List<FuncInfo>listFuncInfo语句来定义一个链表对象,即第一函数链表对象;其中List为链表对象的关键字,listFuncInfo为第一函数链表对象的名称;FuncInfo为第一函数链表对象中存储的内容。相应的,在利用while语句循环读取预设文件过程中,每创建一个函数信息对象FuncInfo,可以利用listFuncInfo.push_back(it)语句,将其存储到第一函数链表对象listFuncInfo中。
S230、对所述第一函数链表对象中的函数信息对象进行过滤,得到包含与根函数对应的函数信息对象的目标函数链表对象。
本实施例中,由于在没有源码的情况下,通过工具IDA Pro来辅助生成的函数信息对象,而其和源码是不一样的。在源码中,可以在任意函数中增加日志信息等;而本文针对的是编译器编译的最终在CPU中执行的机器指令,同时对于第三方发布的程序来说,汇编代码为将汇编指令经过编译器进行优化后的最终代码。因此,后续在进行第一函数链表对象中函数信息对应的函数hook时,需要对其中的函数进行一定的过滤,否则会在执行时则会因为hook的原因而导致程序崩溃。
进一步的,本实施例提供的生代码的分析方法,还对第一函数链表对象的过滤步骤进行了详细描述。示例性的,图3是本发明实施例二提供的一种代码的分析方法中第一函数链表对象的过滤步骤的流程示意图。参见图3,本实施例提供的代码的分析方法中第一函数链表对象的过滤步骤,可以包括:
S310、将所述第一函数链表对象中,函数信息对象包含的指令长度小于预设长度的函数信息对象进行过滤,得到第二函数链表对象。
其中,对第一函数链表对象进行过滤的法则可以至少包括:根据函数大小过滤、根据当前函数头的汇编指令是否为跳转指令过滤,以及根据函数包含关系进行筛选。
其中,根据函数大小,来过滤第一函数链表对象中的函数信息对象,其原理可以包括:
由于函数hook是通过内联hook来实现的,其原理是通过修改源码为一个jump指令来进行跳转,且jump指令本身的汇编指令长度为5个字节。在此基础上,若第一函数链表对象中,存在一些本身长度小于5个字节的函数,则对于这种偏小的函数,可以不进行hook。因此,可以判断函数信息对象包含的指令长度是否小于5个字节,若是则可以将该函数信息对象进行过滤。
其中,可以通过List<FuncInfo>listFuncInfo2预先定义另一个链表对象listFuncInfo2,并可以将过滤掉的函数信息对象保存到该链表对象中,以进行备份。并且,可以将根据函数大小过滤完毕后的第一函数链表对象,称为第二函数链表对象。
S320、将所述第二函数链表对象中,与函数信息对象的函数名称对应的函数的函数头,为跳转指令的函数信息对象进行过滤,得到第三函数链表对象。
其中,根据当前函数头的汇编指令是否为跳转指令,过滤第二函数链表对象中的函数信息对象,其原理可以包括:
当函数的函数头本身就是一个跳转指令时,那么对于此函数的hook,实质上是对跳转指令跳转至的函数的hook。因此,可以将函数的函数头为跳转指令的函数信息对象进行过滤,从而可以避免对跳转至的函数进行多次hook,可以在一定程度上保证代码运行性能。
其中,可以通过List<FuncInfo>listFuncInfo3预先定义又一个链表对象listFuncInfo3,并可以将过滤掉的函数信息对象保存到该链表对象中,以进行备份。此外,在将函数信息对象保存至listFuncInfo3时,还可以关联上与跳转指令对应函数的函数信息,例如关联上跳转至对应函数的函数地址等信息,以作备用。并且,可以将当前函数头过滤完毕后的第二函数链表对象,称为第三函数链表对象。
S330、将所述第三函数链表对象中,与函数信息对象的函数名称对应的函数为根函数的函数信息对象进行保留,得到目标函数链表对象。
其中,根据函数包含关系进行筛选,其原理可以包括:
出于代码运行性能上的考虑,如果刚开始就对所有函数进行hook,那么在进行热点函数探测时,容易导致整个程序的性能降低,从而不利于发现需要重点关注的热点函数。因此,可以根据函数之间的包含关系确定各根函数,并可以筛选出根函数对应的函数信息对象,并对非根函数的其他函数的函数信息对象进行过滤,得到目标函数链表对象。从而,可以极大的提升分析的效率,也可以避免由于根函数调用太多子函数而分散了热点函数的注意力。
通过基于指令长度、函数的函数头以及函数是否为根函数,对第一函数链表对象进行过滤,能够更加准确地确定除第一次需要进行hook的根函数,从而可以进一步减少函数钩挂数量,进一步可以保证代码的正常运行,避免代码性能下降。
本发明实施例提供的代码的分析方法,对获取汇编代码的目标函数链表对象的步骤进行了详细描述。通过首先获取汇编代码的函数列表;接着将函数列表中各函数的函数信息保存至预设文件;然后将函数信息从预设文件进行内部存储,得到内存的第一函数链表对象;最后可对第一函数链表对象进行过滤,能够实现获取到与汇编代码对应的目标函数链表对象,为对汇编代码中根函数进行hook奠定基础。此外,本实施例提供的代码的分析方法与上述实施例提供的代码的分析方法属于同一技术构思,未在本实施例中详尽描述的技术细节可参见上述实施例,并且相同的技术特征在本实施例与上述实施例中具有相同的有益效果。
实施例三
本实施例提供的代码的分析方法,能够与上述实施例中所提供的代码的分析方法中各个可选方案相结合。本实施例提供的生代码的分析方法,对引用列表的预先生成步骤进行了详细描述。通过首先获取汇编代码中各段的段信息;接着在段信息的段名称中包含函数名称时,获取与包含的函数名称对应的函数的偏移地址;最后可遍历对偏移地址进行引用的引用函数,得到与包含的函数名称对应的函数的引用列表,从而能够实现对各函数的引用列表的确定,为生成分析结果奠定基础。
图4是本发明实施例三提供的一种代码的分析方法中引用列表的预先生成步骤的流程示意图。参见图4,本实施例提供的代码的分析方法中引用列表的预先生成步骤,可以包括:
S410、遍历所述待分析汇编代码,获取所述待分析汇编代码中各段的段信息。
本实施例中,遍历待分析汇编代码,获取待分析汇编代码中各段的段信息的过程,可以包括:首先,可以通过get_segm_qty()语句,获取与汇编代码对应的源码的总段数。然后,可以通过for语句循环遍历得到短信息;例如可以利用for(int i=0;i<get_segm_qty();++i){}遍历每段代码,其中遍历过程可以是从0到总段数,逐段遍历。
并且,在利用for语句遍历每段代码过程中,可以利用segment_t*curSeg=getnseg(s)语句获取段信息;其中,s为当前遍历的段,getnseg()为获取段信息的语句,并且获取段信息后可赋值到curSeg变量中去。
S420、根据所述段信息获取段名称,并于所述段名称中包含函数名称时,获取与包含的函数名称对应的函数的偏移地址。
在利用for语句遍历每段代码过程中,每次获取到段信息,可以利用get_segm_name(&segmName,curSeg)语句来获得段名称;其中curSeg为段信息,get_segm_name()为获取段信息中段名称的语句,&segmName为将段信息中的段名称进行赋值的变量。
其中,当segmName中包含函数关键字function时,可以认为,段名称中包含函数名称。此时,在确定函数名之后,可以通过利用Addr=GetFunctionAddr(name)的语句,确定与包含的函数名称对应的函数的偏移地址。
S430、遍历对所述偏移地址进行引用的引用函数,得到与包含的函数名称对应的函数的引用列表。
本实施例中,遍历对偏移地址进行引用的引用函数,得到与包含的函数名称对应的函数的引用列表的过程,可以包括:
首先,定义一个引用列表的对象xrefblk_t xb。接着,可以利用下述语句遍历对函数Addr有引用的函数:for(bool ok=xb.first_from(Addr,XREF_ALL);ok;ok=xb.next_from()){};其中,xb可以表示对函数Addr有引用的函数(即引用函数);其中,xb.first_from可以表示第一个引用函数,xb.next_from()可以表示下一个引用函数。然后,在确定了对函数Addr有引用的函数后,还可以通过xb.to确定引用函数的函数地址。最后,可以根据引用函数的函数地址等信息,生成与包含的函数名称对应的函数的引用列表。
本发明实施例提供的代码的分析方法,对引用列表的预先生成步骤进行了详细描述。通过首先获取汇编代码中各段的段信息;接着在段信息的段名称中包含函数名称时,获取与包含的函数名称对应的函数的偏移地址;最后可遍历对偏移地址进行引用的引用函数,得到与包含的函数名称对应的函数的引用列表,从而能够实现对各函数的引用列表的确定,为生成分析结果奠定基础。此外,本实施例提供的代码的分析方法与上述实施例提供的代码的分析方法属于同一技术构思,未在本实施例中详尽描述的技术细节可参见上述实施例,并且相同的技术特征在本实施例与上述实施例中具有相同的有益效果。
实施例四
图5是本发明实施例四提供的一种代码的分析装置的结构示意图。本实施例可适用于对汇编代码进行分析的情况,例如适用于在没有源码时,对汇编代码实现某功能过程中所调用的函数进行自动分析的情况。
参见图5,本发明提供的代码的分析装置,包括:
链表对象获取模块510,用于获取汇编代码的目标函数链表对象;其中所述目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,与所述汇编代码对应的源码中,调用除本函数外其他函数的函数;其中,所述函数信息对象中包含所述根函数的函数名称;
钩子函数设置模块520,用于获取所述目标函数链表对象中函数信息对象的函数名称,并对与所述函数名称对应的根函数,设置第一钩子函数;
热点对象确定模块530,用于接收目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象;
所述钩子函数设置模块520,还用于确定与所述热点函数信息对象的函数名称对应的热点根函数,将所述热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对所述目标子函数设置第二钩子函数;
结果生成模块540,用于再次接收所述目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果;其中,所述引用列表根据引用所述目标子函数的函数生成。
在一些可选的实现方式中,链表对象获取模块,包括:
预设文件生成单元,用于获取汇编代码的函数列表,遍历所述函数列表,获取所述函数列表中各函数的函数信息,将所述函数信息存储至预设文件中;其中,所述函数信息包含函数名称;其中,所述预设文件中每行保存一个函数的函数信息;
第一函数链表对象生成单元,用于逐行读取所述预设文件,根据每行的函数信息创建函数信息对象,并将所述函数信息对象存储至第一函数链表对象中;
目标函数链表对象生成单元,用于对所述第一函数链表对象中的函数信息对象进行过滤,得到包含与根函数对应的函数信息对象的目标函数链表对象。
在一些可选的实现方式中,目标函数链表对象生成单元,具体用于:
将所述第一函数链表对象中,函数信息对象包含的指令长度小于预设长度的函数信息对象进行过滤,得到第二函数链表对象;将所述第二函数链表对象中,与函数信息对象的函数名称对应的函数的函数头,为跳转指令的函数信息对象进行过滤,得到第三函数链表对象;将所述第三函数链表对象中,与函数信息对象的函数名称对应的函数为根函数的函数信息对象进行保留,得到目标函数链表对象。
在一些可选的实现方式中,代码的分析装置,还可以包括:
引用列表生成模块,用于遍历所述待分析汇编代码,获取所述待分析汇编代码中各段的段信息;根据所述段信息获取段名称,并于所述段名称中包含函数名称时,获取与包含的函数名称对应的函数的偏移地址;遍历对所述偏移地址进行引用的引用函数,得到与包含的函数名称对应的函数的引用列表。
在一些可选的实现方式中,热点对象确定模块,可具体用于:
根据所述第一钩子函数返回的根函数的第一函数名称,和与所述第一函数名称对应的调用次数,从所述函数信息对象中,确定热点函数信息对象。
在一些可选的实现方式中,结果生成模块,可具体用于:
根据所述第二钩子函数返回的目标子函数的第二函数名称、与所述第二函数名称对应的调用次数,以及所述引用列表中对所述目标子函数进行引用的引用函数,生成所述汇编代码基于所述触发指令运行过程中,根函数间的调用顺序,以及各根函数内目标子函数的调用顺序。
在一些可选的实现方式中,所述汇编代码为第三方模块的汇编代码。
本发明实施例所提供的代码的分析装置可执行本发明实施例所提供的代码的分析方法,具备执行方法相应的功能模块和有益效果。未详尽描述的技术细节,可参见本发明实施例所提供的代码的分析方法。
实施例五
图6是本发明实施例五提供的一种电子终端的结构示意图。图6示出了适于用来实现本发明实施方式的示例性电子终端12的框图。图6显示的电子终端12仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。设备12典型的是承担代码的分析功能的电子终端。
如图6所示,电子终端12以通用计算设备的形式表现。电子终端12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,存储器28,连接不同组件(包括存储器28和处理单元16)的总线18。
总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(Industry StandardArchitecture,ISA)总线,微通道体系结构(Micro Channel Architecture,MCA)总线,增强型ISA总线、视频电子标准协会(Video Electronics Standards Association,VESA)局域总线以及外围组件互连(Peripheral Component Interconnect,PCI)总线。
电子终端12典型地包括多种计算机可读介质。这些介质可以是任何能够被电子终端12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
存储器28可以包括易失性存储器形式的计算机装置可读介质,例如随机存取存储器(Random Access Memory,RAM)30和/或高速缓存存储器32。电子终端12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图6未显示,通常称为“硬盘驱动器”)。尽管图6中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如只读光盘(Compact Disc-Read Only Memory,CD-ROM)、数字视盘(Digital Video Disc-Read Only Memory,DVD-ROM)或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品40,该程序产品40具有一组程序模块42,这些程序模块被配置以执行本发明各实施例的功能。程序产品40,可以存储在例如存储器28中,这样的程序模块42包括但不限于一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施例中的功能和/或方法。
电子终端12也可以与一个或多个外部设备14(例如键盘、鼠标、摄像头等和显示器)通信,还可与一个或者多个使得用户能与该电子终端12交互的设备通信,和/或与使得该电子终端12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,电子终端12还可以通过网络适配器20与一个或者多个网络(例如局域网(Local Area Network,LAN),广域网WideArea Network,WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与电子终端12的其它模块通信。应当明白,尽管图中未示出,可以结合电子终端12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、磁盘阵列(Redundant Arrays of Independent Disks,RAID)装置、磁带驱动器以及数据备份存储装置等。
处理器16通过运行存储在存储器28中的程序,从而执行各种功能应用以及数据处理,例如实现本发明上述实施例所提供的代码的分析方法,包括:
获取汇编代码的目标函数链表对象;其中所述目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,与所述汇编代码对应的源码中,调用除本函数外其他函数的函数;其中,所述函数信息对象中包含所述根函数的函数名称;
获取所述目标函数链表对象中函数信息对象的函数名称,并对与所述函数名称对应的根函数,设置第一钩子函数;
接收目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象;
确定与所述热点函数信息对象的函数名称对应的热点根函数,将所述热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对所述目标子函数设置第二钩子函数;
再次接收所述目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果;其中,所述引用列表根据引用所述目标子函数的函数生成。
当然,本领域技术人员可以理解,处理器还可以实现本发明实施例所提供的代码的分析方法的技术方案。
实施例六
本发明实施例六还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明实施例所提供的代码的分析方法,该方法包括:
获取汇编代码的目标函数链表对象;其中所述目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,与所述汇编代码对应的源码中,调用除本函数外其他函数的函数;其中,所述函数信息对象中包含所述根函数的函数名称;
获取所述目标函数链表对象中函数信息对象的函数名称,并对与所述函数名称对应的根函数,设置第一钩子函数;
接收目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象;
确定与所述热点函数信息对象的函数名称对应的热点根函数,将所述热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对所述目标子函数设置第二钩子函数;
再次接收所述目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果;其中,所述引用列表根据引用所述目标子函数的函数生成。
当然,本发明实施例所提供的一种计算机可读存储介质,其上存储的计算机程序不限于如上的方法操作,还可以执行本发明实施例所提供的代码的分析方法。
本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的装置、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行装置、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行装置、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

Claims (10)

1.一种代码的分析方法,其特征在于,包括:
获取汇编代码的目标函数链表对象;其中所述目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,与所述汇编代码对应的源码中,调用除本函数外其他函数的函数;其中,所述函数信息对象中包含所述根函数的函数名称;
获取所述目标函数链表对象中函数信息对象的函数名称,并对与所述函数名称对应的根函数,设置第一钩子函数;
接收目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象;
确定与所述热点函数信息对象的函数名称对应的热点根函数,将所述热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对所述目标子函数设置第二钩子函数;
再次接收所述目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果;其中,所述引用列表根据引用所述目标子函数的函数生成。
2.根据权利要求1所述的方法,其特征在于,所述获取汇编代码的目标函数链表对象,包括:
获取汇编代码的函数列表,遍历所述函数列表,获取所述函数列表中各函数的函数信息,将所述函数信息存储至预设文件中;其中,所述函数信息包含函数名称;其中,所述预设文件中每行保存一个函数的函数信息;
逐行读取所述预设文件,根据每行的函数信息创建函数信息对象,并将所述函数信息对象存储至第一函数链表对象中;
对所述第一函数链表对象中的函数信息对象进行过滤,得到包含与根函数对应的函数信息对象的目标函数链表对象。
3.根据权利要求2所述的方法,其特征在于,所述对所述第一函数链表对象中的函数信息对象进行过滤,得到包含与根函数对应的函数信息对象的目标函数链表对象,包括:
将所述第一函数链表对象中,函数信息对象包含的指令长度小于预设长度的函数信息对象进行过滤,得到第二函数链表对象;
将所述第二函数链表对象中,与函数信息对象的函数名称对应的函数的函数头,为跳转指令的函数信息对象进行过滤,得到第三函数链表对象;
将所述第三函数链表对象中,与函数信息对象的函数名称对应的函数为根函数的函数信息对象进行保留,得到目标函数链表对象。
4.根据权利要求1所述的方法,其特征在于,所述引用列表基于下述步骤生成:
遍历所述待分析汇编代码,获取所述待分析汇编代码中各段的段信息;
根据所述段信息获取段名称,并于所述段名称中包含函数名称时,获取与包含的函数名称对应的函数的偏移地址;
遍历对所述偏移地址进行引用的引用函数,得到与包含的函数名称对应的函数的引用列表。
5.根据权利要求1所述的方法,其特征在于,所述根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象,包括:
根据所述第一钩子函数返回的根函数的第一函数名称,和与所述第一函数名称对应的调用次数,从所述函数信息对象中,确定热点函数信息对象。
6.根据权利要求1所述的方法,其特征在于,所述根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果,包括:
根据所述第二钩子函数返回的目标子函数的第二函数名称、与所述第二函数名称对应的调用次数,以及所述引用列表中对所述目标子函数进行引用的引用函数,生成所述汇编代码基于所述触发指令运行过程中,根函数间的调用顺序,以及各根函数内目标子函数的调用顺序。
7.根据权利要求1-6任一所述的方法,其特征在于,所述汇编代码为第三方模块的汇编代码。
8.一种代码的分析装置,其特征在于,包括:
链表对象获取模块,用于获取汇编代码的目标函数链表对象;其中所述目标函数链表对象中包含与根函数对应的函数信息对象;其中所述根函数为,与所述汇编代码对应的源码中,调用除本函数外其他函数的函数;其中,所述函数信息对象中包含所述根函数的函数名称;
钩子函数设置模块,用于获取所述目标函数链表对象中函数信息对象的函数名称,并对与所述函数名称对应的根函数,设置第一钩子函数;
热点对象确定模块,用于接收目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第一钩子函数的回调结果,从所述函数信息对象中,确定热点函数信息对象;
所述钩子函数设置模块,还用于确定与所述热点函数信息对象的函数名称对应的热点根函数,将所述热点根函数调用的函数中,非循环调用的函数作为目标子函数,并对所述目标子函数设置第二钩子函数;
结果生成模块,用于再次接收所述目标功能的触发指令,基于所述触发指令运行所述汇编代码,并于所述汇编代码运行结束时,根据所述第二钩子函数的回调结果,以及预先生成的所述目标子函数的引用列表,生成分析结果;其中,所述引用列表根据引用所述目标子函数的函数生成。
9.一种电子终端,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1-7中任一所述的代码的分析方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-7中任一所述的代码的分析方法。
CN202110584754.6A 2021-05-27 2021-05-27 一种代码的分析方法、装置、电子终端及存储介质 Active CN113190235B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110584754.6A CN113190235B (zh) 2021-05-27 2021-05-27 一种代码的分析方法、装置、电子终端及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110584754.6A CN113190235B (zh) 2021-05-27 2021-05-27 一种代码的分析方法、装置、电子终端及存储介质

Publications (2)

Publication Number Publication Date
CN113190235A true CN113190235A (zh) 2021-07-30
CN113190235B CN113190235B (zh) 2022-05-10

Family

ID=76985373

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110584754.6A Active CN113190235B (zh) 2021-05-27 2021-05-27 一种代码的分析方法、装置、电子终端及存储介质

Country Status (1)

Country Link
CN (1) CN113190235B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113886250A (zh) * 2021-09-30 2022-01-04 四川大学 函数调用动态热力图的绘制方法

Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120304160A1 (en) * 2011-05-27 2012-11-29 Ridgeway Internet Security, Llc Systems and Methods for Run-Time Interception of Software Methods
US20130185798A1 (en) * 2012-01-13 2013-07-18 Accessdata Group, Llc Identifying software execution behavior
US20140282431A1 (en) * 2013-03-14 2014-09-18 Riverbed Technology, Inc. Native code profiler framework
CN105550104A (zh) * 2015-12-08 2016-05-04 北京奇虎科技有限公司 应用程序性能测试方法及装置
CN106203120A (zh) * 2016-07-15 2016-12-07 北京邮电大学 一种针对Android加固应用的多点Hook逆向方法
US20170017528A1 (en) * 2014-11-20 2017-01-19 Apptimize, Inc. Enhanced code callback
CN106502876A (zh) * 2016-10-26 2017-03-15 腾讯科技(深圳)有限公司 一种热点函数确定的方法及相关设备
CN106649084A (zh) * 2016-09-14 2017-05-10 腾讯科技(深圳)有限公司 函数调用信息的获取方法及装置、测试设备
CN110347407A (zh) * 2019-07-16 2019-10-18 武汉斗鱼鱼乐网络科技有限公司 一种获取内存占用量的方法、装置、计算机设备及介质
CN110737465A (zh) * 2018-07-20 2020-01-31 武汉斗鱼网络科技有限公司 一种函数调用路径获取的方法和相关装置
CN111913742A (zh) * 2018-07-03 2020-11-10 武汉斗鱼网络科技有限公司 一种程序处理方法及相关设备
CN112347487A (zh) * 2020-11-30 2021-02-09 杭州安恒信息技术股份有限公司 一种mips指令集程序的栈溢出漏洞的调试分析方法
CN112596739A (zh) * 2020-12-17 2021-04-02 北京五八信息技术有限公司 一种数据的处理方法和装置

Patent Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120304160A1 (en) * 2011-05-27 2012-11-29 Ridgeway Internet Security, Llc Systems and Methods for Run-Time Interception of Software Methods
US20130185798A1 (en) * 2012-01-13 2013-07-18 Accessdata Group, Llc Identifying software execution behavior
US20140282431A1 (en) * 2013-03-14 2014-09-18 Riverbed Technology, Inc. Native code profiler framework
US20170017528A1 (en) * 2014-11-20 2017-01-19 Apptimize, Inc. Enhanced code callback
CN105550104A (zh) * 2015-12-08 2016-05-04 北京奇虎科技有限公司 应用程序性能测试方法及装置
CN106203120A (zh) * 2016-07-15 2016-12-07 北京邮电大学 一种针对Android加固应用的多点Hook逆向方法
CN106649084A (zh) * 2016-09-14 2017-05-10 腾讯科技(深圳)有限公司 函数调用信息的获取方法及装置、测试设备
CN106502876A (zh) * 2016-10-26 2017-03-15 腾讯科技(深圳)有限公司 一种热点函数确定的方法及相关设备
CN111913742A (zh) * 2018-07-03 2020-11-10 武汉斗鱼网络科技有限公司 一种程序处理方法及相关设备
CN110737465A (zh) * 2018-07-20 2020-01-31 武汉斗鱼网络科技有限公司 一种函数调用路径获取的方法和相关装置
CN110347407A (zh) * 2019-07-16 2019-10-18 武汉斗鱼鱼乐网络科技有限公司 一种获取内存占用量的方法、装置、计算机设备及介质
CN112347487A (zh) * 2020-11-30 2021-02-09 杭州安恒信息技术股份有限公司 一种mips指令集程序的栈溢出漏洞的调试分析方法
CN112596739A (zh) * 2020-12-17 2021-04-02 北京五八信息技术有限公司 一种数据的处理方法和装置

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
ANTONY EDWARDS: "Runtime verification of authorization hook placement for the linux security modules framework", 《HTTPS://DOI.ORG/10.1145/586110.586141》 *
LONGLONG JIAO: "AIT: A method for operating system kernel function call graph generation with a virtualization technique", 《HTTPS://WWW.KOREASCIENCE.OR.KR/ARTICLE/JAKO202019962560283.PAGE》 *
SEASONINTHESUN: "IDA静态分析与动态分析", 《HTTPS://ZHUANLAN.ZHIHU.COM/P/38983223》 *
YANNICK: "分析没有源代码的编译代码?", 《CN.VOIDCC.COM/QUESTION/P-ZXBPYBMU-BGZ.HTML》 *
李雷: "拓展/Hook一个Python第三方库API的通用方案", 《HTTPS://ZHUANLAN.ZHIHU.COM/P/95702828》 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113886250A (zh) * 2021-09-30 2022-01-04 四川大学 函数调用动态热力图的绘制方法

Also Published As

Publication number Publication date
CN113190235B (zh) 2022-05-10

Similar Documents

Publication Publication Date Title
US7530056B1 (en) Method and system for detecting runtime defects in a program by comparing correct and incorrect runs
US11675575B2 (en) Checking source code validity at time of code update
CN110502227B (zh) 代码补全的方法及装置、存储介质、电子设备
US8677325B2 (en) Application services source refactoring
CN108304175B (zh) 代码文件隔离打包方法及装置
CN107783766B (zh) 对应用程序的文件进行清理的方法和装置
CN110990411B (zh) 数据结构的生成方法及装置、调用方法及装置
CN110990001A (zh) Ivr流程执行方法及装置
CN114077430A (zh) 界面生成方法、装置、电子设备及存储介质
CN112905441A (zh) 测试用例生成方法、测试方法、装置及设备
CN113190235B (zh) 一种代码的分析方法、装置、电子终端及存储介质
US9116714B2 (en) Methods and systems for file processing
CN114003269A (zh) 组件处理方法、装置、电子设备及存储介质
US8769498B2 (en) Warning of register and storage area assignment errors
US10452534B2 (en) Asynchronous operation query
CN111240987B (zh) 移植程序检测方法、装置、电子设备及计算机可读存储介质
CN113821486B (zh) pod库之间依赖关系的确定方法及其装置、电子设备
CN116578282A (zh) 代码生成方法、装置、电子设备及介质
US11947966B2 (en) Identifying computer instructions enclosed by macros and conflicting macros at build time
CN113342431B (zh) 函数调用栈回溯、程序异常处理方法、装置、设备及介质
CN110297639B (zh) 用于检测代码的方法和装置
CN113687880A (zh) 一种调用组件的方法、装置、设备和介质
CN116774988B (zh) 解除框架包模式符号依赖的方法及装置
CN111273944B (zh) 生成程序文件并上传至代码仓库的方法及装置
CN113590088B (zh) 一种自动分析组件使用情况的方法、装置和电子设备

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
EE01 Entry into force of recordation of patent licensing contract

Application publication date: 20210730

Assignee: Yidu Lehuo Network Technology Co.,Ltd.

Assignor: WUHAN DOUYU YULE NETWORK TECHNOLOGY Co.,Ltd.

Contract record no.: X2023980041383

Denomination of invention: A code analysis method, device, electronic terminal, and storage medium

Granted publication date: 20220510

License type: Common License

Record date: 20230908

EE01 Entry into force of recordation of patent licensing contract