CN110516438A - 一种可执行文件反汇编的方法、系统及相关组件 - Google Patents

一种可执行文件反汇编的方法、系统及相关组件 Download PDF

Info

Publication number
CN110516438A
CN110516438A CN201810490322.7A CN201810490322A CN110516438A CN 110516438 A CN110516438 A CN 110516438A CN 201810490322 A CN201810490322 A CN 201810490322A CN 110516438 A CN110516438 A CN 110516438A
Authority
CN
China
Prior art keywords
address
dis
assembling
entry address
instruction
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
CN201810490322.7A
Other languages
English (en)
Other versions
CN110516438B (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.)
Sangfor Technologies Co Ltd
Original Assignee
Sangfor Technologies 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 Sangfor Technologies Co Ltd filed Critical Sangfor Technologies Co Ltd
Priority to CN201810490322.7A priority Critical patent/CN110516438B/zh
Publication of CN110516438A publication Critical patent/CN110516438A/zh
Application granted granted Critical
Publication of CN110516438B publication Critical patent/CN110516438B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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/55Detecting local intrusion or implementing counter-measures
    • G06F21/554Detecting local intrusion or implementing counter-measures involving event detection and direct action
    • 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/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/566Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly

Abstract

本申请公开了一种可执行文件反汇编的方法,包括确定初始入口地址并从初始入口地址执行本次顺序反汇编操作得到顺序流指令序列;当本次顺序反汇编操作以分支指令结束时,判断分支指令是否为jmp指令;若是则将jmp指令指向的地址添加至入口点集合;若否则将顺序流指令序列的下一个地址添加至入口点集合,并判断分支指令的寻址方式是否为直接寻址;若是则将分支指令指向的地址添加至入口点集合;从入口点集合的地址开始执行下一次顺序反汇编操作。本方法能够在有效分离代码和数据的前提下,提高反汇编可执行文件中的覆盖率。本申请还公开了一种可执行文件反汇编的系统、装置及一种计算机可读存储介质,具有以上有益效果。

Description

