一种代码保护虚拟机KVM系统实现方法、装置、计算机设备及存储介质与流程

文档序号:17539234发布日期:2019-04-29 14:22阅读:236来源:国知局
一种代码保护虚拟机KVM系统实现方法、装置、计算机设备及存储介质与流程

本发明涉及计算机代码保护领域,具体涉及代码保护虚拟机kvm系统实现方法。



背景技术:

随着移动互联网的飞速发展,其广泛的应用充斥着人们的生活,移动应用市场急剧膨胀扩张。但是在应用安全性方面的缺失,直接导致企业应用被逆向破解,业务执行逻辑被阻断,病毒植入、仿冒侵权、信息截取等黑客攻击,严重影响了企业收益与用户体验。

攻击者的攻击手法主要有针对端和链路的攻击。由于移动应用运行在用户终端之上,攻击者只需要逆向破解端应用,就可以非法利用程序漏洞分析程序的脆弱性。基于此,端和链路的防护技术也是层出不穷,从加壳、代码混淆到java2c,基于代码加密强度和兼容性,代码虚拟化技术被提出。通过代码虚拟化技术,对代码进行转换加密,使得攻击者无法得知具体的转换指令,进而达到保护代码信息的目的。其不可逆的特性防止攻击者逆向分析客户端代码,从而保证客户端代码安全。

传统代码虚拟化技术必须通过java虚拟机提供的jni接口与java虚拟机进行交互,攻击者可以直接将代码虚拟化方案当作黑盒,通过自定义的jni接口对象,对黑盒内部进行探测、记录和分析,进而得到完整dex程序。

因此,为解决现有技术中存在的不足,设计一种加固强度更高、可移植性更好、兼容性更好的代码保护虚拟机kvm系统是亟待解决的技术问题。



技术实现要素:

本发明的目的在于针对现有技术的缺陷和不足,提供一种代码保护虚拟机kvm系统方法、装置、计算机设备及存储介质。

一种代码保护虚拟机kvm系统实现方法,包括以下步骤:

步骤1,生成伪代码字节流:把用户待保护的核心代码通过编译器翻译为伪代码字节流;

所述步骤1的编译器为llvm编译器,所述llvm编译器是模块化、可复用的编译器工具链集合。

步骤2,生成虚拟机指令:将伪代码字节流转换为核心代码的虚拟机指令;

所述虚拟机指令的生成,是通过虚拟机工具链将伪代码字节流直译为自定义构造的虚拟机指令。

步骤3,生成虚拟机:源包中插入软件开发工具包生成虚拟机运行环境和虚拟机解释引擎;

所述步骤3中的虚拟机运行环境包括感知环境变化的探针,所述探针可以实时探测虚拟机环境的非正常流程变化。

步骤4,应用打包:待步骤2和步骤3完成之后,在代码研发平台进行应用打包,生成目标代码;

步骤5,在虚拟机中执行核心代码:核心代码的虚拟机指令由内嵌入虚拟机运行环境中的虚拟机解释引擎,采取读取-分派的方式执行。

一种代码保护虚拟机kvm系统装置,其中

包括以下模块:

编译模块,用于将待保护的核心代码通过编译器翻译为伪代码字节流;

虚拟机模块,包括用于生成虚拟机运行环境和虚拟机解释引擎,以及将伪代码字节流生成核心代码的虚拟机指令;

所述虚拟机指令是通过虚拟机工具链将伪代码字节流转换得到,所述虚拟机工具链包括虚拟cpu解释引擎以及完备虚拟指令,虚拟机模块在代码研发平台进行应用打包,生成目标代码。

运行模块:用于在app内部隔离出独立的执行环境中,将核心代码的虚拟机指令由虚拟机解释引擎采取读取-分派的方式执行。

一种计算机设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现所述代码保护虚拟机kvm方法的步骤。

一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现所述代码保护虚拟机kvm方法的步骤。

采用上述技术方案,本发明有益效果为:本发明提供的代码保护虚拟机kvm方法、系统是通过自定义的虚拟cpu指令,将函数级别的代码完全虚拟化后编码为自由指令集格式,代码一旦虚拟化,永不解密,其不可逆的特性可避免核心技术被逆向分析,从而达到非常高的安全强度;

