首页 / 专利库 / 专利权 / 国际初步审查 / 国际初步审查要求 / 选定 / 一种基于虚拟机的信息记录方法

一种基于虚拟机的信息记录方法

阅读:529发布:2021-06-12

专利汇可以提供一种基于虚拟机的信息记录方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种基于 虚拟机 的信息记录方法,该方法包括:虚拟机运行 选定 程序时,根据所述选定程序中的跳转指令分割所述选定程序,得到若干代码 块 ;以及在执行代码块的过程中,所述虚拟机监控事件发生,并按照事件发生的先后顺序记录事件标识和事件信息,所述事件信息包括:创建的线程或 进程 信息、加载的模块信息、进程分配的堆信息、进程创建的栈信息、数据改写信息、代码块信息、循环次数信息、新栈顶的 位置 信息、函数调用信息、函数返回信息、以及 中央处理器 CPU异常信息中之一或组合。该方案中记录信息的方式大大提高了记录效率,并且记录文件非常小,节省了存储空间;能够为后续信息分析提供更好的帮助。,下面是一种基于虚拟机的信息记录方法专利的具体信息内容。

1.一种基于虚拟机的信息记录方法,其特征在于,包括:
虚拟机运行选定程序时,根据所述选定程序中的跳转指令分割所述选定程序,得到若干代码;以及
在执行代码块的过程中,所述虚拟机监控事件发生,并按照事件发生的先后顺序记录事件标识和事件信息,所述事件信息包括:创建的线程或进程信息、加载的模块信息、进程分配的堆信息、进程创建的栈信息、数据改写信息、代码块信息、循环次数信息、新栈顶的位置信息、函数调用信息、函数返回信息、以及中央处理器CPU异常信息中之一或组合;具体包括:
若所述虚拟机监控到线程或进程的创建,则在日记文件中记录创建标识和创建的进程或线程信息;
若所述虚拟机监控到模块加载,则在所述日记文件中记录加载标识和加载的模块信息;
若所述虚拟机监控到进程分配堆,则在所述日记文件中记录加载标识和分配的堆信息;
若所述虚拟机监控到进程创建栈,则在所述日记文件中记录加载标识和创建的栈信息;
若所述虚拟机监控到数据改写,则判断记录的当前信息类型是否是代码块信息,若是,则在所述日记文件中记录信息类型切换标识和数据改写信息;否则,则在所述日记文件中记录数据改写信息;
所述虚拟机执行完一个代码块后,则判断所述当前信息类型是否是数据改写信息,若是,则在所述日记文件中记录所述信息类型切换标识和代码块信息;否则,则在所述日记文件中记录代码块信息;
所述虚拟机执行完一个代码块后,判断寄存器的值是否改变,若改变,则在所述日记文件中记录栈顶变化标识和新栈顶的位置信息;若执行完的代码块的最后一个跳转指令为函数调用指令,则在所述日记文件中记录函数调用标识;以及,若所述最后一个跳转指令为函数返回指令,则在所述日记文件中记录函数返回标识;以及,若执行完的代码块与上一个代码块的起始地址和终止地址均相同,则在所述日记文件中记录循环标识和循环次数信息;
若虚拟机监控到CPU异常,则在所述日记文件中记录异常标识和CPU异常信息。
2.如权利要求1所述的方法,其特征在于,所述创建标识为VM_THEAD;
所述创建的进程信息的结构为设定字节的进程标识ID;
所述创建的线程信息的结构为设定字节的线程ID。
3.如权利要求1所述的方法,其特征在于,所述加载标识为VM_MEMORY;
所述加载的模块信息的结构为设定字节的进程ID、二分之一设定字节的模块名长度、模块名字符串、设定字节的模块加载的基地址、设定字节的模块映射的内存大小、设定字节模块文件的大小、模块文件的二进制数据;
所述分配的堆信息的结构为设定字节的进程ID、二分之一设定字节的模块名长度、设定字节的模块加载的基地址、设定字节的堆大小、设定字节的无用数据;
所述创建的栈信息的结构为设定字节的进程ID、二分之一设定字节的模块名长度、设定字节的模块加载的基地址、所述字节的模块加载的基地址、设定字节的栈大小、设定字节的无用数据。
4.如权利要求1所述的方法,其特征在于,所述信息类型切换标识为VM_ESCAPE;
所述数据改写信息的结构为设定字节的进行数据改写指令的地址、设定字节的数据改写的起始地址、设定字节的记录长度、记录的数据内容。
5.如权利要求1所述的方法,其特征在于,所述异常标识为VM_EXCPTION,所述CPU异常信息结构为四分之一设定字节的异常类型、二分之一设定字节的异常特征位、设定字节的程序执行地址、设定字节的异常访问地址。
6.如权利要求1所述的方法,其特征在于,所述栈顶变化标识为VM_STACK;
所述新栈顶的位置信息的结构为设定字节的新栈顶位置。
7.如权利要求1所述的方法,其特征在于,所述信息类型切换标识为VM_ESCAPE;
所述代码块信息的结构为设定字节的代码块的起始地址、设定字节的代码块的结束地址。
8.如权利要求1所述的方法,其特征在于,所述函数调用标识为VM_CALL。
9.如权利要求1所述的方法,其特征在于,所述函数返回标识为VM_RET。
10.如权利要求1所述的方法,其特征在于,所述循环标识为VM_LOOP;所述循环次数信息的结构为4个字节的循环次数。