一种可执行文件反汇编的方法、系统及相关组件
技术领域
本发明涉及恶意软件检测领域,特别涉及一种可执行文件反汇编的方法、系统、一种计算机可读存储介质及一种可执行文件反汇编的装置。
背景技术
大数据和机器学习技术是当前工业界和学术界研究的热点,机器学习和大数据技术被越来越多的用于信息安全方面,并取得了不错的效果。其中,基于机器学习的恶意软件检测技术取得长足的进步,业界也涌现了一大批基于机器学习做恶意软件检测的公司,比如Cylance等,这些新兴公司颇受VC的青睐,也取得一些很好的成果。
目前,主流的恶意软件检测都是基于可执行文件的反汇编得到的顺序流指令序列实现的。在Intel的x86平台下,由于存在允许数据和代码混合的情况,使用传统的直接的扫描方法进行反汇编会出现无法有效区分数据和代码的情况。现有技术中,主要通过Recursive Descent Disassembly实现的可执行文件反汇编解决无法有效区分数据和代码的情况,但是由于这种反汇编的方法对于间接跳转指令的反汇编需要程序运行时才能确定,只有顺序流指令序列中的地址才能作为反汇编操作的地址,故无法对间接跳转指令指向的内容进行反汇编,进而导致无法反汇编可执行文件得到的顺序流指令序列的覆盖率较低。
因此,如何在有效分离代码和数据的前提下,提高反汇编可执行文件中的覆盖率,是本领域技术人员目前需要解决的技术问题。
发明内容
本申请的目的是提供一种可执行文件反汇编的方法、系统、一种计算机可读存储介质及一种可执行文件反汇编的装置,能够在有效分离代码和数据的前提下反汇编可执行文件中的全部代码。
为解决上述技术问题,本申请提供一种可执行文件反汇编的方法,该方法包括:
确定初始入口地址,并从所述初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列;
当所述本次顺序反汇编操作以分支指令结束时,判断所述分支指令是否为jmp指令;
若是,则将所述jmp指令指向的地址作为入口地址添加至入口点集合;
若否,则将所述顺序流指令序列的下一个地址作为所述入口地址添加至所述入口点集合,并判断所述分支指令的寻址方式是否为直接寻址;若是,则将所述分支指令指向的地址作为所述入口地址添加至所述入口点集合;
从所述入口点集合中的所述入口地址开始执行下一次顺序反汇编操作。
可选的,在从所述初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列之后,还包括:
当所述顺序流指令序列存在直接寻址方式的push指令或mov指令时,将所述push指令或所述mov指令指向的立即数作为所述入口地址添加至入口点集合。
可选的,所述确定初始入口地址包括:
将待反汇编区段的初始地址作为所述初始入口地址;
和/或,确定指向指令区域的数据区域,并将所述数据区域作为所述初始入口地址;
和/或,通过entryPoint,和/或导出表,和/或导入表,和/或延迟导入表确定入口地址,并将所述入口地址作为所述初始入口地址。
可选的,将所述入口地址添加至所述入口点集合包括:
利用LooksLikeValidJumpTarget算法判断所述入口地址指向的地址是否合法;
若是,则将所述入口地址添加至所述入口点集合;
其中,所述LooksLikeValidJumpTarget算法具体为:
判断待检测合法性地址是否在所述待反汇编区段内;
若是,则获取所述待检测合法性地址的偏移量,并根据所述偏移量获取对应的字符串;
判断所述字符串的窄字节数是否大于3且所述字符串的宽字节数是否大于或等于2;
若是,则判断所述字符串是否包括预设字符串;其中,所述预设字符串为反汇编平台的反汇编操作码对应的字节;
若是,则所述待检测合法性地址为合法地址。
可选的,还包括:
判断所述本次顺序反汇编操作对应的待反汇编区段中未被反汇编的字节数是否大于16个字节;
若否,则结束所述本次顺序反汇编操作并执行所述下一次顺序反汇编操作。
本申请还提供了一种可执行文件反汇编的系统,该系统包括:
第一反汇编模块,用于确定初始入口地址,并从所述初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列;
判断模块,用于当所述本次顺序反汇编操作以分支指令结束时,判断所述分支指令是否为jmp指令;
第一地址添加模块,用于当所述分支指令为所述jmp指令时,将所述jmp指令指向的地址作为入口地址添加至入口点集合;
第二地址添加模块,用于当所述分支指令不为所述jmp指令时,将所述顺序流指令序列的下一个地址作为所述入口地址添加至所述入口点集合,并判断所述分支指令的寻址方式是否为直接寻址;若是,则将所述分支指令指向的地址作为所述入口地址添加至所述入口点集合;
第二反汇编模块,用于从所述入口点集合中的所述入口地址开始执行下一次顺序反汇编操作。
可选的,还包括:
第三地址添加模块,用于当所述顺序流指令序列存在直接寻址方式的push指令或mov指令时,将所述push指令或所述mov指令指向的立即数作为所述入口地址添加至入口点集合。
可选的,所述第一反汇编模块包括:
第一初始地址确定单元,用于将待反汇编区段的初始地址加入所述入口点集合;
和/或,第二初始地址确定单元,用于确定指向指令区域的数据区域,并将所述数据区域作为入口地址加入所述入口点集合;
和/或,第三初始地址确定单元,用于通过entryPoint,和/或导出表,和/或导入表,和/或延迟导入表确定入口地址,并将所述入口地址加入所述入口点集合;
反汇编单元,从所述初始入口地址开始执行所述本次顺序反汇编操作得到所述顺序流指令序列。
可选的,还包括:
合法性判断模块,用于利用LooksLikeValidJumpTarget算法判断所述入口地址指向的地址是否合法;若是,则将所述入口地址添加至所述入口点集合;
其中,所述LooksLikeValidJumpTarget算法具体为:
判断待检测合法性地址是否在所述待反汇编区段内;
若是,则获取所述待检测合法性地址的偏移量,并根据所述偏移量获取对应的字符串;
判断所述字符串的窄字节数是否大于3且所述字符串的宽字节数是否大于或等于2;
若是,则判断所述字符串是否包括预设字符串;其中,所述预设字符串为反汇编平台的反汇编操作码对应的字节;
若是,则所述待检测合法性地址为合法地址。
可选的,还包括:
字节数判断模块,用于判断所述本次顺序反汇编操作对应的待反汇编区段中未被反汇编的字节数是否大于16个字节;若否,则结束所述本次顺序反汇编操作并执行所述下一次顺序反汇编操作。
本申请还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序执行时实现上述可执行文件反汇编的方法执行的步骤。
本申请还提供了一种可执行文件反汇编的装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器调用所述存储器中的计算机程序时实现上述可执行文件反汇编的方法执行的步骤。
本发明提供了一种可执行文件反汇编的方法,包括确定初始入口地址,并从所述初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列;当所述本次顺序反汇编操作以分支指令结束时,判断所述分支指令是否为jmp指令;若是,则将所述jmp指令指向的地址作为入口地址添加至入口点集合;若否,则将所述顺序流指令序列的下一个地址作为所述入口地址添加至所述入口点集合,并判断所述分支指令的寻址方式是否为直接寻址;若是,则将所述分支指令指向的地址作为所述入口地址添加至所述入口点集合;从所述入口点集合中的地址开始执行下一次顺序反汇编操作。
本实施例主要针对的是X86平台的32bit可执行文件的反汇编,首先按照控制流的方法进行顺序反汇编操作,能够有效地将可执行文件中的地址与数据分离,避免出现数据与地址无法分离带来的反汇编出错的问题。进一步的,由于反汇编操作会在出现分支指令后停止,本发明利用该特性将分支指令指向的地址和顺序流下一条地址加入到入口点集合中。再从入口点集合中的地址开始下一轮的反汇编操作,这样一层一层将反汇编操作过程中所需要调用的或按照顺序应反汇编的地址都加入到入口点集合中,以便进行下一轮反汇编。在上面描述的过程中,由于将分支指令指向的地址和下一条地址加入到入口点集合,增加了反汇编的入口点,提高了对可执行文件反汇编的概率。相对于现有技术中只能按照顺序流进行反汇编的操作,只有顺序流指令序列中的地址才能作为反汇编操作的地址。进一步的,由于jmp指令是无条件跳转指令,jmp指令之后程序会直接跳转到jmp所指向的位置,执行完成之后程序并不返回,也就是说不是从jmp指令的下一个地址开始执行,因此本申请还存在判断分支指令是否为jmp指令的操作。对于jmp指令只将其指向的地址添加到入口点集合中,对于除jmp指令以外的其他分支指令将其指向的地址和顺序流的下一个地址添加至入口点集合中。本申请通过上述操作能够极大地增加反汇编操作所用到的入口地址,进而可以实现在有效分离代码和数据的前提下,提高反汇编可执行文件中的覆盖率。本申请同时还提供了一种可执行文件反汇编的系统、一种计算机可读存储介质和一种可执行文件反汇编的装置,具有上述有益效果,在此不再赘述。
附图说明
为了更清楚地说明本申请实施例,下面将对实施例中所需要使用的附图做简单的介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例所提供的一种可执行文件反汇编的方法的流程图;
图2为本申请实施例所提供的可执行文件反汇编的方法中将所述入口地址添加至所述入口点集合的流程图;
图3为本申请实施例所提供的一种优选的可执行文件反汇编的方法的流程图;
图4为本申请实施例所提供的一种可执行文件反汇编的系统的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
下面请参见图1,图1为本申请实施例所提供的一种可执行文件反汇编的方法的流程图。
具体步骤可以包括:
S101:确定初始入口地址,并从初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列;
其中,在确定初始入口地址之前,需要确定待反汇编区段,此处提到的待反汇编区段是指需要进行反汇编操作的可执行文件的内容,本实施例默认存在寻找可执行文件中的反汇编范围的操作,此处可以是可执行文件的多个待反汇编区段,也可以是一个待反汇编区段,不进行具体的限定。具体步骤可以是:接收可执行文件反汇编的指令,确定可执行文件反汇编的指令所在区域范围,包括可执行文件的可执行区段,包括代码段和可执行区段。
此处提到的初始入口地址是指对该待反汇编区段进行反汇编操作时最先执行反汇编操作的位置,此处不限定初始入口地址的数量,既可以从单一初始入口地址开始反汇编,也可以从多个初始入口地址同时开始反汇编。
需要说明的是,确定初始入口地址的方式有很多,例如,待反汇编区段的初始地址即为初始一个入口地址。又如,可以利用Code pointer(代码指针)获取初始入口地址,即确定指向指令区域的数据区域,并将所述数据区域作为初始入口地址,具体的,对于x86来说,由于数据经常混杂在指令之中,即有些数据是用来定义数据类型的,有些是用来定义跳转地址指向指令区域的跳转地址,这些指向指令区域的数据区域就称为Code pointers。利用Codepointer获取入口地址的方法如下:对于32bit的可执行文件来说,通常数据区域是按照4字节对齐的,从待反汇编区段的初始地址按照4字节对齐的原则,读取对应磁盘偏移中的内容,如果该内容在待反汇编区段所述的指令区域之内,就进行标记候选入口地址,实际存储是以map的形式,key表示的是数据区域的地址,而value是之前标记的候选入口地址(即该处磁盘内容)。扫描完成之后,对可能的入口地址进行过滤,过滤的原则是:包括key所表示的数据区域地址,至少有3个连续的数据区域地址所指向的内容被标记为候选入口地址,才作为初始入口地址进行反汇编操作。上述过滤原则主要是因为数据区域通常是连续存储的,只有至少连续三个数据区域的地址里面的内容指向的是可能的入口地址时,才可以确定为初始入口地址。另外,在本实施例中还可以通过entryPoint,和/或导出表,和/或导入表,和/或延迟导入表确定初始入口地址。当然,上面提供了三种确定初始入口地址的方式,可以选择其中的一种或几种的组合来实现本步骤中关于确定初始入口地址的操作。
值得注意的是,在确定初始入口地址后,可以将初始入口地址加入入口点集合中,当需要进行反汇编时再从入口点集合中确定初始入口地址。入口点集合是一个可以存储下一轮顺序反汇编操作的入口地址的存储空间,入口点集合可以是在执行顺序反汇编操作之前就已经创建的,也可以是当需要将某些地址存起来进行下一轮顺序反汇编操作时再创建的,此处不对入口点集合的创建时刻进行具体的限定,只要能够将下一轮顺序反汇编操作的地址存储即可。
作为一种优选的实施方案,可以在确定待反汇编区段之后,对待反汇编区段再进行筛选:主要是将该待反汇编区段的范围进一步缩减,从而提高反汇编的效率和质量。例如,根据可执行文件中的第一是根据可执行文件中的DataDirectory(数据目录)字段进行筛检,判断待反汇编区段是否属于数据区域,若否则将该部分删除。在数据区域的部分主要占用的部分有导入表和导出表以及导入导出表中的字符串占用的空间。再例如,判断待反汇编区段内是否存在多余子区段,若是,则删除多余子区段,其中,所述多余子区段由预设字节个连续的0(如40个字节的连续的0)构成。
需要说明的是,当遇到如下三种情况时顺序反汇编操作会停止,情况1:指令反汇编出错(只有当第一条指令译码错误才称之为出错,如果反汇编出错的指令不是第一条,那么返回从第一条到反汇编出错的上一条指令反汇编结果);情况2:待反汇编区段剩余字节不足预设值(在Intel x86的情境下,该预设值为16);情况3:遇到分支指令(包括ret、jmp、call和条件跳转指令)时。需要说明的是,现有技术在上述情况1、情况2时,都会在结束本轮反汇编操作后,继续对下一地址执行下一轮反汇编,而对于情况3,现有技术只能继续对分支指令的下一条地址进行反汇编操作而没有对分支指令指向的地址进行反汇编,这是造成反汇编覆盖率低的主要问题。需要说明的是,本步骤补充了将分支指令指向的地址加入到入口点集合中的操作,当然还可以包括现有技术中遇到上述三种情况将下一地址加入到入口点集合或结束整个反汇编动作的操作。
通常情况下,所有反汇编操作在得到中断指令后都会继续反汇编该中断指令在顺序流中的下一个地址,这是现有技术中都能够解决的问题。但是,现有技术中并不存在如何处理在顺序流指令序列存在push指令、mov指令以及分支指令时,如何反汇编与push指令、mov指令以及分支指令在控制流结构上相关及其指向的地址的问题。本实施例将在下面几个步骤中逐个介绍。值得注意的是,本步骤是指从初始入口地址开始执行顺序反汇编操作的过程,并不是指已经执行完顺序反汇编操作。由于顺序反汇编操作是按照控制流的方法执行的,因此,本步骤的反汇编操作能够有效地区分地址和数据。
S102:当本次顺序反汇编操作以分支指令结束时,判断分支指令是否为jmp指令;若是,则进入S103;若否,则进入S104;
其中,在上面的叙述已经提到,顺序流反汇编操作在遇到分支指令时会停止本轮的反汇编,此时如果继续按照顺序流继续从分支指令的下一地址开始反汇编将会导致,分支指令指向的地址没有被反汇编。
由于jmp指令是无条件跳转指令,jmp指令之后程序会直接跳转到jmp所指向的位置,执行完成之后程序并不返回,也就是说不是从jmp指令的下一个地址开始执行。因此,需要判断分支指令是否为jmp指令,以便进行相应的增加入口点地址的操作。
S103:将jmp指令指向的地址作为入口地址添加至入口点集合;
S104:将顺序流指令序列的下一个地址作为所述入口地址添加至所述入口点集合,并判断所述分支指令的寻址方式是否为直接寻址;若是,则将所述分支指令指向的地址作为所述入口地址添加至所述入口点集合;
由于间接寻址方式无法通过静态反汇编找到目标地址,所以本申请实施例中将分支指令指向的地址加入到入口点集合的操作实际上是:通过立即数寻址方式来添加入口地址(即,将分支指令指向的立即数作为入口地址加入入口点集合中)。可以理解的是,当分支指令为return时,return指令不存在指向的地址,因此只需要将return指令或跳转指令后面的地址加入入口点集合即可。
由于本实施例是通过增加入口地址的思想来提高的反汇编覆盖率,因此作为一种优选的实施方式,可以在顺序流指令序列存在push指令或mov指令时,将所述push指令和/或所述mov指令对应的立即数添加至入口点集合。上述操作是在顺序反汇编过程中对顺序流指令序列中存在的除分支指令以外能够指向其他地址的指令(如push指令、mov指令)的处理方式,push指令和mov指令都需要指向另一个地址,但是由于本方案是通过顺序反汇编操作实现的,因此本方案并不会直接反汇编push指令或mov指令指向的地址,而是按照顺序流继续反汇编push指令或mov指令的下一条代码,这样就有可能造成现有技术中反汇编不完整的问题。因此本实施例基于上述顺序反汇编操作的特性,通过设置入口点集合解决了上述问题,即:将所述push指令和/或所述mov指令对应的立即数添加至入口点集合中。本步骤的设置能够补充更多的入口地址进而提升反汇编的覆盖率。进一步的说,在采用,将所述push指令和/或所述mov指令对应的立即数添加至入口点集合的基础上,虽然分支指令都可以存在指向的地址和顺序流指令下一条地址,但是并不是所有的分支指令都需要将顺序流序列指令的下一个地址添加至入口点集合。这个特例就是无条件跳转指令(jmp指令),因此对于无条件跳转指令来说,仅仅将无条件跳转指令指向的地址加入入口点集合即可。故在本步骤中对分支指令时判断该分支指令是否为无条件指令,执行相对应的步骤。
值得注意的是,由于本步骤是针对顺序反汇编得到分支指令时进行的操作,而顺序反汇编在得到分支指令时会自动结束反汇编,因此当进行到本步骤时,S101中描述的那一轮顺序流反汇编已经结束了。
可以理解的是,本实施例通过S103和S104中的操作,增加了顺序反汇编操作的所需要的入口地址,增加了对待分会变区段的全部内容进行反汇编操作的路径,进而提升反汇编操作的概率。
S105:从所述入口点集合中的地址开始执行下一次顺序反汇编操作。
值得注意的是,本步骤中提到的下一次反汇编操作执行的前提并不是仅限于当前次的顺序反汇编操作结束,可以在S101顺序反汇编操作的过程中同步执行S105中的操作,只要入口点集合中存在尚未反汇编的地址即可。作为一种更优选的实施方式,可以增加记录已经被反汇编的代码的集合,同样能够避免出现重复反汇编的问题同时还能分析反汇编的进度。
本实施例按照控制流的方法进行顺序反汇编操作,能够有效地将可执行文件中的地址与数据分离,避免出现数据与地址无法分离带来的反汇编出错的问题。进一步的,由于反汇编操作会在出现分支指令后停止,本发明利用该特性将分支指令指向的地址和顺序流下一条地址加入到入口点集合中。再从入口点集合中的地址开始下一轮的反汇编操作,这样一层一层将反汇编操作过程中所需要调用的或按照顺序应反汇编的地址都加入到入口点集合中,以便进行下一轮反汇编。在上面描述的过程中,由于将分支指令指向的地址和下一条地址加入到入口点集合,增加了反汇编的入口点,提高了对可执行文件反汇编的概率。相对于现有技术中只能按照顺序流进行反汇编的操作,只有顺序流指令序列中的地址才能作为反汇编操作的地址;本实施例通过上述操作能够极大地增加反汇编操作所用到的入口地址,进而可以实现在有效分离代码和数据的前提下,提高反汇编可执行文件中的覆盖率。
进一步的,由于对可执行文件的反汇编得到的数据是机器学习识别恶意软件的很重要的一个输入特征,基于本实施例得到的覆盖率较高的反汇编结构,对于机器学习引擎的查杀效果有积极的影响。
下面请参见图2,图2为本申请实施例所提供的可执行文件反汇编的方法中将所述入口地址添加至所述入口点集合的流程图。
本实施例是对第一个实施例中将所述入口地址添加至所述入口点集合的具体限定,相同的内容可以参照第一个实施例中的叙述,将所述入口地址添加至所述入口点集合的方式包括但不限于下述方式:
S201:判断所述分支指令指向的地址是否合法;若是,则进入S202;若否,则结束本次顺序反汇编操作;
S202:将分支指令指向的地址作为入口地址添加至入口点集合。
S203:判断顺序流指令序列的下一个地址是否合法;若是,则进入S204;若否,则结束本次顺序反汇编操作;
S204:将顺序流指令序列的下一个地址作为入口地址添加至入口点集合。
其中,可以通过looksLikeValidJumpTarget的方法来判断地址是否合法,在本实施例中looksLikeValidJumpTarget是一种校验地址是否合法进而增加入口地址的方式,本实施例通过对分支指令指向的地址以及顺序流指令序列的下一个地址进行判断是否合法的操作,提升了反汇编操作的准确度。其中,looksLikeValidJumpTarget的校验过程如下:输入参数为va,即待检测合法性的地址,首先判断该地址是否在待反汇编区段内,若是则获得该va所对应的offset(可执行文件中的偏移量),从offset处出发获取对应的字符串,如果窄字节长度大于4并且宽字节长度大于或等于2,判断所述字符串是否包括预设字符串,其中,预设字符串为针对所述待反汇编区段的反汇编平台设置的字符串,更具体的应该是判断该偏移处的单个字节内容是否是x86 32位操作码所对应的字节,比如push操作码对应0x55和0x68字节、mov操作码对应的是0x8b、0xb8。例如,对于Intel x86来说,预设字符串如下:
当所述字符串是否包括上述预设字符串时,该待检测合法性地址为合法地址。作为一种优选的实施方式,本实施例描述的方法还可以利用looksLikeValidJumpTarget对上一实施例中补充的关于push指令和mov指令指向的地址进行判断是否合法的操作。事实上S201与S202为具有逻辑上先后关联的两个步骤,S203与S204为具有逻辑上先后关联的另两个步骤,也可以先执行S203、S204再执行S201、S202。
下面请参见图3,图3为本申请实施例所提供的一种优选的可执行文件反汇编的方法的流程图。
具体步骤可以包括:
S301:确定初始入口地址,并从初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列;
其中,确定初始入口地址的操作可以包括将待反汇编区段的初始地址作为所述初始入口地址;确定指向指令区域的数据区域,并将所述数据区域作为所述初始入口地址;通过entryPoint,和/或导出表,和/或导入表,和/或延迟导入表确定入口地址,并将所述入口地址作为所述初始入口地址。
S302:当所述顺序流指令序列存在push指令或mov指令时,将所述push指令或所述mov指令对应的立即数作为入口地址添加至入口点集合;
S303:当所述本次顺序反汇编操作以所述分支指令结束时,判断所述分支指令是否为jmp指令;若是,则进入S304;若否,则进入S305;
S304:将所述jmp指令指向的地址作为入口地址添加至入口点集合;进入S308
S305:将顺序流指令序列的下一个地址作为所述入口地址添加至所述入口点集合,并判断所述分支指令的寻址方式是否为直接寻址;若是,则将所述分支指令指向的地址作为所述入口地址添加至所述入口点集合并进入S308;
S306:当所述待反汇编区段中未被反汇编的字节数大于预设值时,判断所述顺序流指令序列的下一个地址是否合法;若是则进入S307;若否,则进入S308;
S307:将所述顺序流指令序列的下一个地址作为所述入口地址添加至所述入口点集合;进入S308;
S308:判断所述入口点集合是否为空;若是,则结束流程;若否,则进入S309;
S309:从入口点集合中的地址开始执行下一次顺序反汇编操作。
在上述实施例中,将与push指令、mov指令以及分支指令相关的地址均加入到入口点集合中,相对于现有技术中仅仅依靠顺序流指令序列的下一个地址作为反汇编的入口点地址,本实施例不但能够将顺序流指令序列的下一个地址作为入口点地址,还将push指令、mov指令以及分支指令指向的地址作为入口点地址,极大地增加了顺序反汇编的入口点,提高了反汇编的覆盖率。需要说明的是,作为一种优选的实施方式,在本实施例中每次加入入口点集合的地址都可以进行关于合法性的判断,以保证加入入口点集合的地址都是正确的,进而提升反汇编的效率和准确率。当一次迭代反汇编完成之后,在反汇编没有出错的条件下会得到一个顺序指令流序列,而这个指令流序列对应者指定的地址范围。此轮反汇编结束,是将该地址范围从指令区域删除。每一次反汇编的起始都是从入口点集合中取一个入口点然后开始反汇编的
请参见图4,图4为本申请实施例所提供的一种可执行文件反汇编的系统的结构示意图;
该系统可以包括:
第一反汇编模块100,用于确定初始入口地址,并从所述初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列;
判断模块200,用于当所述本次顺序反汇编操作以分支指令结束时,判断所述分支指令是否为jmp指令;
第一地址添加模块300,用于当所述分支指令为所述jmp指令时,将所述jmp指令指向的地址作为入口地址添加至入口点集合;
第二地址添加模块400,用于当所述分支指令不为所述jmp指令时,将所述顺序流指令序列的下一个地址作为所述入口地址添加至所述入口点集合,并判断所述分支指令的寻址方式是否为直接寻址;若是,则将所述分支指令指向的地址作为所述入口地址添加至所述入口点集合;
第二反汇编模块500,用于从所述入口点集合中的所述入口地址开始执行下一次顺序反汇编操作。
进一步的,该系统还包括:
第三地址添加模块,用于当所述顺序流指令序列存在直接寻址方式的push指令或mov指令时,将所述push指令或所述mov指令指向的立即数作为所述入口地址添加至所述入口点集合。
进一步的,所述第一反汇编模块100包括:
第一初始地址确定单元,用于将待反汇编区段的初始地址加入所述入口点集合;
和/或,第二初始地址确定单元,用于确定指向指令区域的数据区域,并将所述数据区域作为入口地址加入所述入口点集合;
和/或,第三初始地址确定单元,用于通过entryPoint,和/或导出表,和/或导入表,和/或延迟导入表确定入口地址,并将所述入口地址加入所述入口点集合;
反汇编单元,从所述初始入口地址开始执行所述本次顺序反汇编操作得到所述顺序流指令序列。
进一步的,该系统还包括:
合法性判断模块,用于利用LooksLikeValidJumpTarget算法判断所述入口地址指向的地址是否合法;若是,则将所述入口地址添加至所述入口点集合;
其中,所述LooksLikeValidJumpTarget算法具体为:
判断待检测合法性地址是否在所述待反汇编区段内;
若是,则获取所述待检测合法性地址的偏移量,并根据所述偏移量获取对应的字符串;
判断所述字符串的窄字节数是否大于3且所述字符串的宽字节数是否大于或等于2;
若是,则判断所述字符串是否包括预设字符串;其中,所述预设字符串为反汇编平台的反汇编操作码对应的字节;
若是,则所述待检测合法性地址为合法地址。
进一步的,该系统还包括:
字节数判断模块,用于判断所述本次顺序反汇编操作对应的待反汇编区段中未被反汇编的字节数是否大于16个字节;若否,则结束所述本次顺序反汇编操作并执行所述下一次顺序反汇编操作。
由于系统部分的实施例与方法部分的实施例相互对应,因此系统部分的实施例请参见方法部分的实施例的描述,这里暂不赘述。
本申请还提供了一种计算机可读存储介质,其上存有计算机程序,该计算机程序被执行时可以实现上述实施例所提供的步骤。该存储介质可以包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
本申请还提供了一种可执行文件反汇编的装置,可以包括存储器和处理器,所述存储器中存有计算机程序,所述处理器调用所述存储器中的计算机程序时,可以实现上述实施例所提供的步骤。当然所述可执行文件反汇编的装置还可以包括各种网络接口,电源等组件。
说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。
还需要说明的是,在本说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的状况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

