一种基于硬件模拟器的自修改代码识别方法

文档序号:6471931阅读:106来源:国知局
专利名称:一种基于硬件模拟器的自修改代码识别方法
技术领域
本发明属于软件安全性测评技术领域,具体涉及一种基于硬件模拟器的自修改代码识 别方法。
背景技术
自修改代码(Self-ModifyingCode, SMC)是指代码在执行过程中有意修改自身代码, 使实际运行的代码和执行之前的静态二进制表示不相同,以隐藏指令以及程序的执行流程
曰息o
SMC是有效抵御静态逆向分析的技术之一,广泛应用于软件保护和恶意代码等领域, 目的是防止软件破解等代码分析人员使用逆向工程工具(如常见的反汇编工具)对程序进 行静态分析,增加逆向分析人员对受保护代码的程序分析理解的难度。
由于静态分析方法与动态分析方法相比在分析全面性等方面具有明显的优势,目前仍 然是最主要的代码分析方法,被广泛应用于恶意代码分析和软件安全测评工作中。但是随 着SMC等反逆向分析技术的日益完善和广泛使用,静态分析方法的分析能力受到越来越 多的约束。对于采用SMC技术保护的代码,往往由于实际执行的代码和静态二进制表示 不一致,因此静态分析几乎无能为力。如何利用动态分析方法识别并提取SMC中隐藏的 代码,并将其恢复到原可执行文件中是目前针对SMC的主要研究思路。

发明内容
本发明的目的是通过对不同类型的SMC的剖析,掌握SMC的技术原理,提供一种基 于硬件模拟器的自修改代码识别的方法。
本发明通过设置标志,仅使目标可执行文件单步执行,并截获虚拟系统执行指令,使 用影子内存监控程序执行过程中的内存写操作以及控制转移指令等信息,识别提取程序执 行过程中动态释放到内存中并得到执行的代码,获取分析目标的数据信息。由于在硬件模 拟器中对可执行文件进行动态分析,本发明的数据采集是通过模拟硬件实现,而不是将恶 意代码放在真实的CPU上执行,因此对实际系统不造成任何影响。同时,恶意代码无法感 知自身是否运行在虚拟环境中,也无法分辨自身是否被跟踪,从而实现对恶意代码完全透 明的分析。本发明提供一种基于硬件模拟器的自修改代码识别方法,具体步骤如下 1、以单步执行方式运行可执行文件
在硬件模拟器新添加的一单步执行标志,载入目标可执行文件,利用控制寄存器中 CR3的值识别目标可执行文件;使所述的目标可执行文件以单步执行方式运行,模拟器中 其他进程的运行模式保持不变。
2、在硬件模拟器中创建并初始化影子内存
为可执行文件进程的内存空间创建并初始化一个影子内存(shadowmemory),利用影 子内存记录程序执行过程中内存的状态。创建影子内存的内存单元范围包括可执行文件 进程所属的代码段、数据段、堆和栈。内存单元的影子内存至少包括内存单元的状态,还 可以包括修改内存单元的指令地址以及引用该内存单元的指令地址。
3、 截获执行指令,提取指令结构
硬件模拟器中的译码引擎将可执行文件中的目标指令翻译为翻译代码块(Translation Block, TB),执行目标可执行文件,硬件模拟器中的指令处理模块截获执行指令,并提 取指令结构。
需截获分析的指令类型分为两类内存修改类指令(如MOV、 STOB等)和控制跳转类 指令(如JMP、 JZ、 CALL等),指令处理模块将上述提取的指令结构信息存储到扩展的 TB缓冲区(Expanded TB Cache, ETB)中。
在代码执行过程中,指令处理模块根据ETB中存储的指令结构信息,通过实时获取寄存 器和内存单元的内容确定指令中操作数的值。所述指令结构信息包括指令的类型,操作 数的地址。
4、 在对程序执行监控过程中,影子内存管理模块利用步骤3中截获的指令类型、操作 数的地址和数值分析指令修改的目标内存地址范围,并结合程序执行过程中指令的EIP, 分析执行的指令所占有的内存范围,从而实时更新影子内存中的相应的内存单元的状态等 内容,并根据内存单元的状态识别出自修改代码。
指令处理模块不断截获指令并提取指令结构信息及指令中操作数的值,并不断根据内 存单元的状态识别出自修改代码,直到程序执行API函数ExitProcess()或程序执行时间超过 设定的时间阈,程序执行结束,同时自修改代码的识别结束。
本发明的优点和积极效果如下1. 本发明充分利用硬件模拟器的优势,通过对模拟器系统的改造,识别提取分析目 标中的隐藏代码,即程序执行过程中动态释放到内存中并得到执行的代码等信息。
2. 本发明仅仅使目标执行文件进程运行在单步模式下,其他进程执行模式不变,提
高了分析效率。
3. 由于采用硬件模拟器作为动态分析的平台,因此不会对实际系统造成任何影响, 同时提高了分析平台和代码之间的透明性,可有效抵御代码的检测。