本代码保护虚拟机kvm系统实现方法通过对源文件的函数单位进行选择性虚拟化,具备粒度细,可控性高,隐蔽性强等特点;

本代码保护虚拟机kvm实现方法通过在编译器内部产生平台依赖代码之前对代码进行虚拟化,不依赖特定系统环境,无兼容性问题,天然兼容所有cpu架构;

本代码保护虚拟机kvm系统基于llvm-ir中间代码进行虚拟化,成功后再生成目标代码,不干预正常app运行。

附图说明

为了更清楚地说明本发明的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例提供的kvm系统实现方法流程示意图;

图2为本申请实施例提供的kvm系统的虚拟机指令流程示意图;

图3为本申请实施例提供的kvm系统打包成目标文件的一示意图;

图4为本申请实施例提供的kvm系统虚拟机执行示意图。

图5为本申请实施例提供的kvm系统装置模块图;

图6是本发明一实施例中计算机设备的一示意图。

具体实施方式

下面结合附图对本发明作进一步的说明。传统加固防护技术在不断演进,从加壳、代码混淆到java2c,大家都在努力探索行之有效的防御技术和产品,以应对日益严峻的黑灰产威胁。不容乐观的是,针对传统防御技术的破解工具层出不穷,防御效果大打折扣,同时,传统的加固技术也满足不了iot行业的需求。为解决现有技术中加固强度不足、可移植性差、兼容性差等问题,本申请提供一种代码虚拟化技术。

下文以该技术的执行主体为代码虚拟化模块为例,对该技术的实施方式进行介绍。可以理解,该技术的执行主体为代码虚拟化模块只是一种示例性的说明,并不应理解为对该技术的限定。

如图1-图3所示,本代码保护虚拟机kvm系统实现方法,其实现主要包括以下步骤:

s1生成伪代码字节流:把用户待保护的核心代码通过编译器翻译为伪代码字节流;

s2,生成虚拟机指令:将伪代码字节流转换为核心代码的虚拟机指令;

s3,生成虚拟机:源包中插入软件开发工具包生成虚拟机运行环境和虚拟机解释引擎;

s4,应用打包:待步骤2和步骤3完成之后,在代码研发平台进行应用打包,生成目标代码;

s5,在虚拟机中执行核心代码:核心代码的虚拟机指令由内嵌入虚拟机运行环境中的虚拟机解释引擎,采取读取-分派的方式执行。

可选的,所述虚拟机指令的生成,是通过虚拟机工具链将伪代码字节流直译为自定义构造的虚拟机指令。

所述虚拟机工具链包括编译器、软件开发工具包、虚拟机解释引擎以及完备虚拟指令。

所述完备虚拟机指令,在本实施例中可以理解为将所有的伪代码字节流全部转换为虚拟机指令,包括所有的mov/push/add指令等以及指令与指令的交叉互用,所有源arm/arm64/x86/x64架构系统机器的语言映射,都一一做了自定义和优化,相当于重新做了一套系统,实现了源系统的所有指令,以及指令与指令的交叉互用的指令转换。

可选的,编译器为llvm编译器,所述llvm编译器是模块化、可复用的编译器工具链集合,同时所述llvm编译器参与步骤2的虚拟机指令,步骤3的虚拟机的生成。

可选的,虚拟机运行环境包括感知环境变化的探针,所述探针可以实时探测虚拟机环境的非正常流程变化。

如图1-2所示,以下实施例详细的介绍本发明所述方法的具体步骤,

s1中,一种实施中,生成伪代码字节流是通过编译器套件llvm编译器将待保护的源代码(如c、c++、objective-c)通过编译器前端等价转换为中间二进制文件(也称伪代码字节流、字节码bytecode);bytecode(字节码)是llvm-ir(中间表示)的一种表现形式;简单来说就是把源代码转换成自定义的llvm-ir指令;llvm编译器是模块化、可复用的编译器工具链集合,它提供了非常完整的api操作接口,可以自定义整个编译过程。

简单来说就是把c/c++/objective-c源代码转换成自定义的llvm-ir指令。用户对待保护的代码在代码研发平台上进行编译处理,在编译成bytecode时,只是对源码进行了中间码编译转换,待保护的代码并未产生平台依赖代码,

