吴伟民,许文锋,林志毅,司 斯,阮奕邦
(广东工业大学计算机学院,广东 广州 510006)
基于增强型虚拟机的软件保护技术*
吴伟民,许文锋,林志毅,司 斯,阮奕邦
(广东工业大学计算机学院,广东 广州 510006)
针对目前日益严峻的软件保护问题,对现有基于虚拟机的软件保护技术进行分析与研究,对虚拟机保护技术进行了改进,设计了一种增强型虚拟机软件保护技术。采用了虚拟花指令序列与虚拟指令模糊变换技术,并对虚拟机的虚拟指令系统做了改进,从而提高了虚拟机执行的复杂程度与迷惑程度,具有高强度的反逆向、防篡改、防破解的特点。实验分析表明,增强型虚拟机保护技术明显优于普通型虚拟机保护技术。
虚拟机;软件保护;虚拟花指令;模糊变换
计算机软件是一种知识密集型的数字产品,软件的研发非常复杂,研制及维护周期很长,需要耗费大量的人力物力资源,是软件开发人员辛勤劳动的成果。但是,大量软件破解行为使得商业软件和共享软件作者的利益受到严重侵害,他们的生存和发展将会受到严重影响。因此,软件保护技术的研究与实现是目前软件产业发展的重中之重。
为了保护软件,人们提出了一系列的软件保护技术,如序列号保护方式、授权文件保护、代码混淆、加壳、软件数字水印等[1],虽然这些技术取得了一定的成效,但是这些方式的保护强度都不是很高。近年来,软件保护技术又出现了一个新的进步,那就是虚拟机技术,它通过对代码的虚拟化来达到保护软件的目的[2]。基于虚拟机的软件保护技术,它虚拟出一套自己设计的指令系统,用于将一系列指令放在一个解释引擎中执行。在该指令系统中,大部分常用的汇编指令都可以用虚拟机中的相应指令代替[3]。虽然虚拟机保护技术在反逆向、反破解方面优于其他保护技术,但是逆向工程师通过分析大量虚拟指令以及虚拟机执行过程,软件代码仍有被逆向还原的可能性[4]。为了增加代码保护强度、降低被逆向还原的可能性,本文提出了基于增强型虚拟机软件保护技术,这种新的软件保护技术融合了虚拟花指令序列和虚拟指令模糊变换技术,从保护虚拟机本身代码安全的角度出发,在最大程度上保护了软件代码。
在软件领域经常用到有关虚拟机的概念,比如VMWare,它是指虚拟出一个CPU运行整个操作系统,包含软件、硬件等各方面的虚拟化[3]。本文所指的虚拟机并不是像VMware那样的虚拟机,而更像是一个进程级的高级语言虚拟机。它拥有自定义独立的指令系统——虚拟指令系统,这种指令系统和Intel的x86指令系统并不在一个层次上。它还将我们所熟悉的x86汇编指令流转换为ByteCode(字节码),ByteCode是虚拟机解释执行被保护代码功能时所需的一串字节流。Java虚拟机、.Net或者其他脚本语言的虚拟机都是靠解析ByteCode来执行的,但它们之间的ByteCode并不通用,因为每一个虚拟机设计的ByteCode都是为自己使用的,并不兼容其他的虚拟机。利用虚拟机技术保护软件,用户可以选择软件中需保护代码块,把代码块反汇编成汇编指令流,然后用自定义的虚拟指令系统中的虚拟指令替换对应的汇编指令,在发布时,将整个虚拟机嵌入软件本身一起发布。在运行被保护代码时,由虚拟机解释执行ByteCode。
虚拟机保护对PE(Portable Execute)文件的处理流程如图1所示。PE文件格式是WIN32环境自带的跨平台可执行文件格式,常见的EXE、DLL、OCX、SYS、COM 等文件均是PE文件[5]。
虚拟机保护系统首先从PE中提取需保护代码块,通常以函数为单位来提取,然后通过反汇编器反汇编成我们常见的x86汇编指令流,再把汇编指令流转换成ByteCode存储在PE文件中。转换之后,PE文件中被保护代码的正确运行需要虚拟机解释执行ByteCode,因此,整个虚拟机其实是内嵌在PE文件中的,它包括跳转表、虚拟指令调度器和虚拟指令系统。
Figure 1 Process of virtual machine software protection图1 虚拟机软件保护处理流程
由于虚拟机是通过解释执行ByteCode来完成原始代码的功能,所以经过虚拟机保护后的PE文件会增大,被保护后的代码块运行效率会降低,因此,虚拟机保护只适用于保护PE文件中重要的代码块,而不是PE文件中的所有代码。提取方式通常以函数为单位,根据函数的起始地址与结束地址确定需保护代码块。
反汇编器将上一步提取的代码块反汇编成汇编指令流,比如,8B442404对应的汇编指令为mov eax,dword ptr[esp+4]。我们具体借助现有成熟的反汇编器来实现这一功能,将汇编语言作为中间语言,这样有利于快速高效地将x86机器码转换为ByteCode,从而可以把工作重点放在虚拟机保护核心技术的研究上。
虚拟机由虚拟指令系统、虚拟指令调度器和跳转表组成,它负责解释执行ByteCode,执行完被保护代码块功能后,退出虚拟机,并正确返回至被保护代码块下一处x86汇编指令。为了更清楚地认识虚拟机的组成与虚拟机在PE文件结构中是如何操作的,下面以图的方式展示对一个函数(functionA)进行虚拟机保护的过程。functionA被虚拟机保护前后,PE文件内容对比如图2所示。
虚拟机的各个组成部分和ByteCode在PE文件中的位置如图2所示。图2a中functionA为待保护汇编指令流,经过ByteCode转换器转换为ByteCode,并存储在PE文件最末尾新增区块中,在此例中,ByteCode存储在图2b的0040D400处。functionA函数被替换为图2b中的push/jmp两条指令。函数被虚拟机保护后,当需要执行函数时,由push/jmp两条指令跳转至虚拟机执行,由虚拟机解释执行ByteCode完成函数功能。
Figure 2 PE context comparison of virtual before machine protection and after machine protection图2 虚拟机保护前后PE文件内容对比
(1)虚拟指令调度器。
虚拟指令调度器通过读取ByteCode来调度虚拟指令,相当于CPU的执行调度器。虚拟指令是一小段汇编程序,各种虚拟指令组成了虚拟指令系统。图2b中VMDispatcher即是虚拟指令调度器,它其实也是一条虚拟指令。经虚拟机保护后,函数执行时,由push/jmp指令转入虚拟机执行。调度器的调度过程如下:
①进入虚拟机后,首先执行VStartVM指令,它将所有寄存器的值压入堆栈,然后为虚拟环境结构(VMContext)分配堆栈空间。VMContext是虚拟机执行时要用到的各种虚拟寄存器,即模拟一个CPU的上下文环境,它用一个结构体来虚拟化所有寄存器。
②执行VMDispatcher指令,它通过读取ByteCode流,调度虚拟指令。调度的第一条指令是Vbegin指令,这条指令的ByteCode码为“1B”,如图2b所示。
③执行Vbegin指令,它把所有寄存器的值赋值给VMContext结构,然后跳转至VMDispatcher。
④VMContext结构被初始化后,虚拟机开始真正执行被保护代码的功能,每执行一条虚拟指令,都需要跳转至VMDispatcher,由它调度下一条虚拟指令继续执行
(2)虚拟指令系统。
虚拟指令的设计分为两大类,第一类是堆栈虚拟指令,第二类是普通虚拟指令。由原始汇编指令转换为虚拟指令,首先必须经过堆栈虚拟指令的处理,然后由普通虚拟指令从栈中取出参数进行功能操作。部分虚拟指令如图3所示。
Figure 3 Some virtual instructions图3 部分虚拟指令
图3中1、2、3为堆栈虚拟指令,4为普通虚拟指令,其中,esi指向ByteCode,edi指向 VMContext。VPushImm32的功能是把一个32位立即数入栈。VPopReg32的功能是把当前栈中的值压入VMContext中的虚拟寄存器。VPushReg32的功能是把VMContext中的虚拟寄存器的值压入栈中。VAdd的功能是从当前栈中去源操作数与目的操作数进行相加,然后把结果压入栈中。
这种方法实现虚拟指令系统的优点是:需要用到操作数的虚拟指令不必去管操作数从哪儿来,这些操作数交给堆栈虚拟指令处理。原始汇编指令转换为虚拟指令序列如图4所示,括号中的参数来自于ByteCode。
Figure 4 Original assemble instruction transformed into virtual instruction series图4 原始汇编指令转换为虚拟指令序列
(3)跳转表。
跳转表起着映射虚拟指令地址的作用,为了使虚拟机保护系统每次处理PE文件后,ByteCode码对应的虚拟指令不一样,增加被逆向还原的难度。虚拟指令存放在PE文件之前,通过随机的方式为每一条虚拟指令编码,然后通过公式“虚拟指令地址=[X*4+跳转表地址]”计算出虚拟指令的地址,最后把虚拟指令的地址存放在跳转表中,而这个编码则写入ByteCode中,作为映射虚拟指令的ByteCode码。因此,虚拟机在执行的时候,可以逆向计算出虚拟指令的地址。通过这种方法处理,使得同一个PE文件,每次处理后的ByteCode都不一样。
以图2b中ByteCode码“9D”为例,通过公式“虚拟指令地址=[X*4+跳转表地址]”计算出“9D”对应的地址为“00406456”,所以“9D”对应的虚拟指令是VPushImm32。X表示ByteCode,跳转表地址在此例中的值为“00406000”。
ByteCode转换器相当于一个虚拟指令编译器,它根据自定义的虚拟指令系统,把x86汇编指令流转换为只能被此虚拟机才能识别执行的字节流。
以图2a“mov eax,dword ptr[esp+4]”指令为例,它被转换成了9D04000000 9D01000000…。下面介绍它的转换方法。这条指令的源操作数为一内存数,内存数的真实结构是[imm+reg*scale+reg2],在转换源操作数的过程中,需要计算这四个值,这四个值分别为:imm=00000004,scale=00000001,reg=00000024(VMContext中的偏移值),reg2=FFFFFFFF(值为负,表示忽略此寄存器),把这四个值写入ByteCode中,有了这四个值,虚拟机执行时就可以取出[esp+4]表示的内存值,因此mov eax,dword ptr[esp+4]指令被转换为如下虚拟指令序列:
生成的ByteCode如图2b所示,“9D”映射了VpushImm32指令,“9D”后面紧跟着的“00000004”是第一条VpushImm32指令的参数。其他指令亦是如此:凡是虚拟指令要用到的参数,在此虚拟指令对应的ByteCode后面的数据即是参数。前4条指令是把源操作数的4个参数入栈,第5条指令压入[esp+4]内存地址的值,第6条指令是压入VMContext中的v_eax的偏移,第7条指令取内存数值,压入当前真实堆栈,第8条指令把当前堆栈值出栈到VMContext中的v_eax。经过这一系列的虚拟指令的执行,实现了把esp+4对应的内存值,赋值给了VMContext中的v_eax。执行完mov eax,dword ptr[esp+4]指令后,继续执行inc eax,虚拟机实际上是把VMContext中的v_eax进行加一操作。虚拟机解释执行完所有ByteCode后,VMContext中的各种虚拟寄存器的值与未经虚拟机保护执行得到的寄存器的值是相同的。所以,在退出虚拟机时,把虚拟机执行得到的VMContext的值一一对应赋值给真实寄存器,这样才能保证程序继续执行。总的来说,被保护代码段被ByteCode转换器转换成ByteCode,虚拟机在解释执行ByteCode的过程中,需要执行一系列虚拟指令,才能完成一条原始汇编指令的功能,而一条虚拟指令又是由多条汇编指令组成。因此,把一条原始汇编指令转换为N条汇编指令来执行,而且这N条汇编指令逻辑性强,缺一不可,通过这样的高强度的复杂化,使得逆向还原难度大大增加。
增强型虚拟机软件保护是针对普通型虚拟机保护的虚拟指令系统做的改进。普通型虚拟指令系统本身并没有被保护,逆向工程师通过对每一条虚拟指令的功能分析,最终还是可以破解被虚拟机保护的代码。而作者提出的增强型虚拟机软件保护融入了两种技术:一种是虚拟花指令序列,另一种是虚拟指令模糊变换。花指令也称为伪指令、垃圾指令。花指令加密技术通过在程序代码中插入无效指令或不影响原始代码功能的无用指令来破坏反汇编的结果和增加代码分析难度,以达到加密保护的目的[6]。虚拟花指令序列技术主要是在虚拟机执行的虚拟指令序列中加入冗余虚拟指令,用来增加逆向工程师对虚拟机的分析难度。虚拟指令模糊变换技术是对有效虚拟指令作代码变换,用来破坏反汇编器的结果,达到保护代码的目的。
虚拟花指令序列被执行后,它不影响原始虚拟指令序列的执行结果。因此,在设计虚拟花指令序列时,应注意虚拟花指令序列不能改变VMContext中虚拟寄存器的值。为了简化代码实现,所有的虚拟花指令都不带操作数。部分虚拟花指令的实现如图5所示。
第1、2条虚拟花指令的功能是对VMContext中的v_eax进行出入栈操作,其他虚拟寄存器的出入栈花指令类似于第1、2条指令,只是v_eax的值不一样。第3条是加法花指令,实现方法与普通加法指令相同。
Figure 5 Some virtual junk instructions图5 部分虚拟花指令
通过简单的出入栈虚拟花指令、加减法虚拟花指令就可以组合成多种虚拟花指令序列,只要保证不破环VMContext和堆栈中的值。以下是其中一种虚拟花指令序列的实现:
第2、3、4、5条指令是把 VMContext中v_ebx与v_eax的和赋值给v_eax,而第1条指令保存了相加前v_eax的值,执行完加法后,第6条指令把相加前的值还原给v_eax,所以经过这一系列虚拟花指令的执行,并没有改变虚拟机执行的结果,但是它起到了干扰逆向工程师的作用。以上序列其实是虚拟化了如下花指令:push eax;add eax,ebx;pop eax。
虚拟花指令序列比传统花指令更具优势,每一种虚拟花指令序列可以放在常规虚拟指令序列的任何位置。而传统花指令采用较多的一种形式是无条件跳转指令jmp加花指令,另一种形式是直接程序代码中的jmp指令后添加花指令[7]。这两种形式受代码中jmp指令个数的限制,如果jmp指令数太少,则迷惑效果不明显。
虚拟指令模糊变换是在有效虚拟指令里面加入花指令,又在花指令里面设计一个伪分支,伪分支中加入不可执行代码,通过伪分支来迷惑反汇编器,打乱反汇编结果,达到保护虚拟指令的目的。反汇编器的工作原理大致有两种:一种是线性扫描法[8],反汇编器从程序代码的第一个可执行字节开始,依次逐个地将程序中的二进制代码反汇编成相应的汇编指令;另一种方法是递归扫描法[9],反汇编器沿着程序的指令执行控制流来一步一步进行反汇编,将二进制代码反汇编成相应的汇编指令。在递归扫描中,由于反汇编器不会去判断分支代码正确与否,它们只是将跳转地址的代码进行反汇编[9]。因此,如果在虚拟指令中加入一些伪分支,并使得这些伪分支永远不可能执行到,然后在伪分支内添加不可执行代码,那么反汇编器很有可能将这些不可执行代码与其后代码结合在一起,从而使得反汇编结果错误。虚拟指令模糊变换方法如图6所示。
Figure 6 Virtual instruction transformation图6 虚拟指令模糊变换
图6中VinstructionA为一条虚拟指令,instruction为汇编指令。y的值为非0随机值,因此这段花指令执行cmp指令后,永远不可能跳转到flag1处执行,只会跳转到flag2处执行,flag2还原了eax的值,所以这一系列执行并没有影响程序的功能。如果在flag1处添加不可执行的乱码,反汇编器在分析这段代码时,很有可能将乱码与其后的代码结合在一起,从而使得反汇编结果出错。通过这种方法对虚拟指令进行模糊变换,使得反汇编器得不到正确的虚拟指令结果,逆向工程师很难分析虚拟机的代码,因此在虚拟机软件保护方案中,增加虚拟指令模糊变换技术,极大地提高了反逆向、防破解的强度。
硬件环境:处理器Intel(R)Pentium(R)D CPU 2.8GHz、内存4.0GB。
软件环境:操作系统32bit Windows 7,反汇编调试器OllyICE v1.10,普通型虚拟机软件保护系统BProtect.exe,增强型虚拟机软件保护系统BProtectPlus.exe,测试用例genfile.exe。
(1)普通型虚拟机保护处理。
使用BProtect.exe对genfile.exe进行虚拟机保护处理,生成genfile_vmp.exe,使用 OllyICE对genfile_vmp.exe进行反汇编调试,找到VAdd虚拟指令的反汇编结果,如图7所示。
(2)增强型虚拟机保护处理。
使用BProtectPlus.exe对genfile.exe进行虚拟机保护处理,生成genfile_vmpplus.exe,使用OllyICE对genfile_vmpplus.exe进行反汇编调试,找到VAdd虚拟指令的反汇编结果,如图8所示,生成的ByteCode如图9所示,跳转表如图10所示,虚拟花指令代码如图11所示。
Figure 7 VAdd’s disassemble result under normal virtual machine protection图7 普通型虚拟机保护处理下VAdd的反汇编结果
Figure 8 VAdd’s disassemble result of improved virtual machine protection图8 增强型虚拟机保护处理下VAdd的反汇编结果
Figure 9 ByteCode图9 ByteCode
Figure 10 Jumping table图10 跳转表
图8中画线部分代码是增强型虚拟机保护对VAdd虚拟指令进行的模糊变换,粗线部分代码是模糊变换中的不可执行乱码。从图8与图7的对比中可看出,VAdd虚拟指令经过模糊变换后,je跳转处的不可执行代码确实与其后的两条正常指令结合在一起,第一条被结合的指令是图6中花指令中的最后一条pop eax,机器码为58;第二条被结合的指令是VAdd虚拟指令中的mov ebx,dword ptr[esp],机器码为8B1C24。因此,它达到了使反汇编器的反汇编结果出错的目的。经验证,模糊变换后的虚拟指令能正常运行,整个程序的运行也正常,并且使用OllyICE的花指令去除插件,也不能将虚拟指令中的花指令去掉。
Figure 11 Virtual junk code图11 虚拟花指令代码
而图7中未经过任何改变的VAdd虚拟指令,只有五条汇编指令,很容易被逆向工程师得知此虚拟指令的功能。但是,增强型虚拟机软件保护技术融合了虚拟指令模糊变换技术后,反汇编结果出错,使得虚拟指令的破解难度明显增强。
下面再来分析验证虚拟花指令序列在虚拟机软件保护中起的重要作用。在增强型虚拟机软件保护方案中,增加了虚拟花指令序列,图9中阴影部分为虚拟花指令序列的ByteCode,根据3.3节中虚拟指令地址公式计算得出虚拟花指令的地址。下面验证虚拟机执行时,是否执行了新增加的虚拟花指令序列。计算虚拟花指令地址以图9中阴影部分第一个字节“25”为例。本次实验中,公式中的“跳转表地址”为00406000。所以25*4+00406000=00406094,从图10跳转表中查找00406094处的值为00406636,再从图11中可以看到,此处对应的虚拟花指令正是RPush_Veax。通过同样的计算方法可以计算出图9阴影部分剩下的五个字节分别对应的虚拟指令是:RPush_Vebx、RPush_Veax、RAdd、RPop_Veax、RPop_Veax。因此,新增加的六个ByteCode码确实有执行,并且按照以上六条虚拟花指令的顺序执行完,并没有改变程序的任何结果,但是增加了虚拟机执行的虚拟指令数量,提高了虚拟机执行的复杂度,起到了迷惑逆向工程师的作用。经验证,添加虚拟花指令序列的程序运行正常,而未添加虚拟花指令序列的普通型虚拟机保护强度明显弱于增强型虚拟机保护。
经过以上实验结果分析表明,融入了虚拟花指令序列和虚拟指令模糊变换的增强型虚拟机软件保护强度优于普通型虚拟机软件保护强度。
本文提出了新的增强型虚拟机保护技术,融入了虚拟花指令序列与虚拟指令模糊变换,前者通过一系列不影响程序功能的虚拟指令序列,干扰逆向工程师的分析效率;后者通过对虚拟指令构造不可到达的伪分支,使得反汇编器解析虚拟指令时,把伪分支的乱码与其后的正常代码结合在一起,从而造成反汇编结果错误。这样从两个方面增加了反逆向的难度,达到进一步保护软件的目的。
实验结果也表明了新方法的有效性,能够在保持正确性的同时增加逆向分析的难度。下一步工作将研究多种变换策略,使得每条虚拟指令尽量使用不同的变换策略,从而进一步增加破解难度,达到最大化保护软件的目的。
[1] Tang Zhan-yong,Wang Huai-jun,Fang Ding-yi,et al.Research on software protection RISC-based virtual machine technology[J].Microelectronics &Computer,2011,28(8):1-3.(in Chinese)
[2] Bughoho.Virtual machine technology subject argumentation[EB/OL]. [2007-07-07]. http://bbs.pediy.com/showthread.php?t=47633&tcatid=60.(in Chinese)
[3] Shu Bo-cheng,Li Yi-chao,Cao Yue,et al.Research on software protection based on virtual machine[J].Computer Engineering &Science,2008,30(A1):25-28.(in Chinese)
[4] Duan Gang.Encrypt and decrypt[M].Beijing:Publishing House of Electronics Industry,2008.(in Chinese)
[5] Li Lu,Liu Qiu-ju,Xu Ting-rong.On unpacking technology for PE files[J].Computer Applications and Software,2010,27(9):279-282.(in Chinese)
[6] Wang Hai-ping,Cao Lin,Sun Guo-zhi,et al.Study of stochastic junk code encryption algorithm [J].Journal of Computer Applications,2006,26(2):338-340.(in Chinese)
[7] Sun Guo-zi,Cai Qiang,Cheng Dan-wei,et al.Study on encryption algorithm of sub-function junk code[J].Computer Engineering and Applications,2009,45(3):130-132.(in Chinese)
[8] Kruegel C,Robertson W,Valeur F,et al.Static disassembly of obfuscated binaries[C]∥Proc of the 13th Conference on USENIX Security Symposium,2004:18.
[9] Schwarz B,Debray S,Andrews G.Disassemble of executable code revisited[C]∥Proc of the 9th Working Conference on Reverse Engineering,2002:45-54.
附中文参考文献:
[1] 汤战勇,王怀军,房鼎益,等.基于精简指令集的软件保护虚拟机技术研究与实现[J].微电子学与计算机,2011,28(8):1-3.
[2] Bughoho.虚拟机技术专题讨论[EB/OL].[2007-07-07].http://bbs.pediy.com/showthread.php?t=47633&tcatid=60.
[3] 舒柏程,李毅超,曹跃,等.基于虚拟机的软件保护技术研究[J].计算机工程与科学,2008,30(A1):25-28.
[4] 段钢.加密与解密[M].北京:电子工业出版社.2008.
[5] 李露,刘秋菊,徐汀荣.PE文件中脱壳技术的研究[J].计算机应用与软件,2010,27(9):279-282.
[6] 王海平,曹林,孙国梓,等.随机花指令加密算法研究[J].计算机应用,2006,26(2):338-340.
[7] 孙国梓,蔡强,陈丹伟.子程序花指令加密算法研究[J].计算机工程与应用,2009,45(3):130-132.
Software protection technique based on improved virtual machine
WU Wei-min,XU Wen-feng,LIN Zhi-yi,SI Si,RUAN Yi-bang
(Faculty of Computer,Guangdong University of Technology,Guangzhou 510006,China)
For the increasingly serious software protection problem,the software protection technique based on virtual machine is analyzed,studied and improved,and thus a new software protection technique based on improved virtual machine is proposed.The proposal uses virtual junk code sequence and virtual instruction transformation technique,improves the virtual instruction system of original virtual machine,and hence increases complexity and confusion for virtual machine execution and has the advantages of high anti-reversing,tamper-proof and anti cracking.Experimental analysis proves that the improved virtual machine protection technique outperforms other virtual machine protection techniques.
virtual machine;software protection;virtual junk code;fuzy transform
TP309
A
10.3969/j.issn.1007-130X.2014.04.015
2012-09-26;
2013-01-28
通讯地址:510006广东省广州市番禺区广州大学城外环西路100号广东工业大学计算机学院
Address:Faculty of Computer,Guangdong University of Technology,100Waihuan Rd West,Guangzhou Higher Education Mega
Center,Panyu District,Guangzhou 510006,Guangdong,P.R.China
1007-130X(2014)04-0655-07
吴伟民(1956-),男,广东深圳人,教授,研究方向为数据结构和算法,可视计算,编译和虚拟机技术,智能系统。E-mail:wuwm@gdut.edu.cn
WU Wei-min,born in 1956,professor,his research interests include data structure and algorithm,visual computing,compiler and virtual machine technology,and intelligent system.
许文锋(1985-),男,湖南永兴人,硕士,研究方向为软件保护技术。E-mail:154529332@qq.com
XU Wen-feng,born in 1985,MS,his research interest includes software protection technology.
林志毅(1981-),男,福建连江人,博士,讲师,研究方向为自然计算和模式识别。E-mail:16045411@qq.com
LIN Zhi-yi,born in 1981,PhD,lecturer,his research interests include natural computing,and pattern recognition.
司斯(1987-),男,甘肃天水人,硕士,研究方向为数据结构和算法。E-mail:Sisi563846762@163.com
SI Si,born in 1987,MS,his research interests include data structure,and algorithm.
阮奕邦(1991-),男,广东阳江人,研究方向为软件保护技术。E-mail:ruanyibang@qq.com
RUAN Yi-bang,born in 1991,his research interest includes software protection technology.