CN101872393A - 一种Java程序防篡改响应方案 - Google Patents
一种Java程序防篡改响应方案 Download PDFInfo
- Publication number
- CN101872393A CN101872393A CN200910135624A CN200910135624A CN101872393A CN 101872393 A CN101872393 A CN 101872393A CN 200910135624 A CN200910135624 A CN 200910135624A CN 200910135624 A CN200910135624 A CN 200910135624A CN 101872393 A CN101872393 A CN 101872393A
- Authority
- CN
- China
- Prior art keywords
- program
- java
- tamper
- response
- jump instruction
- 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.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
一种针对Java程序的软件保护技术,属于软件保护技术领域中的软件防篡改分支。该技术方案在Java程序被检测篡改后向Java程序对应的字节码文件中添加无条件跳转指令修改程序控制流图,以此作为响应,从而扰乱程序正常的运行,有效地抵抗攻击者的篡改行为。此方法是自我响应式的,能够以三种方式影响程序的执行轨迹:提前中断程序;降低程序性能;导致程序生成错误结果。实施该方案是低消耗的,并且利用了Java程序格式自身特点操纵Java字节码,添加的响应代码与Java字节码具有相似性,该方案具有高度隐秘性。
Description
所属技术领域
本方案应用于软件安全领域,提出了一种Java程序的篡改响应方法以保护Java程序的完整性。
背景技术
随着计算机软件产业的蓬勃发展,软件安全问题也日益严重。攻击者向软件代码中嵌入恶意代码或修改删除部分代码以达到自己的目的,如扰乱程序功能,绕过一些功能从而获利。作为保护软件的途径之一,软件防篡改技术阻止程序代码被非法修改。按实现防篡改功能的主体划分,软件防篡改技术可分为两类:
·外部式:通过采用软件本身之外的手段,来实现软件的防篡改。这种技术的实现不需要被保护软件本身参与计算。典型的外部式软件防篡改技术主要用在可控的运行环境中。
·自我式:在被保护软件中嵌入相关模块以实现防篡改功能。自我式的防篡改机制分为三步骤:
(1)检测:检测被保护的软件程序是否被篡改,即检测程序的完整性是否被破坏。
(2)触发:若检测模块验证程序未被篡改,则程序正常运行,否则触发响应步骤。
(3)响应:使程序无法正常运行,即,扰乱或中止程序的部分或所有功能。
随着多种软件攻击方式的出现,比如绕过网络的访问控制层;将非法代码嵌入目标软件;完全控制软件及其运行的平台等等手段,软件的运行环境不再安全,自我式软件防篡改技术更为举足轻重,它本身不保证程序不被攻击者篡改,但检测篡改事件并采取应对措施,导致程序非正常运行,从而使篡改行为失效。
目前的防篡改技术领域中,虽然检测机制与响应机制的作用与地位是等同的,但前者比后者更受相关人员的关注。目前软件防篡改领域已提出多种篡改检测方法,如校验,哨兵,加密等手段均用来检测程序的完整性。美国某高校和微软联合提出了一种针对C程序的篡改响应机制,它利用了C程序中的全局指针,在程序自身检测被篡改后,在程序某个合适的函数中设置某全局指针为空,在该函数之后被调用的函数若解引用该已被设为空值的指针,则导致程序崩溃。该响应机制具备几个优点:1.将响应与程序故障在时间与空间双维度分离,即响应篡改的位置(在一个函数中设置指针为空)与故障发生的位置(在另一个函数中空指针被解引用)不相同;响应篡改的时间与故障发生的时间不相同,解引用空指针的函数要在设置指针为空的函数调用返回后过一段时间再被调用。2.响应代码具有隐秘性,即将指针置空的语句是简单的赋值语句,不易被定位。3.程序崩溃具有可预测性,即程序经检测被篡改后,将指针置空,程序一定出现异常。同时,该响应机制也存在局限性:
·未考虑不使用指针及全局变量的程序语言,如Java。
·忽略了一条通用的编程规则:C程序在解引用指针之前会做安全检查,即只解引用非空
指针。该编程规则将阻碍上述响应方案生效。
发明内容
本方案设计了一种针对Java程序的防篡改响应机制。在Java程序被检测篡改后,该机制向Java程序中的字节码文件添加无条件跳转指令以改变程序的执行轨迹,作为篡改行为的响应,导致Java程序非法运行。本方案的实施代价较小且不易被攻击者定位识破。
要解决的技术问题
Java语言具备一次编译、多次运行的特性,成为支持多种操作系统和硬件平台的首选解决方案。Java源程序被编译成Java字节码,即class文件。Java语言这种跨平台特性也带来了安全隐患:与其它可执行文件相比,对Java字节码进行逆向工程和静态分析从而对其篡改更为容易。现有防篡改响应方法局限于C语言且忽略了一条重要的编程规范,在实际应用中无法真正生效。本方案针对Java程序,通过扰乱程序的控制流以实现防篡改响应的目的。该方案具备现有针对C程序的防篡改响应方法的优点,并且能以三种方式改变程序正常的执行轨迹,更具备实用价值。
技术方案
本防篡改响应方法解决其技术问题所采用的技术方案是:在Java程序被检测篡改后向Java字节码文件中添加无条件跳转指令以改变程序的执行轨迹。
一个Java字节码文件对应于一个Java类,类中每一个方法对应于Java字节码的一部分,由若干条Java虚拟机指令组成,每一条Java源语句都由一条至多条Java虚拟机指令与其相对应。无条件跳转指令,即goto指令,能够无条件改变程序的控制流,使程序不按指令顺序执行,即从当前goto指令的位置转向goto指令指示的目标位置。程序的选择与循环结构部分通过无条件跳转指令实现,由于程序通常包含很多的选择与循环结构,所以Java字节码跳转指令出现的频率很高。goto指令的另一特征为Java源程序中不存在源语句与其直接对应,这称为Java源程序与Java虚拟机之间的间隙。本技术方案的设计依据即基于goto指令自身在Java字节码的普遍存在性和Java源程序与Java虚拟机的间隙这两点的:在检测篡改行为后,根据本技术方案实现的工具集分析Java程序的控制流图(控制流图是一个有向图,与程序存在一一对应关系,其中,有向图的结点对应着程序的基本块,一个基本块由若干条顺序执行的指定组成,它有惟一的入口点和惟一的出口点,有向图的边表示程序流从一个基本块转向至另一个基本块,基本块之间的跳转通过无条件跳转和条件跳转指令实现。Java中,一个类方法对应一个控制流图),选择合适的位置向程序中添加无条件跳转指令重写class文件,作为对篡改的响应。Java虚拟机在执行Java字节码文件之前会验证其格式以确保字节码具备正确的内部结构,符合JAVA虚拟机规范。添加的无条件跳转指令需满足这一条件,新指令的插入位置及其目标位置都需被考虑。
该响应方法将以三种方式影响程序的执行轨迹,解释如下:
1.提前中断程序。
如图2所示,在基本块B1的出口与基本块B4的入口之间增添一条跳转指令。基本块B2或B3不被运行,程序的执行轨迹由B1->B2->B4或B1->B3->B4变化成B1->B4,程序将提前退出。
2.降低程序的性能。
如图3所示,跳转指令被插在基本块B3的出口,跳转指令的目标仅次于基本块B2的入口。此操作导致B2与B3之间产生一个循环体,程序陷入一个循环式运行轨迹:B2->B3->B2。
3.生成不正确的运行结果。
图4对应程序的功能是随机产生一个整数并输出。在基本块B6的出口与基本块B4的出口之间添加一条跳转指令,程序将呈现出不确定的运行行为。原有的控制流图存在一条选择性的轨迹流:基本块B4会随机生成一个整数,如果生成的整数大于50,将转向基本块B5,否则转向基本块B6。添加的跳转指令使程序流变成非确定性的,它导致B4与B6之间产生一个循环体,该循环体被不断执行直至B4生成的整数大于50,程序流才转向B5。即程序可能输出多次结果。
本技术方案采用如下的系统架构实现,由四个模块组成:控制流分析模块;数据流分析模块;响应代码注入模块;混淆模块。系统以由Java程序创建的原始Jar包作为输入对象,以作为发布使用的Jar包作为输出对象。系统按下列四个步骤处理原始Jar包:
1.控制流分析模块计算由原始Jar包代表的宿主程序对应的控制流图。更准确地说,每一个字节码文件中的每一个方法对应一个控制流图。计算一个Java方法的控制流图的方法如下:
·划分基本块:扫描Java方法所表示的字节码中的指令序列,根据每一条指令是否为跳转指令确定每个基本块及入口和出口。
·依据基本块的出口指令确定基本块之间的跳转联系。
·检查控制流图的连通性,保证每一个基本块与其他基本块之间都存在路径。得到最终的控制流图。
2.数据流分析模块计算每一个方法可插入的无条件跳转指令集合,本模块选择以基本块出口为无条件跳转指令的插入位置,基本块入口为其跳转目标位置。按照Java虚拟机规范,变量必须在使用前被定义,添加的跳转指令跨越基本块,可能违反这一要求。数据流分析技术可以计算每一个变量被定义的基本块及其被使用的基本块集合,获得满足上述要求的可跳转的基本块集合,进而得到可插入的无条件跳转指令集合。该步骤为第3个步骤插入防篡改代码做好准备。
3.用户根据第2个步骤的计算结果选择被操纵的方法名及待添加无条件跳转指令的插入位置和目标位置,生成配置文件。响应代码注入模块利用配置文件向原始Jar包注入防篡改代码指令,生成中间Jar包。
4.混淆模块对上述步骤生成的中间Jar包实施混淆操作,获得最终发布的Jar包。本系统使用外部混淆器与系统集成。本模块是可选的,目的是降低和序代码的可读性进而加强对程序的保护。
有益效果
本防篡改响应方法的有益效果是,针对Java程序,对攻击者的篡改行为做出响应,使得程序非正常运行,抵制攻击者的攻击行为。它具有以下3个优势:
1.隐密性。添加的跳转指令不易被攻击者定位。跳转指令不调用JavaAPI;Java程序中的条件选择及循环结构编译成Java字节码,都包含跳转指令。而程序中往往包含大量的条件选择及循环结构。因此,添加的跳转指令与Java程序对应的字节码自身具有高度相似性。
2.低消耗。向程序添加跳转指令的花费是很小的。利用Java字节码操纵工具比如BCEL即可轻易实现。
3.改变程序流图的性质。根据归约性理论,向程序中添加跳转指令,有很大可能将程序的控制流图从可归约的改变为不可归约的,这也是混淆技术使用的一种方法。进一步的,更改程序控制流图的可归约性能够应用于抵抗程序的静态分析,一些反编译工具如Jad无法对中转换后的程序成功实施反编译。该种改变程序流图的方法可以在一定程度上抑制反编译器。
附图说明
下面结合附图和实施例对本实用新型进一步说明。
图1是本说明书的摘要附图,它描绘了本技术方案采用的核心手段。
图2是添加的跳转指令导致程序提前中断示意图。
图3是添加的跳转指令降低程序性能示意图。
图4是添加的跳转指令导致程序产生错误的执行结果示意图。
图5是本技术方案的系统架构。图5中的“Valid tuples”代表一个集合,该集合每个元素是一个二元组,记作(a,b),a表示可插入的跳转指令的起始位置,b表示对应的目标指令位置。
图2,图3,图4采取相同的结构:左测为控制流图;右侧明确标记了每一个基本块的入口与出口虚拟机指令。
具体实施方式
在图4的Control Flow Analysis模块中,用户选择Java程序路径,即输入一个Jar包的路径名;选择保存程序对应控制流图信息的文件夹,一个class文件所有方法对应的控制流图的信息存储在一个文件中。该模块根据输入的Jar包,依次分析每一个class文件:根据类文件名创建相应的存储控制流图信息的文件,该文件的格式为*.CIF(control flow graphinformation file的缩写);计算控制流图并将其信息保存至对应的CIF文件中,该文件记录了对应的class文件路径名。
在图4的Data FlowAnalysis模块中,用户选择存储控制流图信息的文件夹路径名。该模块依次解析所选文件夹下每一个*.CIF文件:获取其代表class文件中每一个方法的控制流图信息,计算可插入的无条件跳转指令的位置集合,并写回*.CIF文件。
图4的Response Code Injection模块向用户循环呈现每一个class文件中每一个方法可插入的无条件跳转指令的位置集合;用户选择欲添加的无条件跳转指令位置生成用户配置文件;该模块依据用户配置文件向class文件添加无条件跳转指令作为响应代码,重写并保存class文件;处理完最后一个class文件之后,该模块将所有的class文件与相关资源文件重新打包生成中间Jar包。
图5的Obfuscator模块将中间Jar包进行混淆,生成最终发布Jar。
Claims (3)
1.一种防篡改响应机制,在程序被检测篡改后向程序中添加相关代码导致程序非正常运行,作为篡改行为的自我响应,以达到保护程序的目的,其特征是:针对Java程序向Java字节码中添加无条件跳转指令作为响应代码。
2.根据权利要求1所述的防篡改响应机制,其特征是:在检测机制检测Java程序被篡改后触发响应,分析Java程序经编译后生成的字节码文件对应的控制流图,计算可插入的无条件跳转指令的位置集合,再由用户选择向字节码中插入无条件跳转指令。
3.根据权利要求1所述的防篡改响应机制,其特征是:以Java字节码对应类文件的每一个方法为分析对象,计算其控制流图;依照数据流分析手段,确定可添加的跳转指令位置及其跳转目标位置,保证添加的跳转指令仍然能够通过Java虚拟机验证,Java程序仍然能够运行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910135624A CN101872393A (zh) | 2009-04-23 | 2009-04-23 | 一种Java程序防篡改响应方案 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910135624A CN101872393A (zh) | 2009-04-23 | 2009-04-23 | 一种Java程序防篡改响应方案 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101872393A true CN101872393A (zh) | 2010-10-27 |
Family
ID=42997251
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200910135624A Pending CN101872393A (zh) | 2009-04-23 | 2009-04-23 | 一种Java程序防篡改响应方案 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101872393A (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102360412A (zh) * | 2011-09-26 | 2012-02-22 | 飞天诚信科技股份有限公司 | Java源代码的保护方法和系统 |
CN103699820A (zh) * | 2013-12-25 | 2014-04-02 | 北京深思数盾科技有限公司 | 用于相对跳转指令的混淆方法 |
CN103984883A (zh) * | 2014-05-21 | 2014-08-13 | 湘潭大学 | 基于类依赖图的Android应用相似性检测方法 |
US8924932B2 (en) | 2013-04-11 | 2014-12-30 | International Business Machines Corporation | Using stack data and source code to rank program changes |
CN105631336A (zh) * | 2015-06-30 | 2016-06-01 | 卡巴斯基实验室股份制公司 | 检测移动装置上的恶意文件的系统及方法 |
CN106682460A (zh) * | 2016-11-25 | 2017-05-17 | 西北大学 | 一种基于两次变换的代码混淆方法 |
CN108763878A (zh) * | 2018-04-18 | 2018-11-06 | 北京奇虎科技有限公司 | 一种程序保护方法及装置 |
CN109542424A (zh) * | 2018-11-28 | 2019-03-29 | 上海大汉三通无线通信有限公司 | 一种补丁文件的生成方法、装置、设备及可读存储介质 |
CN112445522A (zh) * | 2019-09-02 | 2021-03-05 | 中科寒武纪科技股份有限公司 | 指令跳转方法、相关设备及计算机可读介质 |
-
2009
- 2009-04-23 CN CN200910135624A patent/CN101872393A/zh active Pending
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102360412A (zh) * | 2011-09-26 | 2012-02-22 | 飞天诚信科技股份有限公司 | Java源代码的保护方法和系统 |
CN102360412B (zh) * | 2011-09-26 | 2014-07-02 | 飞天诚信科技股份有限公司 | Java源代码的保护方法和系统 |
US8924932B2 (en) | 2013-04-11 | 2014-12-30 | International Business Machines Corporation | Using stack data and source code to rank program changes |
CN103699820A (zh) * | 2013-12-25 | 2014-04-02 | 北京深思数盾科技有限公司 | 用于相对跳转指令的混淆方法 |
CN103699820B (zh) * | 2013-12-25 | 2017-02-15 | 北京深思数盾科技股份有限公司 | 用于相对跳转指令的混淆方法 |
CN103984883B (zh) * | 2014-05-21 | 2017-01-25 | 湘潭大学 | 基于类依赖图的Android应用相似性检测方法 |
CN103984883A (zh) * | 2014-05-21 | 2014-08-13 | 湘潭大学 | 基于类依赖图的Android应用相似性检测方法 |
CN105631336A (zh) * | 2015-06-30 | 2016-06-01 | 卡巴斯基实验室股份制公司 | 检测移动装置上的恶意文件的系统及方法 |
CN105631336B (zh) * | 2015-06-30 | 2018-04-17 | 卡巴斯基实验室股份制公司 | 检测移动装置上的恶意文件的系统及方法 |
CN106682460A (zh) * | 2016-11-25 | 2017-05-17 | 西北大学 | 一种基于两次变换的代码混淆方法 |
CN106682460B (zh) * | 2016-11-25 | 2019-05-31 | 西北大学 | 一种基于两次变换的代码混淆方法 |
CN108763878A (zh) * | 2018-04-18 | 2018-11-06 | 北京奇虎科技有限公司 | 一种程序保护方法及装置 |
CN109542424A (zh) * | 2018-11-28 | 2019-03-29 | 上海大汉三通无线通信有限公司 | 一种补丁文件的生成方法、装置、设备及可读存储介质 |
CN112445522A (zh) * | 2019-09-02 | 2021-03-05 | 中科寒武纪科技股份有限公司 | 指令跳转方法、相关设备及计算机可读介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101872393A (zh) | 一种Java程序防篡改响应方案 | |
Collberg et al. | Distributed application tamper detection via continuous software updates | |
CN103544414B (zh) | 一种Android系统应用的深度代码混淆方法 | |
Lalande et al. | Software countermeasures for control flow integrity of smart card C codes | |
JP7154365B2 (ja) | ソフトウェアコードをセキュアにするための方法 | |
CN102222196B (zh) | 验证自修改的计算机代码校验和的方法及装置 | |
Höller et al. | Qemu-based fault injection for a system-level analysis of software countermeasures against fault attacks | |
CN101477610B (zh) | 源码和目标码联合嵌入的软件水印方法 | |
CN107092518A (zh) | 一种保护拟态防御系统软件层安全的编译方法 | |
JP5467271B2 (ja) | 情報処理装置及びプログラム、情報処理方法、記録媒体 | |
CN105787305A (zh) | 一种抵抗符号执行和污点分析的软件保护方法 | |
CN103413075A (zh) | 一种通过虚拟机保护java可执行程序的方法及设备 | |
CN102708013A (zh) | 程序语句控制的指令流控制 | |
US20190197216A1 (en) | Method, apparatus, and computer-readable medium for executing a logic on a computing device and protecting the logic against reverse engineering | |
CN107632832A (zh) | 一种面向dalvik字节码控制流混淆方法 | |
CN105468970B (zh) | 一种基于防御网的Android应用程序防篡方法及系统 | |
CN113366474A (zh) | 用于通过将计算机程序的控制流表示为数据来混淆计算机程序的系统、方法和存储介质 | |
JP4754635B2 (ja) | 制御フロー保護機構 | |
Dalai et al. | A code obfuscation technique to prevent reverse engineering | |
Liu et al. | Smart contract vulnerability detection based on symbolic execution technology | |
Ahmadvand et al. | Practical integrity protection with oblivious hashing | |
Sere et al. | Automatic detection of fault attack and countermeasures | |
Zhu et al. | Protection against indirect overflow attacks on pointers | |
Banescu et al. | Detecting patching of executables without system calls | |
Oishi et al. | Self destructive tamper response for software protection |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
DD01 | Delivery of document by public notice |
Addressee: Li Jia Document name: Notification of Publication of the Application for Invention |
|
DD01 | Delivery of document by public notice |
Addressee: Shen Xiaodong Document name: Notification of before Expiration of Request of Examination as to Substance |
|
DD01 | Delivery of document by public notice |
Addressee: Shen Xiaodong Document name: Notification that Application Deemed to be Withdrawn |
|
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20101027 |