s2,生成虚拟机指令是在待保护核心代码在编译为中间二进制文件之后,kvm系统开始执行中间二进制文件到核心代码的虚拟机指令的转换;简单来说是把自定义的llvm-ir指令通过虚拟机工具链转换为目标平台的机器码文件,机器码文件的形式包括.o格式;

虚拟机指令是对原本的系统汇编指令集进行一次自定义映射封装,将原本的汇编指令映射关系进行了更改,更换了一套映射关系,不影响指令的使用,但是原本指令的作用需要根据映射后的指令作用来执行。如果对源代码使用了虚拟化技术,那么在编译这段代码的时候就会使用等效的虚拟机指令来达到同样的功能;当然,该转换形式多变,且在转换过程中需要结合堆栈指令,运算指令等指令进行综合配合来一起完成系统汇编指令到虚拟机指令的映射转换。

在没有虚拟化的情境中,伪代码字节流会通过研发平台编译器转换为系统汇编指令,伪代码字节流和系统汇编指令有一个映射关系。进行虚拟化,是将这个系统映射关系进行了自定义,这样一来映射关系就发生了变化,本领域的技术人员可以理解为,在本实施例中是通过自定义的虚拟机工作链将伪代码字节流转换成虚拟机指令,这里相当于直接对系统指令进行舍弃,用虚拟机指令来充当系统指令:比如:原本伪代码aaa对应系统汇编addaa;现在变更为:原本伪代码aaa,对应虚拟机pushaa;就相当于把系统汇编指令addaa翻译为虚拟机指令pushaa。

虚拟机指令的有自己的机器码,但和原本的系统汇编机器码完全不一样,而且常常是一堆无意义的代码,它们只能由kvm虚拟解释引擎来解释并执行。

s3,生成虚拟机,具体包括运行环境和虚拟机解释引擎。源包中插入软件开发工具包生成虚拟机运行环境和虚拟机解释引擎;所述源包是由用户自研发的c/c++/oc源代码工程文件。所述软件开发工具包在本实施例中是虚拟机so文件,虚拟机so文件由设计者自定义开发,通过这个虚拟机so文件来执行虚拟化。由于虚拟化是在应用编译成最终执行文件之前执行的,所以最终在编译运行的可执行文件件中保留下来可见的so文件(打包后的文件中),它的代码逻辑只有一个出入口,实现真正的代码隐藏。

虚拟机运行环境中还会提供反调试和监控功能,虚拟机源码保护执行环境可以通过自身的探针感知环境的变化,实施探测到外界对虚拟机运行环境的调试,注入等非正常执行流程变化,如果检测到当前app正在被调试,则返回调试器所在进程的进程名,中断当前应用进程。如果app没有被调试,则保护该app不再被其他程序调试。通过双进程实现反调试和调试保护,根据系统原理可以知道一个进程只允许有一个调试器,所以在进程起来的同时,虚拟机运行环境会fork一个daemon(守护进程),并ptrace被保护的app进程,守护进程会拦截调试器的入口,保证其他程序无法再调试当前app。守护进程一旦激活,就会一直存在,直到当前应用退出,如果强行关闭守护进程,当前app也会随之关闭。

关于虚拟机解释引擎,参考执行示意图,如图4所示,vstartvm部分初始化虚拟机,vmdispatcher负责调度这些handler,handler可以理解为一个个的子函数(功能代码),它是每一个虚拟机指令对应的执行功能代码,每一条虚拟机指令对应着一个handler执行模块。虚拟机的加壳指令会导致代码膨胀,被虚拟机加壳后,同样一条指令被翻译成了虚拟机指令,一条虚拟机指令往往对应着好几倍的等效代码,整个handler加起来可能就等效为原本的一条系统汇编指令。bytecode就是虚拟伪指令,在程序中,vmdispatcher是一个类while结构,不断的循环读取伪指令,然后执行。

s4,应用打包是在待保护核心代码进行虚拟化之后,即可在代码研发平台进行应用打包,直至成功生成目标代码,该方式生成的应用无平台兼容性问题,与原始应用兼容性一致。

