CN101158911A - .Net程序保护方法及装置 - Google Patents

.Net程序保护方法及装置 Download PDF

Info

Publication number
CN101158911A
CN101158911A CNA2007101779376A CN200710177937A CN101158911A CN 101158911 A CN101158911 A CN 101158911A CN A2007101779376 A CNA2007101779376 A CN A2007101779376A CN 200710177937 A CN200710177937 A CN 200710177937A CN 101158911 A CN101158911 A CN 101158911A
Authority
CN
China
Prior art keywords
net
code section
binary code
program
conversion
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.)
Granted
Application number
CNA2007101779376A
Other languages
English (en)
Other versions
CN100474253C (zh
Inventor
陆舟
于华章
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Feitian Technologies Co Ltd
Original Assignee
Beijing Feitian Technologies Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Feitian Technologies Co Ltd filed Critical Beijing Feitian Technologies Co Ltd
Priority to CNB2007101779376A priority Critical patent/CN100474253C/zh
Publication of CN101158911A publication Critical patent/CN101158911A/zh
Priority to US12/124,680 priority patent/US8090959B2/en
Application granted granted Critical
Publication of CN100474253C publication Critical patent/CN100474253C/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种.Net程序保护方法及装置,属于软件保护领域。所述方法包括:从编译好的.Net程序选取包含.Net中间语言指令的二进制代码段;对该二进制代码段进行变换,并从.Net程序中删除该二进制代码段;将经过变换后的二进制代码段写入.Net程序的外壳程序中,并将外壳程序调用指令写入.Net程序中;运行.Net程序,当.Net程序运行到外壳程序调用指令时,外壳程序调用.Net虚拟机,.Net虚拟机运行经过变换后的二进制代码段。所述装置包括:选取模块、变换删除模块、写入模块和运行模块。本发明可以不受限制地保护.Net程序,使运行在.Net平台上的程序只需进行简单的变换就可以实现.Net程序保护。

Description

.Net程序保护方法及装置
技术领域
本发明涉及软件保护领域,特别涉及一种.Net程序保护方法及装置。
背景技术
.Net是微软的新一代技术平台,是全新的基于互联网的跨语言软件开发平台,顺应了当今软件工业分布式计算、面向组件、企业级应用、软件服务化和以Web为中心等大趋势。.Net并非开发语言,但是在.Net开发平台上可以支持多门开发语言。.Net最突出的一个特点是它能够使用户通过Web与众多智能设备相交互,同时确保用户而不是应用程序控制这个交互。这就使得微软.Net体验是极具个性化、综合化的体验,这种体验通过与XML Web服务相连的智能设备来实现。这些智能设备是一种具有Web功能的工具,如个人电脑、掌上电脑、智能电话,在这些设备中配上软件,这些软件使得它们在与用户、网络、信息及其它设备和服务的交互过程中更加智能化。
.Net语言的编译分为两个阶段,首先高级语言被编译成一种称作IL(中间代码)的中间语言,与高级语言相比,IL更像是机器语言,然而,IL却包含一些抽象概念(比如:类、异常),这也是这种语言被称为中间语言的原因。高级语言在初次被编译时,编译器做两件事:首先把编译得到的IL存储在DLL或EXE中,然后为类的每个方法创建一个stub函数,此函数会调用即时编译器,并将自身的地址作为参数传给编译器。即时编译器则从DLL或EXE中获取相应的IL,编译成机器语言,并将内存中的原零时调用函数替换成机器语言。stub函数再调用编译器,将自身编译为本地机器语言。JIT是一个典型的即时编译器,JIT编译器在每段代码执行前进行编译,编译的结果为本地静态机器码,如x86指令程序的运行环境下的机器码。
所谓虚拟机,可以把它想象成一台用软件来模拟的机器,在这台机器里有处理器、内存、寄存器等各种硬件,模拟执行各种指令,在这台机器上运行的软件对运行环境没有特殊要求,所以虚拟机对在它上运行的程序是透明的。例如,x86虚拟机模拟的是x86指令程序的运行环境,c51虚拟机模拟的是c51指令程序的运行环境。
编译过程是指将某高级语言编写的源程序翻译成与之等价的低级语言(汇编语言或机器语言)的目标程序的过程。反编译可以看成是编译的逆过程,即将以机器语言形式存在的目标代码翻译成与其功能等价的汇编语言形式或高级语言形式的代码的过程。指令变换是指将一种平台的目标指令根据程序执行的逻辑转换成另一种平台的目标指令的过程。
.Net上最突出的架构特性在提供了超乎寻常的便利的同时,也带来了一个非常敏感的缺点-.Net程序集可被非常容易地反编译。针对易反编译这一缺点,现有技术中有很多.Net中间代码的解决方案,但效果并不理想。因为这些解决方案除了降低反编译后代码的可阅读性外,并没有达到真正反编译效果。混淆过的源代码仍然可以被轻易反编译后完全暴露在有不良企图的攻击者面前。即使开发商采用非常强大的加密算法,但是由于最终运行时还是会将其解密后在计算机内存中运行,所以很容易被解密者获取。
目前针对.Net程序的纯软件保护方法,整个过程都在计算机内完成,具体实现步骤如下:
1)将.Net程序经过反编译生成IL文本文件;
2)开发商改写IL文本文件,在需要保护的内容之外加入解密函数;
3)将改写后的IL文本经过编译生成可以在.Net平台上执行的二进制指令;
4)通过软件对二进制指令文件中需要保护的部分进行加密;
5)运行时通过事先写入的解密函数对加密的二进制指令进行解密,从而实现对该.Net程序的保护。
所谓“外壳”就是给可执行的文件加上一个外壳。用户执行的实际上是这个外壳的程序,而这个外壳程序负责把用户原来的程序在内存中解开压缩,并把控制权交还给解开后的真正的程序,由于一切工作都是在内存中运行,用户根本不知道也不需要知道其运行过程,并且对执行速度没有什么影响。如果在外壳程序中加入对软件锁或钥匙盘的验证部分,它就是我们所说的外壳加密了。外壳对程序进行压缩或根本不压缩,外壳主要特点在于反跟踪、加密代码和数据、保护程序数据的完整性,确保程序代码不被黑客修改或者被人跟踪调试。
现有技术中,常利用硬件设备来实现.Net程序的保护方法,即从.Net程序文件中提取部分代码至加密装置中,通过.Net程序文件中的代码分解为两部分,一部分代码在加密装置中运行,其余部分代码在计算机中运行,以实现.Net程序保护的目的。目前,比较高端的加密装置是可编程的,利用其实现程序保护包含两部分内容,一部分是将被保护的程序中的关键代码存储到加密装置内,另一部分是实现计算机内的被保护的程序与信息安全设备之间的通信。这就要求编写外壳程序调用指令,被保护的程序通过调用API(Application ProgrammingInterface,应用程序编程接口)实现与加密装置的通信,其中API就是系统不同组成部分衔接的约定,是应用程序用来与硬件系统交换信息和命令的程序接口。加密装置生产商会在较高端的硬件设备中实现某种虚拟机功能,那么便可以在加密装置中直接运行与实现的虚拟机相对应格式的代码。
然而用硬件实现软件程序的保护方法,其弊端在于:保护范围小,保护强度及可控性低,每次运行的程序代码受到限制,使得通过硬件加密来实现程序保护变得较为烦琐。另一方面,传统技术中,基于软件方式来实现.Net的代码保护中,由于受保护的.Net程序会在计算机的内存中重现,使得.Net程序在内存中容易被破解,这就在一定程度上给.Net程序的保护带来了风险。
发明内容
为了解决通过硬件加密来实现.Net程序保护的繁琐性,以及通过软件方式实现.Net程序保护在内存中容易被破解的问题,本发明提供了一种.Net程序保护方法,所述方法包括:
步骤A:从编译好的.Net程序选取包含.Net中间语言指令的二进制代码段;
步骤B:对所述二进制代码段进行变换,并从所述.Net程序中删除所述二进制代码段;
步骤C:将经过变换后的二进制代码段写入所述.Net程序的外壳程序中,并将外壳程序调用指令写入所述.Net程序中;
步骤D:运行所述.Net程序,当所述.Net程序运行到所述外壳程序调用指令时,所述外壳程序调用.Net虚拟机,所述.Net虚拟机运行经过变换后的二进制代码段。
所述步骤A具体为:计算机根据编译好的.Net程序中二进制代码段的重要性自动选取包含.Net中间语言指令的二进制代码段,或者人工从编译好的.Net程序中选取包含.Net中间语言指令的二进制代码段。
所述步骤B中对所述二进制代码段进行变换的步骤具体为:对所述二进制代码段进行逻辑变换,并对经过逻辑变换的二进制代码段进行加密或压缩。
所述步骤B中对所述二进制代码段进行变换的步骤具体为:对所述二进制代码段进行逻辑变换,或者对所述二进制代码段进行加密或压缩。
所述逻辑变换包括代码段的指令互换、指令乱序或重新编码。
所述步骤C中将外壳程序调用指令写入所述.Net程序中的步骤具体为:将外壳程序调用指令写入所述二进制代码段在所述.Net程序中对应的位置。
所述步骤D具体包括:
步骤D1:运行所述.Net程序,当所述.Net程序运行到所述外壳程序调用指令时,所述外壳程序调用指令调用所述外壳程序;
步骤D2:所述外壳程序调用.Net虚拟机;
步骤D3:所述.Net虚拟机根据预先约定,利用与所述变换对应的解析指令运行经过变换后的二进制代码段;
步骤D4:所述.Net虚拟机输出正确的运行结果。
所述步骤D3具体包括:
步骤D3-1:所述.Net虚拟机根据预先约定,将所述二进制代码段即时编译成本地代码;
步骤D3-2:所述.Net虚拟机利用与所述变换对应的解析指令运行所述本地代码。
所述变换是与所述.Net程序的外壳程序中的.Net虚拟机预先约定好的,是对源代码在原始指令格式的基础上进行的变换。
所述外壳程序调用指令用于调用所述外壳程序,当所述外壳程序被加载运行时,自动调用所述.Net虚拟机。
本发明还提供了一种.Net程序保护装置,所述装置包括:
选取模块,用于从编译好的.Net程序选取包含.Net中间语言指令的二进制代码段,并发送所述二进制代码段;
变换删除模块,用于接收所述选取模块发送的二进制代码段,并对所述二进制代码段进行变换,以及从.Net程序中删除所述二进制代码段,发送经过变换后的二进制代码段;
写入模块,用于接收所述变换删除模块发送的经过变换后的二进制代码段,并将经过变换后的二进制代码段写入.Net程序的外壳程序中,以及将外壳程序调用指令写入.Net程序中;
运行模块,用于当.Net程序运行到外壳程序调用指令时,运行经过变换后的二进制代码段。
所述运行模块包括:
.Net虚拟机调用单元,用于当.Net程序运行到外壳程序调用指令时,调用.Net虚拟机;
虚拟机单元,用于根据.Net虚拟机的预先约定,利用与变换对应的解析指令运行经过变换后的二进制代码段。
或者,所述运行模块包括:
.Net虚拟机调用单元,用于当.Net程序运行到外壳程序调用指令时,调用.Net虚拟机;
即时编译单元,用于根据.Net虚拟机的预先约定,将经过变换后的二进制代码段即时编译成本地代码,并发送所述本地代码;
虚拟机单元,用于接收所述即时编译单元发送的本地代码,并根据.Net虚拟机的预先约定,利用与变换对应的解析指令运行所述本地代码。
本发明提供的技术方案的有益效果是:本发明通过对.Net程序中的二进制代码段进行变换,以及通过.Net虚拟机运行变换后的二进制代码段,实现了对.Net程序的有效保护,从而不受限制地保护.Net程序,使运行在.Net平台上的程序只需进行简单的转换,即可实现程序保护;另外,由于虚拟机是自己开发的,所以这个变换是按照规定的方式,把受保护的指令按照一定的或可变的规则进行变换,使得反编译出来的代码是杂乱的,从而极大地提高了软件保护的安全性;更进一步地,即使非法分子通过查看计算机内存截获到经过变换的源代码,由于无法得知变换的规律,即使直接运行该源代码,也只能得到错误的结果,因此,本发明大大地增强了破译源代码的难度。
附图说明
图1是本发明提供的.Net程序保护方法的流程图;
图2是本发明提供的.Net程序保护装置的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
本发明提供了一种利用纯软件的方式实现.Net程序的保护方法,其实现原理是:从编译好的.Net程序选取包含.Net中间语言指令的二进制代码段;对该二进制代码段进行变换,并从.Net程序中删除该二进制代码段;将经过变换后的二进制代码段写入.Net程序的外壳程序中,并将外壳程序调用指令写入.Net程序中;运行.Net程序,当.Net程序运行到外壳程序调用指令时,外壳程序调用.Net虚拟机,.Net虚拟机运行经过变换后的二进制代码段。
在本发明提供的技术方案中,对二进制代码段进行的变换是与.Net程序的外壳程序中的.Net虚拟机预先约定好的,是对源代码在原始指令格式的基础上进行的变换,其具体的实现方式具体包括:对二进制代码段进行逻辑变换;或者对二进制代码段进行加密或压缩;或者先对二进制代码段进行逻辑变换,再对经过逻辑变换后的二进制代码段进行加密或压缩。其中,逻辑变换包括代码段的指令互换、指令乱序或重新编码等。下面以对二进制代码段进行指令互换为例,来阐述本发明提供的技术方案。
实施例1
参见图1,本发明提供了一种.Net程序保护方法,具体包括以下步骤:
步骤101:将待保护的.Net程序编译成.Net二进制代码段;
为了方便说明,本实施例给出一个具体的.Net程序,具体如下:
    Class test
    {
    Int Add(int a,int b)
    {
    Return a+b;
    }
    Static int main(String args[])
    {
       Add(1,3);
    }
    }
    根据如下步骤加载并验证可执行文件,然后取得原数据表:
    //开始加载PE文件
    if(VM_READFILE(0,sizeof(g_Dosx.e_magic),(char*)&g_Dosx.e_magic)==-1)
        return 0;
    if(VM_READFILE(0×3C,sizeof(g_Dosx.e_lfanew),(char*)&g_Dosx.e_lfanew)==-1)
        return0;
    if(g_Dosx.e_magic!=0×5a4d)
         return 0;
    //File Header Offset
    m_Off=g_Dosx.e_lfanew+4;
    if(VM_READFILE(m_Off,sizeof(g_Filex.Machine)+sizeof(g_Filex.NumberOfSections),(char
*)&g_Filex.Machine)==-1)
           return 0;
    //Option Header Offset
    m_Off+=sizeof(IMAGE_FILE_HEADER);
    m_Off+=0×60;
    m_Off+=(IMAGE_DIRECTORY_ENTRY_COM DESCRIPTOR
sizeof(IMAGE_DATA_DIRECTORY_X));
    //获取Com_Directory
    if(VM_READFILE(m_Off,sizeof(g_ComDirx),(char*)&g_ComDirx)==-1)
    return 0;
    //获取Section_Header的偏移
    g_SectionOff=g_Dosx.e_lfanew+4+sizeof(IMAGE_FILE_HEADER)+sizeof(IMAGE_OPTIO
NAL_HEADER);
    //获取_Cor20
    m_Off=Rva2Raw_x(g_ComDirx.VirtualAddress);
    if(VM_READFILE(m_Off,sizeof(g_Cor20x),(char*)&g_Cor20x)==-1)
         return 0;
    //获取PE_EXTEND的偏移
    g_PeExtendOff=Rva2Raw_x(g_Cor20x.MetaData.VirtualAddress);
    //获取Pe_Extend
    GetPeExtendHeader_x( );
    //获取Meta_Header
    GetMetaHeader_x( );
    //获取所有元数据表的个数和大小
    m_Index=0;
    while(m_Index<=43)
    {
        g_RowOfTables[m_Index]=GetRowsOfTables_x(m_Index);
        m_Index++;
    }
    m_Index=0;
    while(m_Index<=43)
{
   g_SizeOfIables[m_Index]=GetSizeOfTables_x(m_Index);
   m_Index++;
}
利用机器汇编语言,将上述.Net程序编译成.Net二进制代码段;
步骤102:从编译好的.Net程序中选取包含.Net中间语言指令的二进制代码段;
.Net中间语言指令具体包括IL指令,本实施例以IL指令为例来加以说明;为了看起来方便,将选取出的包含IL指令的二进制代码段以IL汇编语言的形式给出,具体如下:
locals init([0]int32 CS$1$0000)
IL_0000:nop
IL_0001:ldarg.1
IL_0002:ldarg.2
IL_0003:add
IL_0004:stloc.0
IL_0005:br.s    IL_0007
IL_0007:ldloc.0
IL_0008:ret
上述IL汇编语言对应于.Net程序中的源代码段为:
Int Add(int a,int b)
{
Return a+b;
}
本实施例中,选取出的包含IL指令的二进制代码段是已经编译好的可执行文件的形式,是使用.Net平台上支持的开发语言编写的程序在计算机上运行得到的.Net二进制代码段;可执行文件具体是.exe形式的文件,由于计算机已经实现了.Net虚拟机,因此,在一般的计算机上运行的.exe形式的可执行文件,可以在.Net虚拟机中运行;
实际应用中,为了实现对.Net程序的有效保护,需要从编译好的.Net程序中选取出比较重要的包含.Net中间语言指令的二进制代码段,其具体的选取方式可以由软件开发者人工从编译好的.Net程序中选取出比较重要的包含.Net中间语言指令的二进制代码段,或者依据一定的标准由计算机自动从编译好的.Net程序中选取出比较重要的包含.Net中间语言指令的二进制代码段;
步骤103:在计算机内存中,对选取出的包含IL指令的二进制代码段进行指令互换,并从.Net程序中删除该二进制代码段;
本实施例中,将包含IL指令的二进制代码段进行指令互换具体是指改变该二进制代码段的指令,即将该二进制代码段中的ADD指令换成MUL指令,为了直观说明,将经过指令互换后的二进制代码段以IL汇编语言的形式给出,具体如下:
locals init([0]int32 CS$1$0000)
IL_0000:nop
IL_0001:ldarg.1
IL_0002:ldarg.2
IL_0003:mul
IL_0004:stloc.0
IL_0005:br.s    IL_0007
IL_0007:ldloc.0
IL_0008:ret
步骤104:将经过指令互换后的二进制代码段写入.Net程序的外壳程序中,并将外壳程序调用指令写入二进制代码段在.Net程序中对应的位置;
外壳程序调用指令用于实现对外壳程序的调用;当.Net程序运行到外壳程序调用指令时,会跳转至外壳程序;
步骤105:运行.Net程序;
步骤106:当.Net程序运行到外壳程序调用指令时,跳转到外壳程序;
当外壳程序被加载运行时,自动调用外壳程序中的.Net虚拟机;
步骤107:外壳程序调用.Net虚拟机,.Net虚拟机根据预先约定,通过JIT即时编译器将经过指令互换后的二进制代码段即时编译成本地代码;
步骤108:.Net虚拟机通过JIT即时编译器,利用与指令互换对应的解析指令运行本地代码;
本实施例中,JIT即时编译器利用与指令互换对应的解析指令运行本地代码具体为:  JIT即时编译器将二进制代码段中的MUL指令翻译成本地ADD指令;
步骤109:.Net虚拟机对二进制代码段输出正确的运行结果。
另外,在实际应用中,还可以先对待保护的.Net程序进行反编译,生成中间代码文本文件,然后再对中间代码文本文件进行编译,生成.Net二进制代码段,这样步骤101变为:
步骤101′:对待保护的.Net程序进行反编译,生成中间代码文本文件,并将中间代码文本文件编译成.Net二进制代码段。
实施例2
参见图2,本发明还提供了一种.Net程序保护装置,该装置包括:
选取模块,用于从编译好的.Net程序选取包含.Net中间语言指令的二进制代码段,并发送二进制代码段;为了实现对.Net程序的有效保护,需要从编译好的.Net程序中选取出比较重要的包含.Net中间语言指令的二进制代码段,其具体的选取方式可以由软件开发者人工从编译好的.Net程序中选取出比较重要的包含.Net中间语言指令的二进制代码段,或者依据一定的标准由计算机自动从编译好的.Net程序中选取出比较重要的包含.Net中间语言指令的二进制代码段;选取出的包含.Net中间语言指令的二进制代码段是已经编译好的可执行文件的形式;
变换删除模块,用于接收选取模块发送的二进制代码段,并对二进制代码段进行变换,以及从.Net程序中删除二进制代码段,发送经过变换后的二进制代码段;
写入模块,用于接收变换删除模块发送的经过变换后的二进制代码段,并将经过变换后的二进制代码段写入.Net程序的外壳程序中,以及将外壳程序调用指令写入.Net程序中;外壳程序调用指令写入二进制代码段在.Net程序中对应的位置;外壳程序调用指令是预先编写好的,其中的数据部分需要根据具体情况进行变化。
运行模块,用于当.Net程序运行到外壳程序调用指令时,运行经过变换后的二进制代码段。
运行模块包括:
.Net虚拟机调用单元,用于当.Net程序运行到外壳程序调用指令时,调用.Net虚拟机;
虚拟机单元,用于根据.Net虚拟机的预先约定,利用与变换对应的解析指令运行经过变换后的二进制代码段。
或者,运行模块包括:
.Net虚拟机调用单元,用于当.Net程序运行到外壳程序调用指令时,调用.Net虚拟机;
即时编译单元,用于根据.Net虚拟机的预先约定,将经过变换后的二进制代码段即时编译成本地代码,并发送本地代码;
虚拟机单元,用于接收即时编译单元发送的本地代码,并根据.Net虚拟机的预先约定,利用与变换对应的解析指令运行本地代码。
运行模块的运行过程主要是外壳程序调用.Net虚拟机,运行写入外壳程序中的.Net二进制代码段;在运行.Net程序的过程中,当程序运行到选取出的二进制代码段的位置时,通过外壳程序调用指令跳转至外壳程序,并由外壳程序调用.Net虚拟机运行写入外壳程序中的.Net二进制代码段。
本发明提供的技术方案的有益效果是:本发明通过对.Net程序中的二进制代码段进行变换,以及通过.Net虚拟机运行变换后的二进制代码段,实现了对.Net程序的有效保护,从而不受限制地保护.Net程序,使运行在.Net平台上的程序只需进行简单的转换,即可实现程序保护;另外,由于虚拟机是自己开发的,所以这个变换是按照规定的方式,把受保护的指令按照一定的或可变的规则进行变换,使得反编译出来的代码是杂乱的,从而极大地提高了软件保护的安全性;更进一步地,即使非法分子通过查看计算机内存截获到经过变换的源代码,由于无法得知变换的规律,即使直接运行该源代码,也只能得到错误的结果,因此,本发明大大地增强了破译源代码的难度。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (13)