说明书全文

一种基于虚拟机的信息记录方法

技术领域

[0001] 本发明涉及通信领域,尤指一种基于虚拟机的信息记录方法。

背景技术

[0002] 目前,记录程序数据改写和代码等信息的方式主要有两种:第一种是使用调试器记录程序运行的信息,常用的调试器有Safforn、PolyUnpack等等,这种方式记录效率比较高,但是程序可以通过反调试技术进行对抗,这样就会导致调试器崩溃或记录错误的信息;第二种是使用虚拟机记录程序运行的信息,虚拟机是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,常用的虚拟机有Renovo、Malware Normalization、PandorasBochs等,这种方式可以避开大部分程序的反调试,但是这种方式需要在记录文件中记录执行每条指令的信息,无论该条指令信息对后续信息分析是否有用,都会在记录文件中记录,最终得到的记录文件非常大,这样就会导致记录效率低、占用存储空间多;并且这种方式记录的信息类型非常有限,这就会不利于后续进行信息分析。

发明内容

[0003] 本发明实施例提供一种基于虚拟机的信息记录方法,用以解决现有技术中存在的使用虚拟机记录程序运行的信息时记录效率低、占用存储空间多且不利于后续进行信息分析的问题。
[0004] 一种基于虚拟机的信息记录方法,包括:
[0005] 虚拟机运行选定程序时,根据所述选定程序中的跳转指令分割所述选定程序,得到若干代码块;以及
[0006] 在执行代码块的过程中,所述虚拟机监控事件发生,并按照事件发生的先后顺序记录事件标识和事件信息,所述事件信息包括:创建的线程或进程信息、加载的模块信息、进程分配的堆信息、进程创建的栈信息、数据改写信息、代码块信息、循环次数信息、新栈顶的位置信息、函数调用信息、函数返回信息、以及中央处理器CPU异常信息中之一或组合。
[0007] 本发明有益效果如下:
[0008] 本发明实施例提供了一种基于虚拟机的信息记录方法,该方案虚拟机运行选定程序时,根据所述选定程序中的跳转指令分割所述选定程序,得到若干代码块;以及在执行代码块的过程中,所述虚拟机监控事件发生,并按照事件发生的先后顺序记录事件标识和事件信息,所述事件信息包括:创建的线程或进程信息、加载的模块信息、进程分配的堆信息、进程创建的栈信息、数据改写信息、代码块信息、循环次数信息、新栈顶的位置信息、函数调用信息、函数返回信息、以及中央处理器CPU异常信息中之一或组合。该方案将选定程序分割为若干个代码块,程序运行过程中,以代码块为单位,记录代码块的执行信息,这种以代码块为单位进行信息记录的方式相对于现有技术中需要记录每条执行指令的信息的方式,大大提高了记录效率,并且记录文件非常小,节省了存储空间;并且,还记录了新栈顶的位置信息、数据改写信息、代码块的信息、函数调用标识、函数调用信息、函数返回标识、函数返回信息、循环次数信息、异常信息,这些信息能够为后续信息分析提供更好的帮助。附图说明
[0009] 图1为本发明实施例中的基于虚拟机的信息记录方法的流程图
[0010] 图2为本发明实施例中的虚拟机监控事件发生和记录事件信息的流程图。

