著录项信息
| 专利名称 | 一种在软件保护装置中实现软件保护的方法与装置 |
| 申请号 | CN200610169582.1 | 申请日期 | 2006-12-22 |
| 法律状态 | 暂无 | 申报国家 | 中国 |
| 公开/公告日 | 2007-06-27 | 公开/公告号 | CN1987886 |
| 优先权 | 暂无 | 优先权号 | 暂无 |
| 主分类号 | G06F21/22 | IPC分类号 | G;0;6;F;2;1;/;2;2查看分类表>
|
| 申请人 | 北京飞天诚信科技有限公司 | 申请人地址 | 北京市海淀区学清路9号汇智大厦B座17层
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
| 权利人 | 飞天诚信科技股份有限公司 | 当前权利人 | 飞天诚信科技股份有限公司 |
| 发明人 | 陆舟;于华章 |
| 代理机构 | 北京集佳知识产权代理有限公司 | 代理人 | 孙长龙 |
摘要
本发明公开一种在软件保护装置中实现软件保护的方法,用于已实现X86虚拟机的软件保护装置,包括:在有待保护的程序的可执行文件中挑选部分指令段;将该指令段中使用的存储单元名称转换为软件保护装置虚拟机的存储单元名称;将转换后的指令段写入软件保护装置中,同时去除原被选中指令段,并写入通讯指令;运行被保护的程序时,当运行到写入软件保护装置的指令段时,进行下列步骤:将写入软件保护装置指令段涉及的存储单元内容,从主机映射到软件保护装置虚拟机对应的存储单元;软件保护装置虚拟机运行该指令段;运行后,软件保护装置虚拟机将存储单元中的内容反映射到主机中对应的存储单元。本发明同时公开一种实现该方法的装置。
1.一种在软件保护装置中实现软件保护的方法,用于已实现 X86虚拟机的软件保护装置;其特征在于,包括:
在有待保护的程序的可执行文件中挑选部分指令段,作为写入 软件保护装置的指令段;
将被挑选的指令段中使用的主机内存地址、寄存器名、堆栈地 址转换为软件保护装置虚拟机的内存地址、寄存器名、堆栈地址;
将转换后的指令段写入所述软件保护装置中,同时在所述有待 保护的程序的可执行文件中去除被挑选的指令段,并写入通讯程 序;
运行所述有待保护的程序的可执行文件时,当运行到写入软件 保护装置的指令段时,在所述通讯程序的控制下进行下列步骤:
将所述写入软件保护装置的指令段涉及的内存、寄存器、堆栈 的内容,从主机映射到所述软件保护装置虚拟机对应的内存、寄存 器、堆栈;
所述软件保护装置虚拟机运行该指令段;
运行完毕后,软件保护装置虚拟机将上述内存、寄存器、堆栈 中的内容反映射到主机中对应的内存、寄存器、堆栈。
2.根据权利要求1所述的方法,其特征在于,所述通讯程序写 在所述有待保护的程序的可执行文件中去除被挑选的指令段的位 置。
3.根据权利要求1所述的方法,其特征在于,在有待保护的程 序的可执行文件中去除被挑选指令段的位置写入调用通讯程序的指 令,该通讯程序写在有待保护的程序的可执行文件的其他位置。
4.根据权利要求1所述的方法,其特征在于,通讯程序写在有 待保护的程序的可执行文件的起始地址处,调用时,通讯程序填充 所述有待保护的程序的可执行文件中去除被挑选指令段的位置。
5.根据权利要求1-4任一项所述的方法,其特征在于,所述主 机内存地址、寄存器名、堆栈地址转换为软件保护装置虚拟机中的 内存地址、寄存器名、堆栈地址时,记录两者之间的对应关系;在 所述通讯程序中,记录该对应关系。
6.根据权利要求1-4任一项所述的方法,其特征在于,所述映 射是将主机中内存、寄存器、堆栈的内容写入软件保护装置虚拟机 对应的内存、寄存器、堆栈中,所述反映射则与上述过程相反。
7.根据权利要求1-4任一项所述的方法,其特征在于,所述在 有待保护的程序的可执行文件中挑选部分指令段的过程,由计算机 根据指令段的重要性自动进行选择;或者由人工选择。
8.根据权利要求1-4任一项所述的方法,其特征在于,所述 软件保护装置虚拟机的寄存器名采用与主机相同的寄存器名,此 时,只需将所挑选的指令段中的主机内存地址转换为软件保护装置 虚拟机的内存地址。
9.一种实现软件保护的装置,包括:已实现X86虚拟机的软件 保护装置,其特征在于,还包括:
选取单元,用于读取有待保护的程序的可执行文件,并从中挑 选部分指令段,作为写入软件保护装置的指令段输出;
转换单元,用于接收所述选取单元输出的指令段,将该指令段 中的主机内存地址、寄存器名、堆栈地址转换为软件保护装置虚拟 机的内存地址、寄存器名、堆栈地址,并输出经过上述转换的指令 段;
程序写入单元,用于接收所述转换单元输出的指令段,并将该 指令段写入所述软件保护装置虚拟机中;同时从有待保护的程序的 可执行文件中去除被选取单元挑选的指令段;
通讯程序写入单元,用于将通讯程序写入该有待保护的程序的 可执行文件的可读取位置中;
映射单元,在运行所述有待保护的程序的可执行文件时,当运 行到所述被挑选的指令段时,该映射单元根据所述通讯程序的记 录,读取有待保护的程序的可执行文件中所述被挑选指令段使用的 内存、寄存器、堆栈中的内容,并将该内容写入软件保护装置虚拟 机中对应的内存、寄存器、堆栈中;
反映射单元,该单元在所述软件保护装置虚拟机运行完其存储 的被挑选的指令段后,将该指令段相关的内存地址、寄存器名、堆 栈地址中的内容输入给主机应用程序,并根据通讯程序中有关主机 与虚拟机的内存地址、寄存器名、堆栈地址对应关系的记录,将上 述内容分别写入主机中相应的内存、寄存器、堆栈中。
10.根据权利要求9所述的装置,其特征在于,所述通讯程序 写入单元写入通讯程序的可读取位置为所述有待保护的程序的可执 行文件中去除被挑选指令段的位置。
11.根据权利要求9所述的装置,其特征在于,所述装置还包 括调用指令写入单元,该单元在有待保护的程序的可执行文件中去 除被挑选指令段的位置写入调用通讯程序的指令,此时,通讯程序 写入单元写入通讯程序的可读取位置为有待保护的程序的可执行文 件的其他位置。
12.根据权利要求11所述的装置,其特征在于,所述调用指令 写入单元写入的调用通讯程序的指令,用于调用通讯程序。
13.根据权利要求9所述的装置,其特征在于,所述通讯程序 写入单元写入通讯程序的可读取位置在有待保护的程序的可执行文 件的起始地址处,调用时,通讯程序填充所述有待保护的程序的可 执行文件中去除被挑选指令段的位置。
14.根据权利要求9所述的装置,其特征在于,所述转换单元 还根据转换结果,输出所述被挑选指令段中主机各个存储单元与软 件保护装置虚拟机中各个存储单元的对应关系的记录;
所述通讯程序写入单元接收转换单元输出的主机各个存储单元 与软件保护装置虚拟机中各个存储单元的对应关系的记录,并将该 对应关系记录在所述通讯程序中。
技术领域\n本发明涉及软件保护技术,具体地说涉及一种在软件保护装置中实现软 件保护的方法。本发明同时提供一种实现该方法的装置。\n背景技术\n现有的软件保护装置保护软件的原理是,将软件中的核心程序写入软件 保护装置,并且不在主机上保留这一部分程序的副本。例如软件加密锁就是 一种典型的软件保护装置,软件加密锁本身是一个具有程序处理和一定存储 能力的硬件,并具有并口或者通用串行总线接口与主机相连接,其主要作用 是用于软件的授权使用和防止被非法复制发行。但现有的软件加密锁等软件 保护装置可以运行C51指令却不能够运行X86指令,所以在将运行在X86 系列计算机上的程序写入软件保护装置时,需将程序的源代码在Keil C51开 发环境下编译成.hex文件,再将.hex文件转换成bin文件,bin文件是包含 C51指令的,从而可以直接将bin文件写入到软件保护装置。但是若源程序 不是由C语言编写的,需要将源程序中这一部分程序先改写成C语言的程序, 再按照上述步骤来完成。在源程序相应位置,需要开发人员编写一个与源代 码同种编程语言的通讯,以便源程序运行到这一位置时,能够寻找到软件保 护装置,调用软件保护装置中的程序,完成整个程序的功能。由此可见,这 一过程是相当烦琐的,工作量比较大,对开发人员的要求较高。\n为此,需要一种使用户可以方便的实现软件保护的方法,以便降低用户 实现软件保护的难度。\n发明内容\n针对上述缺陷,本发明解决的技术问题在于,提供一种在软件保护装置 中实现软件保护的方法,该方法可以使软件开发者无需进行程序改写,就可 以顺利的实现软件保护。同时,本发明提供一种实现该方法的装置。\n本发明提供的一种在软件保护装置中实现软件保护的方法,用于已实现 X86虚拟机的软件保护装置;包括:\n在有待保护的程序的可执行文件中挑选部分指令段,作为写入软件保护 装置的指令段;\n将被挑选的指令段中使用的主机内存地址、寄存器名、堆栈地址等转换 为软件保护装置虚拟机的内存地址、寄存器名、堆栈地址;\n将转换后的指令段写入所述软件保护装置中,同时去除原被选中指令段, 并写入通讯指令;\n运行所述被保护的程序时,当运行到写入软件保护装置的指令段时,进 行下列步骤:\n将所述写入软件保护装置指令段涉及的内存、寄存器、堆栈的内容,从 主机映射到所述软件保护装置虚拟机对应的内存、寄存器、堆栈;\n所述软件保护装置虚拟机运行该指令段;\n运行完毕后,软件保护装置虚拟机将上述内存、寄存器、堆栈中的内容 反映射到主机中对应的内存、寄存器、堆栈。\n优选地,所述通讯程序可以写在所述去除指令段的原位置。\n优选地,通讯程序写在被保护软件的任意位置,在原去除指令段的位置 处写入调用指令。\n优选地,通讯程序写在被保护软件的起始地址处,调用时,通讯程序填 充原删除指令段的位置。\n优选地,所述主机内存地址、寄存器名、堆栈地址转换为软件保护装置 虚拟机中的内存地址、寄存器名、堆栈地址时,记录两者之间的对应关系; 在所述通讯指令中,记录该对应关系。\n优选地,所述映射是将主机中内存、寄存器、堆栈的内容写入软件保护 装置虚拟机对应的内存、寄存器、堆栈中,所述反映射则与上述过程相反。\n优选地,所述在有待保护的程序中挑选部分指令段的过程,由计算机根 据程序段的重要性自动进行选择;或者由人工选择。\n优选地,所述软件保护装置虚拟机的寄存器名采用与主机相同的寄存器 名,此时,只需将所挑选的程序段中的主机内存地址转换为软件保护装置虚 拟机的内存地址。\n本发明同时提供一种使用上述方法实现软件保护的装置,包括:已实现 X86虚拟机的软件保护装置,还包括:\n选取单元,用于读取有待保护的程序,并从中挑选部分指令段,作为写 入软件保护装置的指令段输出;\n转换单元,用于接收所述选取单元输出的指令段,将该指令段中的主机 内存地址、寄存器名、堆栈地址等转换为软件保护装置虚拟机的内存地址、 寄存器名、堆栈地址,并输出经过上述处理的程序段;\n程序写入单元,用于接收所述转换单元输出的程序段,并将该程序段写 入所述软件保护装置虚拟机中;同时从待保护程序中去除被选取单元选中的 指令段;\n映射单元,在运行所述被保护程序时,当运行到所述选定程序时,该映 射单元根据所述通讯程序的记录,读取主机中所述选定程序段涉及的内存、 寄存器、堆栈中的内容,并将上述存储单元中的内容写入软件保护装置虚拟 机中对应的内存、寄存器、堆栈中;\n反映射单元,该单元在所述软件保护装置虚拟机运行完其存储的选定指 令段后,将该指令段相关的内存地址、寄存器名、堆栈地址中的内容输入给 主机应用程序,并根据通讯程序中有关主机与虚拟机的内存地址、寄存器名、 堆栈地址对应关系的记录,将上述内容分别写入主机中相应的内存、寄存器、 堆栈中;\n通讯程序写入单元,用于将通讯程序写入该待保护的程序的可读取位置 中。\n优选地,所述通讯程序写入单元写入通讯程序的可读取位置为所述去除 指令段的原位置。\n优选地,所述通讯程序写入单元写入通讯程序的可读取位置还可以为被 保护软件的任意位置,此时,该装置还包括调用指令写入单元,该单元在选 定指令段的原位置写入调用通讯程序的指令。\n优选地,所述调用指令写入单元写入的调用通讯程序的指令,用于调用 通讯程序。\n优选地,所述通讯程序写入单元写入通讯程序的可读取位置还可以在被 保护软件的起始地址处,调用时,通讯程序填充原删除指令段的位置。\n优选地,所述转换单元还根据转换结果,输出所述被选中程序段中主机 各个存储单元与软件保护装置虚拟机中各个存储单元的对应关系的记录;\n所述通讯程序写入单元接收转换单元输出的主机各个存储单元与软件保 护装置虚拟机中各个存储单元的对应关系的记录,并将该对应关系记录在所 述通讯程序中。\n本发明的基本思路是,在现有的软件保护装置内部实现X86虚拟机,并 在此基础上,将在主机上运行的程序的部分指令段转移到虚拟机上运行。为 此,可以由计算机自动对写入虚拟机的指令段进行适当的修改,将其中涉及 的主机内存地址、堆栈地址、寄存器名转化为虚拟机中的内存地址、堆栈地 址、寄存器名;并在该程序中加入通讯程序。运行该程序时,当运行到写入 虚拟机的指令段时,根据通讯程序的内容,首先将主机中与运行程序相关的 内存、堆栈、寄存器等中的内容,映射到虚拟机中对应的内存、堆栈、寄存 器,然后由虚拟机继续运行该程序。虚拟机运行结束后,再将相关内存、堆 栈、寄存器的内容反映射到主机中。最终获得完整的运行结果。\n与现有技术相比,本发明提供的方法,在软件保护装置内部实现X86虚 拟机的基础上,实现软件保护。该方法可以使运行在X86系列计算机上的程 序只需进行简单的转换,就可实现对软件的保护,显著降低了X86系列计算 机使用软件保护装置的难度。\n附图说明\n图1是本发明第一实施例设置软件加密的方法流程图;\n图2是本发明第一实施例执行所述被保护程序的方法流程图;\n图3是本发明第一实施例执行所述被保护程序时,主机与虚拟机之间映 射和反映射的示意图。\n图4是本发明第一实施例设置软件加密及执行被保护软件的总装置图。\n具体实施方式\n请参看图1,为本发明第一实施例中设置软件加密的流程图。该实施例 中,软件保护装置是加密锁,并且该加密锁中已经实现了X86虚拟机,这样, 运行在X86系列计算机上的可执行文件能够在该加密锁上执行,这样,就为 后续简化软件保护的过程创造了条件。现有技术中,存在多种方法在加密锁 上实现X86虚拟机,因此,在此不进行详细说明。以下结合图1详细说明设 置软件加密的流程。为了便于理解,该实施例结合一个具体的程序进行说明。\n步骤S101,选择有待保护的可执行文件。\n所述有待保护的可执行文件是使用各种高级语言、汇编语言等编写的程 序在PC机上运行得到的可执行文件。\n所述可执行文件具体是.exe形式的文件。由于加密锁已经实现为X86虚 拟机,因此,在一般的PC机上运行的.exe形式的可执行文件,可以在加密 锁上运行。\n步骤S102,在所述可执行文件中,选择部分程序段。\n本实施例提供的这种软件保护方法,是将部分可执行文件放置在加密锁 上,由加密锁运行。而原来可执行文件上的这部分内容则从主机上完全去除。 由于主机上不保留这部分内容,因此,不可能仅仅依靠主机上的内容获得完 整的程序,只有拥有加密锁的合法用户才能正常使用该软件。在加密锁中, 还可以对该程序段采取加密等措施。这样,就实现了对软件的保护。为了实 现对程序的有效保护,需要选择比较重要的程序段,作为放入加密锁的内容。 具体选择的方式,可以由软件开发者人工选择,也可以采用一定的标准,由 计算机自动选择较为重要的程序段。\n例如,本实施例中选择源程序中的以下段落作为写入加密锁虚拟机的程 序段。\nint add(int a,int b)\n{\nreturn a+b+constVar;\n}\n在本实施例中,constVar是一个全局变量。\n根据上述源程序编译获得的汇编语言程序如下:\n00401020 push ebp\n00401021 mov ebp,esp\n00401023 sub esp,40h\n00401026 push ebx\n00401027 push esi\n00401028 push edi\n00401029 lea edi,[ebp-40h]\n0040102C mov ecx,10h\n00401031 mov eax,0CCCCCCCCh\n00401036 rep stos dword ptr[edi]\n00401038 mov eax,dword ptr[ebp+8]\n0040103B add eax,dword ptr[ebp+0Ch]\n0040103E add eax,dword ptr[00424b04]\n00401044 pop edi\n00401045 pop esi\n00401046 pop ebx\n00401047 mov esp,ebp\n00401049 pop ebp\n0040104A ret\n由源程序编译形成的可执行程序为.exe文件,其具体形式是二进制机器 码,但是,二进制机器码不易于理解。由于汇编语言程序与二进制机器码是 直接对应的,使用汇编语言对其说明将更易于理解,因此,以上采用汇编语 言的形式说明由源程序编译而成的可执行文件。\n步骤S103,将所选择的程序段进行适应性转换后,写入所述加密锁。同 时,将该段程序从原主机的可执行文件中去除。\n所述加密锁虽然实现了X86虚拟机,但是,其硬件环境与主机仍有很大 的差别,主要差别在于,加密锁虚拟机上不可能具有与主机相同的内存环境, 以及寄存器、堆栈等,必须将准备写入的程序段的相应内容根据加密锁的环 境进行改写,也就是将该段程序使用的内存地址、寄存器名、堆栈地址等, 改为加密锁虚拟机中的内存地址、寄存器名、堆栈地址。同时,记录更改前 后使用的内存地址、寄存器名、堆栈地址的对照关系,以便后续使用。例如, 上述程序段中,要将add eax,dword ptr[00424b04]转换为add eax.dword ptr[10]。程 序中其他的内存地址以及寄存器名、堆栈地址也转换为加密锁中的内存地址、 寄存器名、堆栈地址。上述转换具有规律性,可以由计算机自动完成。由于 主机寄存器的内容有限,而一段程序使用的堆栈也是有限的,因此,加密锁 虚拟机中的寄存器、堆栈可以与主机中相同,此时,该程序中的寄存器名和 堆栈地址可以无需变换。但是,加密锁中不可能具有与主机同样多的内存, 所以,两者的内存地址完全不同。因此,内存地址必然要进行变换。\n步骤S104,在主机上所述写入加密锁的程序段的位置写入调用通讯程序 的指令,以及向程序中合适位置写入通讯程序。\n所述调用通讯程序的指令用于实现对通讯程序的调用,使程序运行到此 处后,跳转到通讯程序,由通讯程序完成通讯过程。当然,如果通讯程序直 接写入被去除的指令段的原位置,也可以不需要该调用通讯程序指令。\n所述通讯程序可以写入该待保护程序的任何合适位置,包括程序的起始 位置,以及其他合适位置。该通讯程序主要用于完成主机与加密锁之间的通 讯,首先是使主机暂停程序运行,并在该通讯程序的控制下,进行存储单元 的映射;然后控制所述加密锁虚拟机运行存储在该虚拟机上的指令段;加密 锁虚拟机运行完存储在该虚拟机中的指令段后,在该通讯程序控制下,将加 密锁虚拟机中存储单元的内容反映射到主机,然后控制主机继续运行程序。 该通讯程序中具有主机的内存、寄存器、堆栈与加密锁的内存、寄存器、堆 栈的对应关系,以便运行到此后,可以在主机与虚拟机的存储单元之间进行 映射和反映射。所述对应关系,在步骤S104对选定指令段进行适应性转换 时,在转换过程中,记录该对应关系以便记录到通讯程序中。\n步骤S105,保存上述经过变换后的.exe文件。\n上述步骤将一个可执行文件转换为了被保护的程序,该程序分为两部分, 其中一小部分存储在加密锁虚拟机中。执行该程序,必须使加密锁虚拟机与 主机连接,使主程序能够通过通讯程序将程序交给加密锁虚拟机运行。\n经过上述处理,所述的待保护程序获得保护,成为被保护程序。\n请参看图2,该图为本实施例中执行所述被保护程序的方法流程图。以 下结合该流程图对该程序中置入加密锁虚拟机部分的程序段的执行过程进行 详细说明。\n步骤S201,启动所述被保护程序的运行过程,主机将程序调入内存。\n运行用户程序时,计算机首先需要将程序调入内存,以便读取和执行\n步骤S202,开始运行该程序。\n计算机CPU读取内存中的程序,并且根据该程序的指令执行相应的命 令。运行中,该程序会有许多中间结果放入主机寄存器、堆栈以及主机内存。\n步骤S203,运行至被写入加密锁的程序段,主机根据写在该位置处的调 用通讯程序指令调用所述通讯程序,并在该通讯程序的控制下寻找加密锁虚 拟机以及进行存储单元映射等工作。\n该步骤是本实施例中的关键步骤,为了更好的说明,请参看图3。图3 中示出加密锁虚拟机301、主机302,以及它们内部的CPU、寄存器、内存、 堆栈等。该图示出映射和反映射的相关步骤。\n所述调用通讯程序的指令首先向CPU提供加密锁虚拟机中通讯程序的 地址,CPU根据该地址得以调用该通讯程序,在该通讯程序的控制下,加密 锁开始运行其中保存的指令段,主机则处于等待结果的状态。\n该步骤为图3中304所示。\n由于主机在程序执行中产生许多中间结果,放入寄存器、内存、堆栈等 各种主机的存储单元中,如果希望虚拟机正确执行程序,就需要将在虚拟机 中执行的程序段涉及的寄存器、内存、堆栈等中存储的内容进行主机到虚拟 机的映射。所谓映射,就是将主机中存储单元的内容,写入虚拟机中对应的 存储单元中。经过映射后,所述虚拟机的寄存器、内存、堆栈等就与主机具 有相同的内容,使虚拟机对所保存的程序段的运行结果和该程序段在主机中 运行完全相同。如图3中所示,图3中的306代表寄存器映射,308代表内 存映射,310代表堆栈映射。如前所述,由于通讯程序中包含主机寄存器、 内存、堆栈与虚拟机的寄存器、内存、堆栈的对应关系,因此,该种映射过 程可以根据上述对应关系方便的完成。当然,上述过程并非将主机中所有的 寄存器、堆栈、内存内容全部都映射到虚拟机中,而是仅仅将与虚拟机中保 存的程序段相关的内容映射到虚拟机中。\n步骤S204,虚拟机处理保存在其中的指令段。同时,主机处于等待状态。\n由于上述步骤已经实现了将虚拟机的环境、中间存储元件的存储结果等 转换为主机中的运行环境和存储结果,因此,此时虚拟机根据存储在其中的 程序段执行程序将获得与主机中运行该程序段相同的结果。所述程序段由加 密锁虚拟机的CPU运行。\n步骤S205,加密锁虚拟机将运行结果反映射到主机上,主机得到结果停 止等待,继续程序的运行。\n所述加密锁虚拟机已经获得所存储的程序段的运行结果,这些运行结果 全部存储在加密锁虚拟机的内存、寄存器和堆栈上。这些结果必须传送到主 机的对应内存、寄存器和堆栈上,才能使在加密锁虚拟机上的运行结果反映 到主机上。具体的传送过程与上述步骤S203的过程相反,称之为反映射。 如图3所示,305将虚拟机寄存器的内容反映射到主机相应的寄存器上;307 将虚拟机内存的内容反映射到主机内存中;309将所述虚拟机堆栈的内容反 映射到所述主机堆栈上。经过上述过程,最终使在虚拟机上获得的运行结果, 反映到主机的存储单元中,这样,在虚拟机上运行就取得与主机上运行相同 的结果。最后,进行图3中的303,使主机继续运行程序。上述过程,都是 在所述通讯程序的控制下完成的,虚拟机可以从通讯程序获知主机和虚拟机 的存储单元对应关系,从而进行正确的反映射。\n经过上述对软件设置加密锁保护和运行软件的过程的介绍,可以看出, 该实施例提供的技术方案能够在加密锁实现X86虚拟机的基础上,正确的运 行待保护的程序,使程序得到有效的保护。\n在本实施例中,软件保护装置是加密锁。另外,软件保护装置实现X86 虚拟机时,无需实现对X86系列的所有指令都可以运行的虚拟机,该虚拟机 只需要能够运行部分重要指令即可。此时选择放入虚拟机的指令段时,要选 择指令段中的所有指令都可以在该X86虚拟机上运行的指令段。\n对于以上第一实施例中提供的方法,具体可以采用多种形式的装置实现。 以下第二实施例提供一种实现上述方法的装置。\n请参看图4,为该实施例提供的装置的单元组成框图。该装置的使用环 境包括主机和实现了X86虚拟机的加密锁或者其他形式的软件保护装置。\n本实施例中提供的装置包括软件加密设置单元41、执行单元42。\n所述软件加密设置单元41用于实现对待保护程序设置软件加密,也就是 在待保护程序中选择合适的程序段写入加密锁等软件保护装置中,并对写入 加密锁的程序进行相应的处理。\n所述软件加密设置单元41包括:选取单元411、转换单元412、程序写 入单元413、调用指令写入单元414、通讯程序写入单元415。\n所述选取单元411,用于读取有待保护的程序,并从中挑选部分指令段, 作为写入软件保护装置的指令段输出。\n所述有待保护的程序包括许多指令段,可以从中选择重要的指令段作为 写入软件保护装置的指令段。为此,可以确定一种选择规则,以便选取单元 411根据该规则在待保护程序中选择重要的指令段。进行所述选择时,该待 保护程序应当已经转化为可执行文件的形式。实际上,该单元的功能也可以 通过人工实现。\n所述转换单元412,用于接收所述选取单元411输出的指令段,将该指 令段中的主机内存地址、寄存器名、堆栈地址等转换为软件保护装置虚拟机 的内存地址、寄存器名、堆栈地址,并输出经过上述处理的程序段。\n由于主机的存储单元环境与虚拟机中不同需要将主机中相关存储单元的 运行结果转换为虚拟机环境下的存储单元,才能实现在虚拟机中运行该程序 段。转换单元412将所选择的程序段中的相关存储单元转换为虚拟机中的存 储单元后输出。该转换单元412同时输出上述存储单元在主机与虚拟机中的 对应关系。\n所述程序写入单元413,用于接收所述转换单元412输出的经过转换的 程序段,并将该程序段写入所述软件保护装置虚拟机中;同时从待保护程序 中去除被选取单元411选中的该程序段。\n所述调用指令写入单元414,用于根据被选取单元挑选的具体指令段位 置,向所述待保护程序写入调用通讯程序的指令。所述调用通讯程序的指令 用于使程序运行到被选中指令段时,能够获得如何调用通讯程序的信息。该 调用指令应当与被选中指令段具有一定的关联,例如位于被选中指令段在程 序中的原位置,以便程序运行时,能够知道何时需要获得该指令段,以及从 何处获得该指令段。当然,在采用直接将通讯程序写入到被选中指令段的原 位置的方法时,可以不使用该单元。\n所述通讯程序写入单元415,用于向写入软件保护装置的程序段中写入 通讯程序。\n所述通讯程序的作用在于,当运行到被选中指令段位置时,控制主机停 止运行,并且实现主机存储单元到虚拟机存储单元的映射,然后使虚拟机运 行存储在其上的指令段;当虚拟机运行结束后,在该通讯程序控制下,虚拟 机存储单元中的内容反映射到主机,然后控制主机继续运行程序。该通讯程 序由所述通讯程序写入单元415写入主机程序的合适位置。所述通讯程序实 现已经编好,但是其中的一些数据需要根据具体情况变化。主要的数据是有 关主机与虚拟机的存储单元的对应关系,这些对应关系由所述转换单元412 输出,这些数据记录在所述通讯程序中,以便后续映射单元421和反映射单 元422使用。\n所述执行单元42的作用在于执行加密后的程序。该程序执行过程主要是 由主机运行该程序,由软件保护装置的虚拟机运行写入虚拟机的程序段。运 行过程中,当主机运行到被选中指令段时,在通讯程序的控制下,实现主机 存储单元到虚拟机存储单元的映射,并且控制虚拟机运行所存储的指令段; 当虚拟机运行完毕后,通讯程序控制虚拟机将存储单元内容反映射到主机, 最终由主机继续运行程序。\n所述映射单元421,其作用在于在运行所述被保护程序时,当运行到所 述选定程序时,该映射单元421根据所述通讯程序的记录,读取主机中所述 选定程序段涉及的内存、寄存器、堆栈中的内容,并将上述存储单元中的内 容写入软件保护装置虚拟机中对应的内存、寄存器、堆栈中。\n反映射单元422,该单元在所述软件保护装置虚拟机运行完其存储的选 定程序段后,读取所述虚拟机中与该程序段相关的内存、寄存器、堆栈中的 内容,并根据通讯程序中有关主机与虚拟机的内存地址、寄存器名、堆栈地 址对应关系的记录,将上述内容分别写入主机中相应的内存、寄存器、堆栈 中。\n以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普 通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润 饰,这些改进和润饰也应视为本发明的保护范围。
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2006-03-22
|
2005-10-19
| | |
2
| |
2005-01-19
|
2003-06-25
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 1 | | 2012-07-12 | 2012-07-12 | | |
2 | | 2012-07-12 | 2012-07-12 | | |