Claims (12)

1.一种可执行文件反汇编的方法,其特征在于,包括:
确定初始入口地址,并从所述初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列;
当所述本次顺序反汇编操作以分支指令结束时,判断所述分支指令是否为jmp指令;
若是,则将所述jmp指令指向的地址作为入口地址添加至入口点集合;
若否,则将所述顺序流指令序列的下一个地址作为所述入口地址添加至所述入口点集合,并判断所述分支指令的寻址方式是否为直接寻址;若是,则将所述分支指令指向的地址作为所述入口地址添加至所述入口点集合;
从所述入口点集合中的所述入口地址开始执行下一次顺序反汇编操作。
2.根据权利要求1所述方法,其特征在于,在从所述初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列之后,还包括:
当所述顺序流指令序列存在直接寻址方式的push指令或mov指令时,将所述push指令或所述mov指令指向的立即数作为所述入口地址添加至所述入口点集合。
3.根据权利要求1所述方法,其特征在于,所述确定初始入口地址包括:
将待反汇编区段的初始地址作为所述初始入口地址;
和/或,确定指向指令区域的数据区域,并将所述数据区域作为所述初始入口地址;
和/或,通过entryPoint,和/或导出表,和/或导入表,和/或延迟导入表确定入口地址,并将所述入口地址作为所述初始入口地址。
4.根据权利要求1所述方法,其特征在于,将所述入口地址添加至所述入口点集合包括:
利用LooksLikeValidJumpTarget算法判断所述入口地址指向的地址是否合法;
若是,则将所述入口地址添加至所述入口点集合;
其中,所述LooksLikeValidJumpTarget算法具体为:
判断待检测合法性地址是否在所述待反汇编区段内;
若是,则获取所述待检测合法性地址的偏移量,并根据所述偏移量获取对应的字符串;
判断所述字符串的窄字节数是否大于3且所述字符串的宽字节数是否大于或等于2;
若是,则判断所述字符串是否包括预设字符串;其中,所述预设字符串为反汇编平台的反汇编操作码对应的字节;
若是,则所述待检测合法性地址为合法地址。
5.根据权利要求1-4任一项所述方法,其特征在于,还包括:
判断所述本次顺序反汇编操作对应的待反汇编区段中未被反汇编的字节数是否大于16个字节;
若否,则结束所述本次顺序反汇编操作并执行所述下一次顺序反汇编操作。
6.一种可执行文件反汇编的系统,其特征在于,包括:
第一反汇编模块,用于确定初始入口地址,并从所述初始入口地址开始执行本次顺序反汇编操作得到顺序流指令序列;
判断模块,用于当所述本次顺序反汇编操作以分支指令结束时,判断所述分支指令是否为jmp指令;
第一地址添加模块,用于当所述分支指令为所述jmp指令时,将所述jmp指令指向的地址作为入口地址添加至入口点集合;
第二地址添加模块,用于当所述分支指令不为所述jmp指令时,将所述顺序流指令序列的下一个地址作为所述入口地址添加至所述入口点集合,并判断所述分支指令的寻址方式是否为直接寻址;若是,则将所述分支指令指向的地址作为所述入口地址添加至所述入口点集合;
第二反汇编模块,用于从所述入口点集合中的所述入口地址开始执行下一次顺序反汇编操作。
7.根据权利要求6所述系统,其特征在于,还包括:
第三地址添加模块,用于当所述顺序流指令序列存在直接寻址方式的push指令或mov指令时,将所述push指令或所述mov指令指向的立即数作为所述入口地址添加至所述入口点集合。
8.根据权利要求6所述系统,其特征在于,所述第一反汇编模块包括:
第一初始地址确定单元,用于将待反汇编区段的初始地址加入所述入口点集合;
和/或,第二初始地址确定单元,用于确定指向指令区域的数据区域,并将所述数据区域作为入口地址加入所述入口点集合;
和/或,第三初始地址确定单元,用于通过entryPoint,和/或导出表,和/或导入表,和/或延迟导入表确定入口地址,并将所述入口地址加入所述入口点集合;
反汇编单元,从所述初始入口地址开始执行所述本次顺序反汇编操作得到所述顺序流指令序列。
9.根据权利要求6所述系统,其特征在于,还包括:
合法性判断模块,用于利用LooksLikeValidJumpTarget算法判断所述入口地址指向的地址是否合法;若是,则将所述入口地址添加至所述入口点集合;
其中,所述LooksLikeValidJumpTarget算法具体为:
判断待检测合法性地址是否在所述待反汇编区段内;
若是,则获取所述待检测合法性地址的偏移量,并根据所述偏移量获取对应的字符串;
判断所述字符串的窄字节数是否大于3且所述字符串的宽字节数是否大于或等于2;
若是,则判断所述字符串是否包括预设字符串;其中,所述预设字符串为反汇编平台的反汇编操作码对应的字节;
若是,则所述待检测合法性地址为合法地址。
10.根据权利要求6-9任一项所述系统,其特征在于,还包括:
字节数判断模块,用于判断所述本次顺序反汇编操作对应的待反汇编区段中未被反汇编的字节数是否大于16个字节;若否,则结束所述本次顺序反汇编操作并执行所述下一次顺序反汇编操作。
11.一种可执行文件反汇编的装置,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时执行如权利要求1至5任一项所述的可执行文件反汇编的方法的步骤。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述的可执行文件反汇编的方法的步骤。
CN201810490322.7A 2018-05-21 2018-05-21 一种可执行文件反汇编的方法、系统及相关组件 Active CN110516438B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810490322.7A CN110516438B (zh) 2018-05-21 2018-05-21 一种可执行文件反汇编的方法、系统及相关组件

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810490322.7A CN110516438B (zh) 2018-05-21 2018-05-21 一种可执行文件反汇编的方法、系统及相关组件