图l本发明自修改代码识别方法的结构示意图2本发明自修改代码识别的流程图3本发明实施例中影子内存状态更新示意其中OO:clean; Ol:executed; 10:modified; 11 :executed—after—modified。
具体实施例方式
下面结合附图,对本发明的技术内容做进一步的说明。
参照图1,本发明通过将硬件模拟器系统的翻译代码块扩展为翻译代码块的缓存区, 并在硬件模拟器中加入影子内存;在程序运行时,拦截虚拟系统指令,获取分析目标的数 据信息。在改造后的硬件模拟器中对可执行文件进行动态分析,通过监控程序执行过程中 的内存写操作以及控制转移指令等信息,识别提取程序执行过程中动态释放到内存中并得 到执行的代码,最后利用动态分析过程中获取的控制跳转等信息,将提取的代码恢复到原 可执行文件中,生成完整的,和原可执行文件执行流程、功能相同的二进制文件。如图2 所示,下面给出自修改代码识别和提取的详细过程。
第一步在硬件模拟器中载入目标可执行文件P,通过控制寄存器中CR3的值获得对 应的目标程序P,设置模拟器中新添加的单步执行标志7^/"gfeft印。模拟器在对目标程序 p翻译时,首先检测该进程的单步执行标志,由于设置了单步执行标志J^/"gfeSte/;,模拟 器每次仅翻译一条指令,即目标程序P运行在单步模式,模拟器中运行的其他进程运行模 式保持不变。
修改硬件模拟器译码引擎中用于查找和翻译TB的函数,使硬件模拟器虚拟CPU认为 翻译目标进程的指令都需要重新翻译,翻译后再执行。在翻译的时候,硬件模拟器检测目 标进程的单步标志,若设置了单步标志,则模拟器每次只翻译一条指令。本发明在硬件模
6拟器中新添加的一个单步执行标志,用于有效抵御代码对其执行环境的检测。
在虚拟CPU执行指令之前,首先判断单步标志,如果设置了该标志,则每次执行时,
CPU的PC指针只向后移动一个指令大小,从而实现进程的单步执行。
第二步创建并初始化影子内存,影子内存包括内存单元的状态、修改内存单元的指
令地址及引用该内存单元的指令地址,本实施例的影子内存按照如下格式设计-
struct ShadowMem{ enum State StateNowj DWORD MOD—EIP; struct RepeatedRefRecord * REF—EIP;
};
其中StateNow表示内存单元的状态,MOD—EIP表示修改内存单元的指令地址,链表 R印eatedRefRecord中存储引用该内存单元的指令地址。该影子内存结构中,因考虑对同一 地址的多次跳转的情况,对跳转指令地址使用链表RepeatedRefRecord记录。
上述内存单元的状态StateNow使用的数据结构包括可执行文件代码被载入到内存中后 各内存单元的初始状态、所述内存单元被修改后的状态及所述内存单元被执行后的状态。 内存单元的状态StateNow具体使用的数据结构如下-enum State { clean, modified, executed,
executed—after—modified
};
其中,clean表示代码被载入到内存中后各内存单元的初始状态,modified表示内存单 位被修改后的状态,executed表示内存单元被执行后的状态,而executed—after_modified表 示当前状态为modified的内存单元被执行。
跳转指令地址的链表RepeatedRefRecord的具体数据格式如下 struct RepeatedRefRecord {
DWORD REF—EIP;
DWORD TargetAdd;
struct RepeatedRefRecord承nextRefRecord;其中,REF—EIP表示引用内存单元的指令EIP, TargetAdd表示引用内存单元的目标地 址,nextRe汉ecord指向该链表的下一个节点。
第三步截获执行指令,提取指令结构信息以及指令中操作数的值;指令结构信息主 要是指指令类型,所有关注的指令分为两类内存修改类指令和控制跳转指令。
控制跳转类指令包括JMP、 CALL等指令,用于触发对执行位置转移的检査;内存修改 类指令包括M0V、 ST0B等指令,用于触发对内存数据修改的检査。
指令类型具体的数据使用如下格式
enum InstmctionType { JMP, MOV
};
在代码执行过程中,指令处理模块根据ETB中存储的指令结构信息,通过模拟器提供 的接口函数,如cpu一memory一rw一debug()等,实时获取寄存器和内存单元的内容,从而确定 指令中操作数的值。通过指令的类型、操作数的地址和值,可以分析执行指令修改的目标 内存范围以及指令所占有的内存范围,以便于更新影子内存中相应的内存单元的状态。
第四步更新影子内存内容,提取隐藏代码。在对程序执行监控过程中,影子内存管 理模块利用上述截获指令所获取的指令类型、操作数的地址和数值信息,以及指令对应的 EIP,实时更新影子内存中的相应内存单元的状态。代码提取模块根据影子内存中存储的 内存单元的状态,提取存储隐藏的代码等相关信息。
影子内存管理模块可以通过分析指令的类型和操作数的地址和值,判断指令修改的目 标内存地址范围,结合内存单元的当前状态对影子内存中相应的内存单元的状态进行更 新;同时,该模块可以通过指令的EIP和指令结构信息,分析该指令占用的内存范围,结 合内存单元的当前状态更新该指令对应的影子内存中内存单元的状态。
影子内存状态更新示意图如图3所示。影子内存状态更新的具体步骤如下
对于某个内存区域,可执行文件载入后的初始状态为c/e朋;
1) 当前状态为c/e朋的内存单元被某指令修改后,将其状态设置为moc/折W;
2) 当前状态为c/^"的内存单元所属的指令执行后,将其状态设置为e说c她^
3) 当前状态为ex"wfed的内存单元被某指令修改后,将其状态设置为mod折";
4) 当前状态为moc/i/ W的内存单元所属的指令执行后,将其状态设置为 execw^/_a/to —7W^折W,并调用代码提取模块提取、保存该内存单元地址和内容;execwfe(q/ er—mo^/ M为修改后被执行的内存单元状态表示,上述代码提取模块将状态为 ex^她(fl,^m^折"的内存中的代码信息,视其为隐藏代码,存储到自修改代码链表 RepeatedRefRecord中,最后将链表中的数据存储到二进制文本文件中,提取出隐藏代码等 相关信息。
本实施例中所述自修改代码链表的数据结构格式如下
typedef struct SMCBlock(
DWORD StartAddress;
unsigned long REF—EIP_Counter;
struct RepeatedRefRecord * REF_EIP;
DWORD MOD—EIP;
unsigned long BlockID;
unsigned long BlockLengthj
void * CodeBlockj
struct SMCBlock * nexffilock; } SMC—BLOCK,*PSMC—BLOCK;
其中,StartAddress表示含有自修改代码的代码块的起始地址,REF—EIP—Counter用于 记录跳转到该块代码的指令的个数,REF—EIP记录跳转到该块代码的指令的信息, MOD—EIP保存修改该块代码的指令的EIP, BlockID为该代码块的标识符,BlockLength表 示该代码块的长度,而CodeBlock指向该代码的指针,nextBlock指向链表的下一个节点。
5) 当前状态为"ea^d—a/fer—的内存单元被某指令修改后,将其状态设置为
6) 当前状态为moc/诉ed的内存单元被某指令修改后,维持其状态wo^/ W不变。
第五步程序执行终止的标志。
由于事先无法判断某个可执行文件中是否存在隐藏的代码,因此本实施例设定一个具
体的时间阈值77meoW。程序不断截获指令并提取指令结构信息及指令中操作数的值,直到 程序执行API函数ExitProcess()或程序执行时间超过设定的nmeoW,程序结束。
尽管为说明目的公开了本发明的具体实施例和附图,其目的在于帮助理解本发明的内 容并据以实施,但是本领域的技术人员可以理解在不脱离本发明及所附的权利要求的精 神和范围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例和 附图所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。
权利要求
1、一种基于硬件模拟器的自修改代码识别方法,其步骤包括1)在硬件模拟器中添加一单步执行标志,仅使载入的目标可执行文件单步执行;并在所述目标可执行文件的代码段、数据段、堆和栈中均创建初始化影子内存,所述影子内存包括内存单元的状态;2)硬件模拟器截获所述目标可执行文件运行时的执行指令,提取指令结构信息,并将指令结构信息及由指令结构信息确定的操作数的值存储到扩展的翻译代码块缓存区中;3)利用上述指令结构信息、操作数的值,及指令的EIP值更新影子内存单元的状态,当所述影子内存单元的状态为修改后被执行时,识别出自修改代码。
2、 如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于 硬件模拟器不断截获执行指令并识别自修改代码,直到所述目标可执行文件执行API 函数ExitProcess()。
3、 如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于 硬件模拟器不断截获执行指令并识别自修改代码,直到所述目标可执行文件执行时间 超过设定的时间阈。
4、 如权利要求1或2或3所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于所述步骤3)后增加如下操作硬件模拟器中代码提取模块根据影子内存中 存储的内存单元的状态,实时提取自修改代码中隐藏的代码信息。
5、 如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于-步骤1)中所述影子内存还包括内存单元的指令地址和引用该内存单元的指令地址。
6、 如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于-所述步骤3)中影子内存状态更新的具体步骤如下若内存单元被指令修改后,将内存单元的状态设置为已修改; 若内存单元所述的指令被执行后,将内存单元的状态设置为已执行;若己执行的内存单元被指令修改后,将其内存单元的状态设置为己修改;若已修改的内存单元所述的指令被执行后,将其内存单元的状态设置为修改后被执行。
7、 如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于-所述指令结构信息包括指令的类型和操作数的地址。
8、 如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于: 所述步骤3)中截获执行指令的类型包括内存修改类指令和控制跳转类指令。
9、 如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:所述内存修改类指令包括MOV和ST0B。
10、 如权利要求l所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:所述控制跳转类指令包括JMP、 JZ和CALL。
全文摘要
本发明属于软件安全性测评技术领域,具体涉及一种基于硬件模拟器的自修改代码识别方法。本发明通过在硬件模拟器中设置标志,仅使目标可执行文件单步执行,截获虚拟系统执行指令,使用影子内存监控程序执行过程中的信息,识别提取程序执行过程中动态释放到内存中并得到执行的代码,获取分析目标的数据信息。本发明的数据采集是通过模拟硬件实现,而不是将恶意代码放在真实的CPU上执行,因此对实际系统不造成任何影响。本发明由于采用硬件模拟器作为动态分析的平台,因此不会对实际系统造成任何影响,同时提高了分析平台和代码之间的透明性,可有效抵御代码的检测。
文档编号G06F9/45GK101458630SQ20081024110
公开日2009年6月17日 申请日期2008年12月30日 优先权日2008年12月30日
发明者冯登国, 司端锋, 王祥根, 苏璞睿 申请人:中国科学院软件研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1