1.一种.Net程序保护方法,其特征在于,所述方法包括:
步骤A:从编译好的.Net程序选取包含.Net中间语言指令的二进制代码段;
步骤B:对所述二进制代码段进行变换,并从所述.Net程序中删除所述二进制代码段;
步骤C:将经过变换后的二进制代码段写入所述.Net程序的外壳程序中,并将外壳程序调用指令写入所述.Net程序中;
步骤D:运行所述.Net程序,当所述.Net程序运行到所述外壳程序调用指令时,所述外壳程序调用.Net虚拟机,所述.Net虚拟机运行经过变换后的二进制代码段。
2.如权利要求1所述的.Net程序保护方法,其特征在于,所述步骤A具体为:计算机根据编译好的.Net程序中二进制代码段的重要性自动选取包含.Net中间语言指令的二进制代码段,或者人工从编译好的.Net程序中选取包含.Net中间语言指令的二进制代码段。
3.如权利要求1所述的.Net程序保护方法,其特征在于,所述步骤B中对所述二进制代码段进行变换的步骤具体为:对所述二进制代码段进行逻辑变换,并对经过逻辑变换的二进制代码段进行加密或压缩。
4.如权利要求1所述的.Net程序保护方法,其特征在于,所述步骤B中对所述二进制代码段进行变换的步骤具体为:对所述二进制代码段进行逻辑变换,或者对所述二进制代码段进行加密或压缩。
5.如权利要求3或4所述的.Net程序保护方法,其特征在于,所述逻辑变换包括代码段的指令互换、指令乱序或重新编码。
6.如权利要求1所述的.Net程序保护方法,其特征在于,所述步骤C中将外壳程序调用指令写入所述.Net程序中的步骤具体为:将外壳程序调用指令写入所述二进制代码段在所述.Net程序中对应的位置。
7.如权利要求1所述的.Net程序保护方法,其特征在于,所述步骤D具体包括:
步骤D1:运行所述.Net程序,当所述.Net程序运行到所述外壳程序调用指令时,所述外壳程序调用指令调用所述外壳程序;
步骤D2:所述外壳程序调用.Net虚拟机;
步骤D3:所述.Net虚拟机根据预先约定,利用与所述变换对应的解析指令运行经过变换后的二进制代码段;
步骤D4:所述.Net虚拟机输出正确的运行结果。
8.如权利要求7所述的.Net程序保护方法,其特征在于,所述步骤D3具体包括:
步骤D3-1:所述.Net虚拟机根据预先约定,将所述二进制代码段即时编译成本地代码;
步骤D3-2:所述.Net虚拟机利用与所述变换对应的解析指令运行所述本地代码。
9.如权利要求1所述的.Net程序保护方法,其特征在于,所述变换是与所述.Net程序的外壳程序中的.Net虚拟机预先约定好的,是对源代码在原始指令格式的基础上进行的变换。
10.如权利要求1所述的.Net程序保护方法,其特征在于,所述外壳程序调用指令用于调用所述外壳程序,当所述外壳程序被加载运行时,自动调用所述.Net虚拟机。
11.一种.Net程序保护装置,其特征在于,所述装置包括:
选取模块,用于从编译好的.Net程序选取包含.Net中间语言指令的二进制代码段,并发送所述二进制代码段;
变换删除模块,用于接收所述选取模块发送的二进制代码段,并对所述二进制代码段进行变换,以及从.Net程序中删除所述二进制代码段,发送经过变换后的二进制代码段;
写入模块,用于接收所述变换删除模块发送的经过变换后的二进制代码段,并将经过变换后的二进制代码段写入.Net程序的外壳程序中,以及将外壳程序调用指令写入.Net程序中;
运行模块,用于当.Net程序运行到外壳程序调用指令时,运行经过变换后的二进制代码段。
12.如权利要求11所述的.Net程序保护装置,其特征在于,所述运行模块包括:
.Net虚拟机调用单元,用于当.Net程序运行到外壳程序调用指令时,调用.Net虚拟机;
虚拟机单元,用于根据.Net虚拟机的预先约定,利用与变换对应的解析指令运行经过变换后的二进制代码段。
13.如权利要求11所述的.Net程序保护装置,其特征在于,所述运行模块包括:
.Net虚拟机调用单元,用于当.Net程序运行到外壳程序调用指令时,调用.Net虚拟机;
即时编译单元,用于根据.Net虚拟机的预先约定,将经过变换后的二进制代码段即时编译成本地代码,并发送所述本地代码;
虚拟机单元,用于接收所述即时编译单元发送的本地代码,并根据.Net虚拟机的预先约定,利用与变换对应的解析指令运行所述本地代码。
CNB2007101779376A 2007-11-22 2007-11-22 .Net程序保护方法及装置 Active CN100474253C (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CNB2007101779376A CN100474253C (zh) 2007-11-22 2007-11-22 .Net程序保护方法及装置
US12/124,680 US8090959B2 (en) 2007-11-22 2008-05-21 Method and apparatus for protecting .net programs

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNB2007101779376A CN100474253C (zh) 2007-11-22 2007-11-22 .Net程序保护方法及装置

Publications (2)

Publication Number Publication Date
CN101158911A true CN101158911A (zh) 2008-04-09
CN100474253C CN100474253C (zh) 2009-04-01

Family

ID=39307020

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB2007101779376A Active CN100474253C (zh) 2007-11-22 2007-11-22 .Net程序保护方法及装置

Country Status (2)

Country Link
US (1) US8090959B2 (zh)
CN (1) CN100474253C (zh)

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101593258B (zh) * 2008-05-28 2010-09-08 北京飞天诚信科技有限公司 一种在软件保护装置中实现.Net虚拟机的系统和方法
CN101593257B (zh) * 2008-05-27 2011-02-16 北京飞天诚信科技有限公司 基于.Net虚拟机的软件保护系统和方法
WO2011044710A1 (en) * 2009-10-12 2011-04-21 Safenet, Inc. Software license embedded in shell code
CN102193829A (zh) * 2011-05-20 2011-09-21 深圳市江波龙电子有限公司 虚拟机调用本地接口的方法及装置
CN103064718A (zh) * 2013-01-23 2013-04-24 北京伸得纬科技有限公司 一种虚拟机载入器
CN103198240A (zh) * 2012-09-29 2013-07-10 网易(杭州)网络有限公司 一种用于保护代码安全的方法和装置
CN104077504A (zh) * 2013-03-25 2014-10-01 联想(北京)有限公司 一种应用程序加密的方法及装置
CN105279399A (zh) * 2015-10-30 2016-01-27 百度在线网络技术(北京)有限公司 应用防破解方法和装置
CN106933610A (zh) * 2015-12-30 2017-07-07 北京金山安全软件有限公司 一种应用程序安装包生成方法、装置及电子设备
CN107341373A (zh) * 2017-06-30 2017-11-10 北京深思数盾科技股份有限公司 一种可执行程序的保护方法及装置
CN107423586A (zh) * 2017-07-31 2017-12-01 北京深思数盾科技股份有限公司 软件保护方法和软件保护装置

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9389840B2 (en) * 2009-02-11 2016-07-12 Johnathan Mun Compiled and executable method
CN101719077B (zh) * 2009-12-24 2012-06-27 飞天诚信科技股份有限公司 在.Net程序中注入代码的方法和装置
CN101980160B (zh) * 2010-10-28 2013-02-13 飞天诚信科技股份有限公司 一种.net程序加密后的执行方法
US8667600B2 (en) 2011-06-30 2014-03-04 International Business Machines Corporation Trusted computing source code escrow and optimization
US9116712B2 (en) * 2013-02-28 2015-08-25 Microsoft Technology Licensing, Llc Compile based obfuscation
CN104850802A (zh) * 2015-05-12 2015-08-19 浪潮电子信息产业股份有限公司 一种监控linux下文件变化并保障数据不被篡改的方法
US10762199B2 (en) * 2015-12-11 2020-09-01 International Business Machines Corporation Compiler assisted protection against arbitrary code execution
CN114707124B (zh) * 2022-03-22 2022-11-29 广东技术师范大学 基于代码虚拟化的.net平台代码保护方法和系统

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2834171B2 (ja) * 1989-02-06 1998-12-09 株式会社日立製作所 コンパイル方法
US5530752A (en) * 1994-02-22 1996-06-25 Convex Computer Corporation Systems and methods for protecting software from unlicensed copying and use
US6029002A (en) * 1995-10-31 2000-02-22 Peritus Software Services, Inc. Method and apparatus for analyzing computer code using weakest precondition
JP4739465B2 (ja) * 1997-06-09 2011-08-03 インタートラスト テクノロジーズ コーポレイション ソフトウェアセキュリティを増強するための混乱化技術
US6779114B1 (en) * 1999-08-19 2004-08-17 Cloakware Corporation Tamper resistant software-control flow encoding
US7124445B2 (en) * 2002-06-21 2006-10-17 Pace Anti-Piracy, Inc. Protecting software from unauthorized use by converting source code modules to byte codes
US7730530B2 (en) * 2004-01-30 2010-06-01 Microsoft Corporation System and method for gathering exhibited behaviors on a .NET executable module in a secure manner
US7743423B2 (en) * 2004-02-03 2010-06-22 Microsoft Corporation Security requirement determination
KR20060082353A (ko) * 2005-01-12 2006-07-18 와이더댄 주식회사 실행가능 웹 컨텐트 제공 및 처리 시스템 및 방법
RU2439669C2 (ru) * 2005-08-06 2012-01-10 Майкрософт Корпорейшн Способ предотвращения обратного инжиниринга программного обеспечения, неавторизованной модификации и перехвата данных во время выполнения
US20080005160A1 (en) * 2006-06-30 2008-01-03 Microsoft Corporation Assembly Sensitive Dynamic Classloading Of .Net Types in J#
US20080229115A1 (en) * 2007-03-16 2008-09-18 Microsoft Corporation Provision of functionality via obfuscated software

Cited By (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101593257B (zh) * 2008-05-27 2011-02-16 北京飞天诚信科技有限公司 基于.Net虚拟机的软件保护系统和方法
CN101593258B (zh) * 2008-05-28 2010-09-08 北京飞天诚信科技有限公司 一种在软件保护装置中实现.Net虚拟机的系统和方法
WO2011044710A1 (en) * 2009-10-12 2011-04-21 Safenet, Inc. Software license embedded in shell code
US8205096B2 (en) 2009-10-12 2012-06-19 Safenet, Inc. Software license embedded in shell code
CN102576391A (zh) * 2009-10-12 2012-07-11 Safenet公司 嵌入在shell代码中的软件许可
CN102576391B (zh) * 2009-10-12 2015-03-04 Safenet公司 嵌入在shell代码中的软件许可
CN102193829A (zh) * 2011-05-20 2011-09-21 深圳市江波龙电子有限公司 虚拟机调用本地接口的方法及装置
CN103198240B (zh) * 2012-09-29 2016-03-16 网易(杭州)网络有限公司 一种用于保护代码安全的方法和装置
CN103198240A (zh) * 2012-09-29 2013-07-10 网易(杭州)网络有限公司 一种用于保护代码安全的方法和装置
CN103064718A (zh) * 2013-01-23 2013-04-24 北京伸得纬科技有限公司 一种虚拟机载入器
CN104077504A (zh) * 2013-03-25 2014-10-01 联想(北京)有限公司 一种应用程序加密的方法及装置
CN104077504B (zh) * 2013-03-25 2017-04-19 联想(北京)有限公司 一种应用程序加密的方法及装置
CN105279399A (zh) * 2015-10-30 2016-01-27 百度在线网络技术(北京)有限公司 应用防破解方法和装置
CN106933610A (zh) * 2015-12-30 2017-07-07 北京金山安全软件有限公司 一种应用程序安装包生成方法、装置及电子设备
CN107341373A (zh) * 2017-06-30 2017-11-10 北京深思数盾科技股份有限公司 一种可执行程序的保护方法及装置
CN107341373B (zh) * 2017-06-30 2018-12-18 北京深思数盾科技股份有限公司 一种可执行程序的保护方法及装置
CN107423586A (zh) * 2017-07-31 2017-12-01 北京深思数盾科技股份有限公司 软件保护方法和软件保护装置

Also Published As

Publication number Publication date
CN100474253C (zh) 2009-04-01
US8090959B2 (en) 2012-01-03
US20090138863A1 (en) 2009-05-28

Similar Documents

Publication Publication Date Title
CN100474253C (zh) .Net程序保护方法及装置
Cai et al. Certified self-modifying code
US6779114B1 (en) Tamper resistant software-control flow encoding
McCamant et al. Quantitative information flow as network flow capacity
AU2007349213B2 (en) Virtualization for diversified tamper resistance
US7254586B2 (en) Secure and opaque type library providing secure data protection of variables
CN104025104B (zh) 具有密钥驱动的混淆的虚拟机设备和方法
TW201839644A (zh) 安卓平台上可執行程式的保護方法
CN112639778A (zh) 指针认证及指针认证方案之间的动态切换
CN105022936A (zh) 一种类class文件加密解密方法和装置
WO2013170724A1 (zh) 安卓系统中java应用程序的保护方法
CN109343937A (zh) 一种跨设备部署的分布式计算系统
Popa Techniques of program code obfuscation for secure software
CN107871066B (zh) 基于安卓系统的代码编译方法及装置
CN110309630A (zh) 一种Java代码加密方法及装置
Yuhala et al. Montsalvat: Intel SGX shielding for GraalVM native images
Georges* et al. Cerise: Program verification on a capability machine in the presence of untrusted code
CN110597496B (zh) 应用程序的字节码文件获取方法及装置
CN117390603A (zh) 基于前端代码加密的访问方法、装置、电子设备及介质
KR101436741B1 (ko) 프로그램 보안 솔루션 적용 방법 및 시스템
KR102430335B1 (ko) 가상화 코드의 난독화를 강화하는 방법 및 그 장치
Wichelmann et al. MAMBO–V: Dynamic Side-Channel Leakage Analysis on RISC–V
Guo et al. A survey of obfuscation and deobfuscation techniques in android code protection
Lashermes et al. Hardware-assisted program execution integrity: Hapei
WO2017063323A1 (zh) 基于重构技术实现敏感数据云端锁定的方法

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
C56 Change in the name or address of the patentee

Owner name: FEITIAN TECHNOLOGIES CO., LTD.

Free format text: FORMER NAME: BEIJING FEITIAN CHENGXIN SCIENCE + TECHNOLOGY CO. LTD.

CP03 Change of name, title or address

Address after: 100085 Beijing city Haidian District Xueqing Road No. 9 Ebizal building B block 17 layer

Patentee after: Feitian Technologies Co.,Ltd.

Address before: 100083, Haidian District, Xueyuan Road, No. 40 research, 7 floor, 5 floor, Beijing

Patentee before: FEITIAN TECHNOLOGIES Co.,Ltd.

CP03 Change of name, title or address
CP03 Change of name, title or address

Address after: 17th floor, building B, Huizhi building, No.9, Xueqing Road, Haidian District, Beijing 100085

Patentee after: Feitian Technologies Co.,Ltd.

Country or region after: China

Address before: 100085 17th floor, block B, Huizhi building, No.9 Xueqing Road, Haidian District, Beijing

Patentee before: Feitian Technologies Co.,Ltd.

Country or region before: China