Publications (2)

Publication Number Publication Date
CN110516438A true CN110516438A (zh) 2019-11-29
CN110516438B CN110516438B (zh) 2023-11-07

Family

ID=68622207

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810490322.7A Active CN110516438B (zh) 2018-05-21 2018-05-21 一种可执行文件反汇编的方法、系统及相关组件

Country Status (1)

Country Link
CN (1) CN110516438B (zh)

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050198526A1 (en) * 2004-03-05 2005-09-08 Microsoft Corporation Static and run-time anti-disassembly and anti-debugging
CN102855119A (zh) * 2012-07-26 2013-01-02 北京奇虎科技有限公司 一种可执行文件处理方法和装置
CN103677746A (zh) * 2012-09-06 2014-03-26 北京中天安泰信息科技有限公司 指令重组方法及装置
CN103679039A (zh) * 2012-09-06 2014-03-26 北京中天安泰信息科技有限公司 数据安全存储方法及装置
CN104504329A (zh) * 2014-12-30 2015-04-08 中国人民解放军装备学院 一种程序运行时处理器指令校验方法
CN105787368A (zh) * 2016-02-26 2016-07-20 武汉大学 一种基于函数置乱的rop防御方法与装置
CN106055378A (zh) * 2016-06-06 2016-10-26 中国南方电网有限责任公司电网技术研究中心 继电保护装置嵌入式软件的反汇编方法和系统
CN106648818A (zh) * 2016-12-16 2017-05-10 华东师范大学 一种目标代码控制流图生成系统
CN106775913A (zh) * 2016-12-16 2017-05-31 华东师范大学 一种目标代码控制流图生成方法
CN107967203A (zh) * 2016-10-20 2018-04-27 腾讯科技(深圳)有限公司 基于可执行文件的函数判定方法及装置

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050198526A1 (en) * 2004-03-05 2005-09-08 Microsoft Corporation Static and run-time anti-disassembly and anti-debugging
CN102855119A (zh) * 2012-07-26 2013-01-02 北京奇虎科技有限公司 一种可执行文件处理方法和装置
CN103677746A (zh) * 2012-09-06 2014-03-26 北京中天安泰信息科技有限公司 指令重组方法及装置
CN103679039A (zh) * 2012-09-06 2014-03-26 北京中天安泰信息科技有限公司 数据安全存储方法及装置
CN104504329A (zh) * 2014-12-30 2015-04-08 中国人民解放军装备学院 一种程序运行时处理器指令校验方法
CN105787368A (zh) * 2016-02-26 2016-07-20 武汉大学 一种基于函数置乱的rop防御方法与装置
CN106055378A (zh) * 2016-06-06 2016-10-26 中国南方电网有限责任公司电网技术研究中心 继电保护装置嵌入式软件的反汇编方法和系统
CN107967203A (zh) * 2016-10-20 2018-04-27 腾讯科技(深圳)有限公司 基于可执行文件的函数判定方法及装置
CN106648818A (zh) * 2016-12-16 2017-05-10 华东师范大学 一种目标代码控制流图生成系统
CN106775913A (zh) * 2016-12-16 2017-05-31 华东师范大学 一种目标代码控制流图生成方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
党红社: "单片机反汇编程序DS51M", 微计算机应用, no. 06, pages 18 - 20 *

