CN101458630B - 一种基于硬件模拟器的自修改代码识别方法 - Google Patents
一种基于硬件模拟器的自修改代码识别方法 Download PDFInfo
- Publication number
- CN101458630B CN101458630B CN2008102411050A CN200810241105A CN101458630B CN 101458630 B CN101458630 B CN 101458630B CN 2008102411050 A CN2008102411050 A CN 2008102411050A CN 200810241105 A CN200810241105 A CN 200810241105A CN 101458630 B CN101458630 B CN 101458630B
- Authority
- CN
- China
- Prior art keywords
- code
- storage location
- internal storage
- hardware simulator
- 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.)
- Active
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明属于软件安全性测评技术领域,具体涉及一种基于硬件模拟器的自修改代码识别方法。本发明通过在硬件模拟器中设置标志,仅使目标可执行文件单步执行,截获虚拟***执行指令,使用影子内存监控程序执行过程中的信息,识别提取程序执行过程中动态释放到内存中并得到执行的代码,获取分析目标的数据信息。本发明的数据采集是通过模拟硬件实现,而不是将恶意代码放在真实的CPU上执行,因此对实际***不造成任何影响。本发明由于采用硬件模拟器作为动态分析的平台,因此不会对实际***造成任何影响,同时提高了分析平台和代码之间的透明性,可有效抵御代码的检测。
Description
技术领域
本发明属于软件安全性测评技术领域,具体涉及一种基于硬件模拟器的自修改代码识别方法。
背景技术
自修改代码(Self-Modifying Code,SMC)是指代码在执行过程中有意修改自身代码,使实际运行的代码和执行之前的静态二进制表示不相同,以隐藏指令以及程序的执行流程等信息。
SMC是有效抵御静态逆向分析的技术之一,广泛应用于软件保护和恶意代码等领域,目的是防止软件破解等代码分析人员使用逆向工程工具(如常见的反汇编工具)对程序进行静态分析,增加逆向分析人员对受保护代码的程序分析理解的难度。
由于静态分析方法与动态分析方法相比在分析全面性等方面具有明显的优势,目前仍然是最主要的代码分析方法,被广泛应用于恶意代码分析和软件安全测评工作中。但是随着SMC等反逆向分析技术的日益完善和广泛使用,静态分析方法的分析能力受到越来越多的约束。对于采用SMC技术保护的代码,往往由于实际执行的代码和静态二进制表示不一致,因此静态分析几乎无能为力。如何利用动态分析方法识别并提取SMC中隐藏的代码,并将其恢复到原可执行文件中是目前针对SMC的主要研究思路。
发明内容
本发明的目的是通过对不同类型的SMC的剖析,掌握SMC的技术原理,提供一种基于硬件模拟器的自修改代码识别的方法。
本发明通过设置标志,仅使目标可执行文件单步执行,并截获虚拟***执行指令,使用影子内存监控程序执行过程中的内存写操作以及控制转移指令等信息,识别提取程序执行过程中动态释放到内存中并得到执行的代码,获取分析目标的数据信息。由于在硬件模拟器中对可执行文件进行动态分析,本发明的数据采集是通过模拟硬件实现,而不是将恶意代码放在真实的CPU上执行,因此对实际***不造成任何影响。同时,恶意代码无法感知自身是否运行在虚拟环境中,也无法分辨自身是否被跟踪,从而实现对恶意代码完全透明的分析。
本发明提供一种基于硬件模拟器的自修改代码识别方法,具体步骤如下:
1、以单步执行方式运行可执行文件
在硬件模拟器新添加的一单步执行标志,载入目标可执行文件,利用控制寄存器中CR3的值识别目标可执行文件;使所述的目标可执行文件以单步执行方式运行,模拟器中其他进程的运行模式保持不变。
2、在硬件模拟器中创建并初始化影子内存
为可执行文件进程的内存空间创建并初始化一个影子内存(shadow memory),利用影子内存记录程序执行过程中内存的状态。创建影子内存的内存单元范围包括:可执行文件进程所属的代码段、数据段、堆和栈。内存单元的影子内存至少包括内存单元的状态,还可以包括修改内存单元的指令地址以及引用该内存单元的指令地址。
3、截获执行指令,提取指令结构
硬件模拟器中的译码引擎将可执行文件中的目标指令翻译为翻译代码块(TranslationBlock,TB),执行目标可执行文件,硬件模拟器中的指令处理模块截获执行指令,并提取指令结构。
需截获分析的指令类型分为两类:内存修改类指令(如MOV、STOB等)和控制跳转类指令(如JMP、JZ、CALL等),指令处理模块将上述提取的指令结构信息存储到扩展的TB缓冲区(Expanded TB Cache,ETB)中。
在代码执行过程中,指令处理模块根据ETB中存储的指令结构信息,通过实时获取寄存器和内存单元的内容确定指令中操作数的值。所述指令结构信息包括:指令的类型,操作数的地址。
4、在对程序执行监控过程中,影子内存管理模块利用步骤3中截获的指令类型、操作数的地址和数值分析指令修改的目标内存地址范围,并结合程序执行过程中指令的EIP,分析执行的指令所占有的内存范围,从而实时更新影子内存中的相应的内存单元的状态等内容,并根据内存单元的状态识别出自修改代码。
指令处理模块不断截获指令并提取指令结构信息及指令中操作数的值,并不断根据内存单元的状态识别出自修改代码,直到程序执行API函数ExitProcess()或程序执行时间超过设定的时间阈,程序执行结束,同时自修改代码的识别结束。
本发明的优点和积极效果如下:
1.本发明充分利用硬件模拟器的优势,通过对模拟器***的改造,识别提取分析目标中的隐藏代码,即程序执行过程中动态释放到内存中并得到执行的代码等信息。
2.本发明仅仅使目标执行文件进程运行在单步模式下,其他进程执行模式不变,提高了分析效率。
3.由于采用硬件模拟器作为动态分析的平台,因此不会对实际***造成任何影响,同时提高了分析平台和代码之间的透明性,可有效抵御代码的检测。
附图说明
图1本发明自修改代码识别方法的结构示意图;
图2本发明自修改代码识别的流程图;
图3本发明实施例中影子内存状态更新示意图;
其中:00:clean;01:executed;10:modified;11:executed after modified。
具体实施方式
下面结合附图,对本发明的技术内容做进一步的说明。
参照图1,本发明通过将硬件模拟器***的翻译代码块扩展为翻译代码块的缓存区,并在硬件模拟器中加入影子内存;在程序运行时,拦截虚拟***指令,获取分析目标的数据信息。在改造后的硬件模拟器中对可执行文件进行动态分析,通过监控程序执行过程中的内存写操作以及控制转移指令等信息,识别提取程序执行过程中动态释放到内存中并得到执行的代码,最后利用动态分析过程中获取的控制跳转等信息,将提取的代码恢复到原可执行文件中,生成完整的,和原可执行文件执行流程、功能相同的二进制文件。如图2所示,下面给出自修改代码识别和提取的详细过程。
第一步:在硬件模拟器中载入目标可执行文件P,通过控制寄存器中CR3的值获得对应的目标程序P,设置模拟器中新添加的单步执行标志TSingleStep。模拟器在对目标程序P翻译时,首先检测该进程的单步执行标志,由于设置了单步执行标志TSingleStep,模拟器每次仅翻译一条指令,即目标程序P运行在单步模式,模拟器中运行的其他进程运行模式保持不变。
修改硬件模拟器译码引擎中用于查找和翻译TB的函数,使硬件模拟器虚拟CPU认为翻译目标进程的指令都需要重新翻译,翻译后再执行。在翻译的时候,硬件模拟器检测目标进程的单步标志,若设置了单步标志,则模拟器每次只翻译一条指令。本发明在硬件模拟器中新添加的一个单步执行标志,用于有效抵御代码对其执行环境的检测。
在虚拟CPU执行指令之前,首先判断单步标志,如果设置了该标志,则每次执行时,CPU的PC指针只向后移动一个指令大小,从而实现进程的单步执行。
第二步:创建并初始化影子内存,影子内存包括内存单元的状态、修改内存单元的指令地址及引用该内存单元的指令地址,本实施例的影子内存按照如下格式设计:
struct ShadowMem{
enum State StateNow;
DWORD MOD_EIP;
struct RepeatedRefRecord*REF_EIP;
};
其中StateNow表示内存单元的状态,MOD_EIP表示修改内存单元的指令地址,链表RepeatedRefRecord中存储引用该内存单元的指令地址。该影子内存结构中,因考虑对同一地址的多次跳转的情况,对跳转指令地址使用链表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表示引用内存单元的目标地址,nextRefRecord指向该链表的下一个节点。
第三步:截获执行指令,提取指令结构信息以及指令中操作数的值;指令结构信息主要是指指令类型,所有关注的指令分为两类:内存修改类指令和控制跳转指令。
控制跳转类指令包括JMP、CALL等指令,用于触发对执行位置转移的检查;内存修改类指令包括MOV、STOB等指令,用于触发对内存数据修改的检查。
指令类型具体的数据使用如下格式:
enum InstructionType{
JMP,
MOV
};
在代码执行过程中,指令处理模块根据ETB中存储的指令结构信息,通过模拟器提供的接口函数,如cpu_memory_rw_debug()等,实时获取寄存器和内存单元的内容,从而确定指令中操作数的值。通过指令的类型、操作数的地址和值,可以分析执行指令修改的目标内存范围以及指令所占有的内存范围,以便于更新影子内存中相应的内存单元的状态。
第四步:更新影子内存内容,提取隐藏代码。在对程序执行监控过程中,影子内存管理模块利用上述截获指令所获取的指令类型、操作数的地址和数值信息,以及指令对应的EIP,实时更新影子内存中的相应内存单元的状态。代码提取模块根据影子内存中存储的内存单元的状态,提取存储隐藏的代码等相关信息。
影子内存管理模块可以通过分析指令的类型和操作数的地址和值,判断指令修改的目标内存地址范围,结合内存单元的当前状态对影子内存中相应的内存单元的状态进行更新;同时,该模块可以通过指令的EIP和指令结构信息,分析该指令占用的内存范围,结合内存单元的当前状态更新该指令对应的影子内存中内存单元的状态。
影子内存状态更新示意图如图3所示。影子内存状态更新的具体步骤如下:
对于某个内存区域,可执行文件载入后的初始状态为clean;
1)当前状态为clean的内存单元被某指令修改后,将其状态设置为modified;
2)当前状态为clean的内存单元所属的指令执行后,将其状态设置为executed;
3)当前状态为executed的内存单元被某指令修改后,将其状态设置为modified;
4)当前状态为modified的内存单元所属的指令执行后,将其状态设置为executed_after_modified,并调用代码提取模块提取、保存该内存单元地址和内容;executed_after_modified为修改后被执行的内存单元状态表示,上述代码提取模块将状态为executed_after_modified的内存中的代码信息,视其为隐藏代码,存储到自修改代码链表RepeatedRefRecord中,最后将链表中的数据存储到二进制文本文件中,提取出隐藏代码等相关信息。
本实施例中所述自修改代码链表的数据结构格式如下:
typedef struct SMCBlock{
DWORD StartAddress;
unsigned long REF_EIP_Counter;
struct RepeatedRefRecord*REF_EIP;
DWORD MOD_EIP;
unsigned long BlockID;
unsigned long BlockLength;
void*CodeBlock;
struct SMCBlock*nextBlock;
}SMC_BLOCK,*PSMC_BLOCK;
其中,StartAddress表示含有自修改代码的代码块的起始地址,REF_EIP_Counter用于记录跳转到该块代码的指令的个数,REF_EIP记录跳转到该块代码的指令的信息,MOD_EIP保存修改该块代码的指令的EIP,BlockID为该代码块的标识符,BlockLength表示该代码块的长度,而CodeBlock指向该代码块的指针,nextBlock指向链表的下一个节点。
5)当前状态为executed_after_modified的内存单元被某指令修改后,将其状态设置为modified;
6)当前状态为modified的内存单元被某指令修改后,维持其状态modified不变。
第五步:程序执行终止的标志。
由于事先无法判断某个可执行文件中是否存在隐藏的代码,因此本实施例设定一个具体的时间阈值Timeout。程序不断截获指令并提取指令结构信息及指令中操作数的值,直到程序执行API函数ExitProcess()或程序执行时间超过设定的Timeout,程序结束。
尽管为说明目的公开了本发明的具体实施例和附图,其目的在于帮助理解本发明的内容并据以实施,但是本领域的技术人员可以理解:在不脱离本发明及所附的权利要求的精神和范围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例和附图所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。
Claims (9)
1.一种基于硬件模拟器的自修改代码识别方法,其步骤包括:
1)在硬件模拟器中添加一单步执行标志,仅使载入的目标可执行文件单步执行;并在所述目标可执行文件的代码段、数据段、堆和栈中均创建初始化影子内存,所述影子内存包括内存单元的状态;
2)硬件模拟器截获所述目标可执行文件运行时的执行指令,提取指令结构信息,并将指令结构信息及由指令结构信息确定的操作数的值存储到扩展的翻译代码块缓存区中;
3)利用上述指令结构信息、操作数的值,及指令的EIP值更新影子内存单元的状态,当所述影子内存单元的状态为修改后被执行时,识别出自修改代码;
所述影子内存状态更新的具体步骤如下:
若内存单元被指令修改后,将内存单元的状态设置为已修改;
若内存单元所属的指令被执行后,将内存单元的状态设置为已执行;
若已执行的内存单元被指令修改后,将其内存单元的状态设置为已修改;
若已修改的内存单元所属的指令被执行后,将其内存单元的状态设置为修改后被执行。
2.如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:硬件模拟器不断截获执行指令并识别自修改代码,直到所述目标可执行文件执行API函数ExitProcess()。
3.如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:硬件模拟器不断截获执行指令并识别自修改代码,直到所述目标可执行文件执行时间超过设定的时间阈。
4.如权利要求1或2或3所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:所述步骤3)后增加如下操作:硬件模拟器中代码提取模块根据影子内存中存储的内存单元的状态,实时提取自修改代码中隐藏的代码信息。
5.如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:步骤1)中所述影子内存还包括内存单元的指令地址和引用该内存单元的指令地址。
6.如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:所述指令结构信息包括指令的类型和操作数的地址。
7.如权利要求1所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:所述步骤2)中截获执行指令的类型包括内存修改类指令和控制跳转类指令。
8.如权利要求7所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:所述内存修改类指令包括MOV和STOB。
9.如权利要求7所述的一种基于硬件模拟器的自修改代码识别方法,其特征在于:所述控制跳转类指令包括JMP、JZ和CALL。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008102411050A CN101458630B (zh) | 2008-12-30 | 2008-12-30 | 一种基于硬件模拟器的自修改代码识别方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008102411050A CN101458630B (zh) | 2008-12-30 | 2008-12-30 | 一种基于硬件模拟器的自修改代码识别方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101458630A CN101458630A (zh) | 2009-06-17 |
CN101458630B true CN101458630B (zh) | 2011-07-27 |
Family
ID=40769506
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008102411050A Active CN101458630B (zh) | 2008-12-30 | 2008-12-30 | 一种基于硬件模拟器的自修改代码识别方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101458630B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8789138B2 (en) * | 2010-12-27 | 2014-07-22 | Microsoft Corporation | Application execution in a restricted application execution environment |
CN103379103A (zh) * | 2012-04-24 | 2013-10-30 | 长春易申软件有限公司 | 线性与加密解密的硬件实现方法 |
CN102930210B (zh) * | 2012-10-14 | 2015-11-25 | 江苏金陵科技集团有限公司 | 恶意程序行为自动化分析、检测与分类***及方法 |
CN103116714A (zh) * | 2013-03-01 | 2013-05-22 | 中标软件有限公司 | 一种Windows平台可执行文件双进程保护方法 |
CN104239200B (zh) * | 2013-06-20 | 2018-10-30 | 上海博达数据通信有限公司 | 一种硬单步***中内存读写监控方法 |
CN104598808B (zh) * | 2015-01-08 | 2018-02-16 | 中国科学院信息工程研究所 | 基于寄存器架构的Android应用完整性验证方法 |
CN110515652B (zh) * | 2019-08-30 | 2021-10-15 | 腾讯科技(深圳)有限公司 | 代码摘要的生成方法、装置和存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5568380A (en) * | 1993-08-30 | 1996-10-22 | International Business Machines Corporation | Shadow register file for instruction rollback |
US6055503A (en) * | 1997-08-29 | 2000-04-25 | Preview Systems | Software program self-modification |
CN1836210A (zh) * | 2003-07-15 | 2006-09-20 | 可递有限公司 | 用于在程序代码转换中划分代码的方法和装置 |
-
2008
- 2008-12-30 CN CN2008102411050A patent/CN101458630B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5568380A (en) * | 1993-08-30 | 1996-10-22 | International Business Machines Corporation | Shadow register file for instruction rollback |
US6055503A (en) * | 1997-08-29 | 2000-04-25 | Preview Systems | Software program self-modification |
CN1836210A (zh) * | 2003-07-15 | 2006-09-20 | 可递有限公司 | 用于在程序代码转换中划分代码的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN101458630A (zh) | 2009-06-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101458630B (zh) | 一种基于硬件模拟器的自修改代码识别方法 | |
CN109583200B (zh) | 一种基于动态污点传播的程序异常分析方法 | |
CN101714118B (zh) | 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法 | |
CN102760098B (zh) | 面向bit软件测试的处理器故障注入方法及其模拟器 | |
Yin et al. | Temu: Binary code analysis via whole-system layered annotative execution | |
CN101645119B (zh) | 一种基于虚拟硬件环境的恶意代码自动分析方法及*** | |
CN110580226B (zh) | 操作***级程序的目标码覆盖率测试方法、***及介质 | |
CN104834859A (zh) | 一种Android应用中恶意行为的动态检测方法 | |
CN103389939B (zh) | 一种针对堆可控分配漏洞的检测方法及*** | |
Haller et al. | Mempick: High-level data structure detection in c/c++ binaries | |
CN101388055B (zh) | 一种用于漏洞模型检测的程序操作特征提取方法 | |
CN104679495A (zh) | 软件识别方法及装置 | |
CN113778616A (zh) | 一种电力物联网终端虚拟化模拟仿真平台及仿真方法 | |
CN114741700B (zh) | 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 | |
Ren et al. | A dynamic taint analysis framework based on entity equipment | |
CN102708054A (zh) | 二进制程序循环写内存安全漏洞的检测方法 | |
Cesati et al. | A memory access detection methodology for accurate workload characterization | |
CN114443418A (zh) | 一种基于硬件虚拟化的riscv内存溢出漏洞检测方法及装置 | |
Zhu et al. | Dytaint: The implementation of a novel lightweight 3-state dynamic taint analysis framework for x86 binary programs | |
Zhu et al. | Implementation of an effective dynamic concolic execution framework for analyzing binary programs | |
US11886589B2 (en) | Process wrapping method for evading anti-analysis of native codes, recording medium and device for performing the method | |
Lin et al. | VMRe: A reverse framework of virtual machine protection packed binaries | |
KR102421394B1 (ko) | 하드웨어와 소프트웨어 기반 트레이싱을 이용한 악성코드 탐지 장치 및 방법 | |
WO2024079794A1 (ja) | 解析機能付与装置、解析機能付与方法および解析機能付与プログラム | |
Chen et al. | SEVE: Symbolic execution based vulnerability exploring system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | 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 |