具体实施方式

[0011] 针对现有技术中存在的使用虚拟机记录程序运行的信息时记录效率低、占用存储空间多且不利于后续进行信息分析的问题,本发明实施例提供了一种基于虚拟机的信息记录方法,该方法的流程如图1所示,具体执行步骤如下:
[0012] S10:虚拟机运行选定程序时,根据选定程序中的跳转指令分割选定程序,得到若干代码块。
[0013] S11:虚拟机执行得到的代码块。
[0014] 可以利用动态翻译技术来分割选定程序,S11中执行代码块的过程和S10中的分割代码块的过程是同时进行的,不用等到将程序全部解析完代码块后再运行,节省了时间。
[0015] S12:在执行代码块的过程中,虚拟机监控事件发生,并按照事件发生的先后顺序记录事件标识和事件信息。
[0016] 事件信息包括:创建的线程或进程信息、加载的模块信息、进程分配的堆信息、进程创建的栈信息、数据改写信息、代码块信息、循环次数信息、新栈顶的位置信息、函数调用信息、函数返回信息、以及中央处理器CPU异常信息中之一或组合。
[0017] 要记录的信息有很多种,为了便于区分各类信息,以及后续能快速解析序列化后的日记文件,可以在每个信息前添加用设定字节的事件标识,在标识后紧接事件信息。这些信息的顺序是按照事件发生的先后顺序排列的,真实反应了选定程序的流程。当选定程序为32位时,设定字节为4个字节,事件标识为4个字节;当选定程序为64位时,设定字节为8个字节,事件标识为8个字节。
[0018] 该方案将选定程序分割为若干个代码块,程序运行过程中,以代码块为单位,记录代码块的执行信息,这种以代码块为单位进行信息记录的方式相对于现有技术中需要记录每条执行指令的信息的方式,大大提高了记录效率,并且记录文件非常小,节省了存储空间;并且,还记录了新栈顶的位置信息、数据改写信息、代码块的信息、函数调用标识、函数调用信息、函数返回标识、函数返回信息、循环次数信息、异常信息,这些信息能够为后续信息分析提供更好的帮助。
[0019] 具体的,上述S12中的虚拟机监控事件发生,并按照事件发生的先后顺序记录事件标识和事件信息,如图2所示,具体包括以下之一或组合:
[0020] S120:虚拟机监控事件发生。
[0021] S121:若虚拟机监控到线程或进程的创建,则在日记文件中记录创建标识和创建的进程或线程信息,执行S120。
[0022] S122:若虚拟机监控到模块加载,则在日记文件中记录加载标识和加载的模块信息,执行S120。
[0023] S123:若虚拟机监控到进程分配堆,则在日记文件中记录加载标识和分配的堆信息,执行S120。
[0024] S124:若虚拟机监控到进程创建栈,则在日记文件中记录加载标识和创建的栈信息,执行S120。
[0025] S125:若虚拟机监控到数据改写,则判断记录的当前信息类型是否是代码块信息,若是,则在日记文件中记录信息类型切换标识和数据改写信息;否则,则在日记文件中记录数据改写信息,执行S120。
[0026] 代码块的信息和数据改写的信息是程序运行后的最常见的信息,会被频繁记录,所以在日记文件中大部分都是代码块信息和数据改写信息,为了节省空间,代码块信息和数据改写信息不需要使用不同的标识,只需要通过信息类型切换标识来代表这两种信息的切换即可。可以维护一个当前信息类型,该当前信息类型表征在此之前最后执行的是数据改写还是代码块,可以根据当前信息类型来确定是否需要记录信息类型切换标识。
[0027] S126:虚拟机执行完一个代码块后,则判断当前信息类型是否是数据改写信息,若是,则在日记文件中记录信息类型切换标识和代码块信息;否则,则在日记文件中记录代码块信息,执行S120。
[0028] S127:虚拟机执行完一个代码块后,判断寄存器的值是否改变,若改变,则在日记文件中记录栈顶变化标识和新栈顶的位置信息,执行S120。
[0029] 每执行完每一个代码块后,判断寄存器的值(对于32位选定程序,是esp寄存器;对于64位选定程序则是rsp寄存器)是否改变,若改变,则表示程序栈顶有变化,则记录栈顶变化标识和新栈顶的位置信息;所以,栈顶变化的信息不是按照指令粒度的,而是代码块粒度的。
[0030] S128:若执行完的代码块的最后一个跳转指令为函数调用指令,则在日记文件中记录函数调用标识,执行S120。
[0031] 当执行完一个代码块后,由于每个代码块是按跳转指令来分割的,函数调用指令也被虚拟机认为是一条跳转指令,因此,可判断这个代码块最后一条指令是否为函数调用指令,若是,则记录函数调用标识。
[0032] S129:若最后一个跳转指令为函数返回指令,则在日记文件中记录函数返回标识,执行S120。
[0033] 当执行完一个代码块后,由于每个代码块是按跳转指令来分割,函数返回指令也被虚拟机认为是一条跳转指令,因此,可判断这个代码块最后一条指令是否为函数返回指令,若是,则记录函数返回标识。
[0034] S130:若执行完的代码块与上一个代码块的起始地址和终止地址均相同,则在日记文件中记录循环标识和循环次数信息,执行S120。
[0035] 由于每个代码块是按跳转指令来分割,每执行一个代码块,都可以判断该代码块和上一个代码块的起始地址和结束地址是否一样,若一样,则认为是一个循环,记录循环次数信息。
[0036] S131:若虚拟机监控到CPU异常,则在日记文件中记录异常标识和CPU异常信息,执行S120。
[0037] 若执行完代码块发生CPU异常,则虚拟机会捕获到CPU异常,则在日记文件中记录异常标识和CPU异常信息。
[0038] 具体的,上述创建标识为VM_THEAD。
[0039] 创建的进程信息的结构为设定字节的进程标识(Identification,ID)。
[0040] 创建的线程信息的结构为设定字节的线程ID。
[0041] 对于32位选定程序来说,设定字节为4个字节,那么,创建的进程信息的结构为4个字节的进程ID,创建的线程信息的结构为4个字节的线程ID,若此时线程尚未创建,可记录选用的特殊值,例如-1等。对于64位选定程序来说,设定字节为8个字节。
[0042] 具体的,上述加载标识为VM_MEMORY。
[0043] 加载的模块信息的结构为设定字节的进程ID、二分之一设定字节的模块名长度、模块名字符串、设定字节的模块加载的基地址、设定字节的模块映射的内存大小、设定字节模块文件的大小、模块文件的二进制数据。
[0044] 创建的堆信息的结构为设定字节的进程ID、二分之一设定字节的模块名长度、设定字节的模块加载的基地址、设定字节的堆大小、设定字节的无用数据。
[0045] 创建的栈信息的结构为设定字节的进程ID、二分之一设定字节的模块名长度、设定字节的模块加载的基地址、设定字节的模块加载的基地址、设定字节的栈大小、设定字节的无用数据。
[0046] 对于32位选定程序来说,设定字节为4个字节,那么,加载的模块信息的结构为4个字节的进程ID、2个字节的模块名长度、模块名字符串、4个字节的模块加载的基地址、4个字节的模块映射的内存大小、4个字节模块文件的大小、模块文件的二进制数据;其中,模块名长度的值必不为0,因为模块必有名字;模块名字符串的长度由前面2字节指定;模块文件的二进制数据的长度由前面4字节指定。
[0047] 创建的堆信息的结构为4个字节的进程ID、2个字节的模块名长度、4个字节的模块加载的基地址、4个字节的堆大小、4个字节的无用数据;其中,2个字节的模块名长度的值必为0,因为堆没有名字,所以可以根据这点来区分模块信息和堆信息;堆的基地址都是按0x1000对齐,例如0x470000,所以最低位必为0;4个字节的无用数据,用于和加载的模块的信息结构一致。
[0048] 创建的栈信息的结构为4个字节的进程ID、2个字节的模块名长度、4个字节的模块加载的基地址、4个字节的模块加载的基地址、4个字节的栈大小、4个字节的无用数据。其中,2个字节的模块名长度的值必为0,因为栈也没有名字;4个字节的模块加载的基地址,栈的基地址也是按0x1000对齐,但这里为了区别栈和堆,在最低位标志位2,例如0x100002;4个字节的无用数据,用于和加载的模块的信息结构一致。
[0049] 对于64位选定程序来说,上述信息结构中的设定字节为8个字节,具体的信息结构不再说明。
[0050] 记录加载的模块的信息、创建的堆的信息和创建的栈的信息时,使用的是同样的标识,即VM_MEMORY,之所以三种信息共用一个标识,是为了减少日记文件的大小。
[0051] 具体的,上述信息类型切换标识为VM_ESCAPE。
[0052] 数据改写信息的结构为设定字节的进行数据改写指令的地址、设定字节的数据改写的起始地址、设定字节的记录长度、记录的数据内容。
[0053] 对于32位选定程序来说,设定字节为4个字节,数据改写信息的结构为4个字节的进行数据改写指令的地址、4个字节的数据改写的起始地址、4个字节的记录长度、记录的数据内容。其中,写入的数据内容的长度是由前面4个字节指定的。对于64位选定程序来说,设定字节为8个字节。
[0054] 具体的,上述异常标识为VM_EXCPTION。
[0055] CPU异常信息结构为四分之一设定字节的异常类型、二分之一设定字节的异常特征位、设定字节的程序执行地址、设定字节的异常访问地址。
[0056] 对于32位选定程序来说,设定字节为4个字节,那么,CPU异常信息结构为1个字节的异常类型,2个字节的异常特征位,4个字节程序执行地址,4个字节异常访问地址。对于64为选定程序来说,设定字节为8个字节。
[0057] 具体的,上述栈顶变化标识为VM_STACK。
[0058] 新栈顶位置信息的结构为设定字节的新栈顶位置。
[0059] 对于32位选定程序来说,设定字节为4个字节,那么,新栈顶位置信息的结构为4个字节的新栈顶位置。对于64为选定程序来说,设定字节为8个字节。
[0060] 具体的,上述信息类型切换标识为VM_ESCAPE。
[0061] 代码块信息的结构为设定字节的代码块的起始地址、设定字节的代码块的结束地址。
[0062] 对于32位选定程序来说,设定字节为4个字节,那么,代码块信息的结构为4个字节的代码块的起始地址、4个字节的代码块的结束地址。对于64为选定程序来说,设定字节为8个字节。
[0063] 其中,结束地址都是一个跳转指令,原因是程序运行后,代码中会有多个跳转,而这些跳转可能是一个循环,也可能是一个函数调用,以跳转指令来分割程序为若干代码块,有利于分析程序流程。而在现有技术中基于虚拟机记录的方式中,都是针对指令来记录信息,而不是针对代码块来记录记录,针对指令记录信息的方式使得日记文件非常大,而本申请中针对代码块来记录信息的方式使得日记文件很小。
[0064] 具体的,上述循环标识为VM_LOOP。
[0065] 循环次数信息的结构为4个字节的循环次数。
[0066] 对于32位选定程序来说,设定字节为4个字节,那么,循环次数信息的结构为4个字节的循环次数。对于64为选定程序来说,设定字节为8个字节。
[0067] 当记录上述信息后,研究人员可以解析记录信息的日记文件,然后分析这些信息,将之应用到很多领域,例如:利用记录的日记文件可实现自动脱壳、进行病毒分析、实行漏洞分析和挖掘等等。该方案中记录信息的方式较易实现,记录的信息能够为后续分析提供更好的帮助,并且记录效率高,节省了存储空间。
[0068] 显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