Also Published As

Publication number Publication date
CN110516438B (zh) 2023-11-07

Similar Documents

Publication Publication Date Title
CN105260659A (zh) 一种基于qemu的内核级代码重用型攻击检测方法
CN102693396B (zh) 一种基于虚拟执行模式的Flash漏洞检测方法
CN102902906B (zh) 微处理器指令集验证方法
CN105303104A (zh) 用以禁止返回定向编程的动态执行阻止
CN103745167B (zh) 单片机的iap方法及装置
CN109408393A (zh) 应用测试方法、装置及设备和计算机可读存储介质
CN103955354B (zh) 重定位方法和装置
CN104461526B (zh) 一种终端应用程序的控件遍历方法及装置
EP1701358B1 (en) Data write-in method for flash memory
CN106020735A (zh) 一种数据存储方法及数据存储装置
CN104932922A (zh) 一种调整sas卡硬盘启动顺序的方法及装置
CN109145534A (zh) 针对软件虚拟机保护的反混淆系统及方法
CN109325353A (zh) 一种针对家用路由器的聚类漏洞分析方法
CN110516438A (zh) 一种可执行文件反汇编的方法、系统及相关组件
CN107526622A (zh) Linux的快速异常处理方法及装置
CN107977577A (zh) 访存指令访问检测方法及装置
CN105677297B (zh) 套锁实现方法及装置
CN106886446A (zh) 软件源代码的验证方法及装置
CN109739824A (zh) 日志获取方法及设备
CN103106097A (zh) 一种即时编译系统中的栈运算优化方法
CN106126225B (zh) 一种基于程序演进模型的目标代码逆向工程方法
CN105260130B (zh) 一种希捷硬盘系统文件的读写方法
CN107798244A (zh) 一种检测远程代码执行漏洞的方法及装置
CN104765626B (zh) 一种固件程序烧写方法及装置
CN101770396B (zh) 实现Linux系统下擦写DMI数据的方法及装置

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