s5,在虚拟机中执行核心代码是将由设计者开发的开发工具包so文件构造的虚拟机,在app内部生成虚拟机环境,即在app内部单独隔离出的执行环境中运行虚拟机解释引擎。

该步骤虚拟机部分初始化,在此自定义的虚拟解释引擎对中间二进制文件进行解释执行,通过自定义虚拟解释引擎解释成不同语言的中间代码从而实现跨平台跨语言运行,所以从该步骤可以看出,kvm系统不依赖特定系统环境,无兼容性问题,天然兼容所有cpu架构;

由于虚拟机运行环境是由设计者开发开发工具包so文件来构造的虚拟机,从抽象意义来形容,就是在app内部(开发工具包so文件代码附加在源码之中),开发工具包so文件来生成虚拟机环境,在app内部单独隔离了一个执行环境,虚拟机解释引擎在此隔离环境中运行,即便app被破解,该部分核心代码仍不可见。

应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。

如图5所示,本代码保护虚拟机系统包括编译模块10;虚拟机模块20;运行模块30。

在一实施例中,提供一种代码保护虚拟机kvm系统装置,该代码保护虚拟机kvm系统装置与上述实施例中代码保护虚拟机kvm系统实现方法对应。

一种代码保护虚拟机kvm系统装置,包括以下模块:

编译模块10,用于将待保护的核心代码通过编译器翻译为伪代码字节流。

虚拟机模块20,用于生成虚拟机运行环境和虚拟机解释引擎,以及将伪代码字节流生成核心代码的虚拟机指令;虚拟机模块在代码研发平台进行应用打包,生成目标代码。

运行模块30:用于运行目标代码时将核心代码的虚拟机指令由虚拟机解释引擎采取读取-分派的方式执行。

通过编译模块10首先把用户待保护的核心代码翻译为原系统和人都无法识别的自定义ir指令集(在具体执行时再对这些自定义ir指令集进行一一翻译解释,逐步还原为原始代码并执行),随后虚拟机模块20生成用于翻译自定义ir指令集并负责具体执行的子程序(也称虚拟机,一个抽象的cpu)。虚拟机,包括虚拟机运行环境和虚拟机解释引擎。它以一个函数的形式存在,函数的参数就是字节码的内存地址。通过运行模块30,最后会在app内部隔离出独立的执行环境,该部分核心代码的子程序(虚拟机)在此独立的执行环境里运行。

可选的,所述虚拟机指令是通过虚拟机工具链将伪代码字节流转换得到,所述虚拟机工具链包括虚拟cpu解释引擎以及完备虚拟指令。

可选的,所述虚拟机解释引擎是在app软件内部隔离区中的虚拟机运行环境中执行的。

可选的,所述虚拟机运行环境提供反调试和监控功能。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图6所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部服务器通过网络连接通信。该计算机程序被处理器执行时以实现一种代码保护虚拟机kvm系统实现方法。

在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:

s1,生成伪代码字节流:把用户待保护的核心代码通过编译器翻译为伪代码字节流;

s2,生成虚拟机指令:将伪代码字节流转换为核心代码的虚拟机指令;

s3,生成虚拟机:源包中插入软件开发工具包生成虚拟机运行环境和虚拟机解释引擎;

s4,应用打包:待步骤2和步骤3完成之后,在代码研发平台进行应用打包,生成目标代码;

s5,在虚拟机中执行核心代码:运行目标代码时,核心代码的虚拟机指令由内嵌入虚拟机运行环境中的虚拟机解释引擎,采取读取-分派的方式执行。

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:

s1,生成伪代码字节流:把用户待保护的核心代码通过编译器翻译为伪代码字节流;

s2,生成虚拟机指令:将伪代码字节流转换为核心代码的虚拟机指令;

s3,生成虚拟机:源包中插入软件开发工具包生成虚拟机运行环境和虚拟机解释引擎;

s4,应用打包:待步骤2和步骤3完成之后,在代码研发平台进行应用打包,生成目标代码;

s5,在虚拟机中执行核心代码:运行目标代码时,核心代码的虚拟机指令由内嵌入虚拟机运行环境中的虚拟机解释引擎,采取读取-分派的方式执行。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。

所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。

以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1