CN111488558A - 脚本保护方法、装置、计算机可读存储介质和计算机设备 - Google Patents

脚本保护方法、装置、计算机可读存储介质和计算机设备 Download PDF

Info

Publication number
CN111488558A
CN111488558A CN202010269363.0A CN202010269363A CN111488558A CN 111488558 A CN111488558 A CN 111488558A CN 202010269363 A CN202010269363 A CN 202010269363A CN 111488558 A CN111488558 A CN 111488558A
Authority
CN
China
Prior art keywords
node
flow
script
code
execution condition
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
CN202010269363.0A
Other languages
English (en)
Other versions
CN111488558B (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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202010269363.0A priority Critical patent/CN111488558B/zh
Publication of CN111488558A publication Critical patent/CN111488558A/zh
Application granted granted Critical
Publication of CN111488558B publication Critical patent/CN111488558B/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/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • 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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Storage Device Security (AREA)

Abstract

本申请涉及一种脚本保护方法、装置、计算机可读存储介质和计算机设备,所述方法包括:获取原始脚本,并确定所述原始脚本中的流程控制节点;根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点;生成受保护脚本;所述受保护脚本包括所述流程混淆节点。本申请提供的方案,可以在保证脚本中各个流程控制节点的控制逻辑不发生变化的同时,提升了脚本的防篡改能力和抗分析能力,更有效地对脚本进行保护。

Description

脚本保护方法、装置、计算机可读存储介质和计算机设备
技术领域
本申请涉及信息安全技术领域,特别是涉及一种脚本保护方法、装置、计算机可读存储介质和计算机设备。
背景技术
目前,软件开发商主要依赖于代码混淆技术对软件产品进行保护,尤其对于可以反编译的JavaScript(一种脚本语言)而言,更需要通过有效的代码混淆技术进行保护。
代码混淆技术的主要目的在于让代码难于阅读,提升代码阅读成本和篡改难度,同时也可以提升了代码逆向解析的难度,以防止软件被篡改和非法反编译。
较为主流的代码混淆技术中,主要是对脚本中的代码内容进行简单的内容替换或者插入多余的控制流程。然而,上述的代码混淆方式存在着无法有效保护脚本的问题。
发明内容
基于此,有必要针对无法有效保护脚本的技术问题,提供一种脚本保护方法、装置、计算机可读存储介质和计算机设备。
一种脚本保护方法,包括:
获取原始脚本,并确定所述原始脚本中的流程控制节点;所述流程控制节点记录有第一执行条件;所述流程控制节点用于在所述流程控制节点的输入变量符合所述第一执行条件时执行流程跳转;
根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点;所述流程混淆节点用于对根据所述流程混淆节点的代码内容进行校验所得到的校验值进行考拉兹运算,并输出考拉兹序列;所述流程混淆节点记录有第二执行条件;所述流程混淆节点还用于根据所述考拉兹序列更新所述第二执行条件,直至所述第二执行条件与所述第一执行条件等价;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述第二执行条件时执行流程跳转;
生成受保护脚本;所述受保护脚本包括所述流程混淆节点;所述受保护脚本用于根据所述流程混淆节点输出的考拉兹序列确定待跳转流程节点,并从所述流程混淆节点跳转至所述待跳转流程节点;所述受保护脚本还用于当无法根据所述考拉兹序列确定所述待跳转流程节点时执行脚本自我保护流程。
一种脚本保护方法,包括:
获取受保护脚本;所述受保护脚本包括流程混淆节点;所述流程混淆节点记录有执行条件;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述执行条件时执行流程跳转;
在执行所述流程混淆节点的代码内容时,对所述流程混淆节点的代码内容进行校验,得到校验值;
对所述校验值进行考拉兹运算,得到考拉兹序列,并根据所述考拉兹序列更新所述执行条件;
当所述流程混淆节点的输入变量符合更新后的所述执行条件、且根据所述考拉兹序列得到待跳转流程节点时,从所述流程混淆节点跳转至所述待跳转流程节点,并执行所述待跳转流程节点的代码内容;
当所述流程混淆节点的输入变量符合更新后的所述执行条件、且无法根据所述考拉兹序列得到待跳转流程节点时,执行脚本自我保护流程。
在一个实施例中,所述受保护脚本包括有防篡改验证组件、防篡改响应组件和神经网络;所述防篡改验证组件被调用时,用于对所述流程混淆节点的代码内容进行校验,得到所述校验值;所述流程混淆节点具有第一节点标识值,所述流程混淆节点的代码内容在执行时,用于根据所述考拉兹序列输出考拉兹特征值;所述神经网络被调用时,用于输入所述流程混淆节点的第一节点标识值和所述考拉兹特征值,并输出第二节点标识值;所述受保护脚本还包括有多个候选流程节点;所述候选流程节点具有第三节点标识值;所述受保护脚本用于将所述第三节点标识值与所述第二节点标识值匹配的候选流程节点作为所述待跳转流程节点;所述受保护脚本还用于当不存在所述第三节点标识值与所述第二节点标识值匹配的候选流程节点时,调用所述防篡改响应组件;所述防篡改响应组件被调用时执行代码自毁功能。
在一个实施例中,所述受保护脚本还包括反调试组件;所述反调试组件被调用时,检测是否存在对受保护脚本的非法调试活动时,当检测到对受保护脚本的非法调试活动时执行反调试功能。
一种脚本保护装置,包括:
脚本获取模块,用于获取原始脚本,并确定所述原始脚本中的流程控制节点;所述流程控制节点记录有第一执行条件;所述流程控制节点用于在所述流程控制节点的输入变量符合所述第一执行条件时执行流程跳转;
代码混淆模块,用于根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点;所述流程混淆节点用于对根据所述流程混淆节点的代码内容进行校验所得到的校验值进行考拉兹运算,并输出考拉兹序列;所述流程混淆节点记录有第二执行条件;所述流程混淆节点还用于根据所述考拉兹序列更新所述第二执行条件,直至所述第二执行条件与所述第一执行条件等价;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述第二执行条件时执行流程跳转;
脚本生成模块,用于生成受保护脚本;所述受保护脚本包括所述流程混淆节点;所述受保护脚本用于根据所述流程混淆节点输出的考拉兹序列确定待跳转流程节点,并从所述流程混淆节点跳转至所述待跳转流程节点;所述受保护脚本还用于当无法根据所述考拉兹序列确定所述待跳转流程节点时执行脚本自我保护流程。
在一个实施例中,所述流程控制节点包括节点原始代码,所述节点原始代码包括所述第一执行条件;所述代码混淆模块,具体用于:
确定所述第一执行条件的条件参数,以及,获取流程混淆代码模板;所述流程混淆代码模板包括初始执行条件;在所述流程混淆代码模板中,将所述初始执行条件的条件参数修改为所述第一执行条件的条件参数,得到流程混淆代码;将所述流程控制节点的节点原始代码替换为所述流程混淆代码,得到所述流程混淆节点。
在一个实施例中,所述装置还包括:
验证组件嵌入模块,用于在所述原始脚本中嵌入防篡改验证组件;所述防篡改验证组件用于对所述流程控制节点的代码内容进行校验,得到所述校验值;
网络嵌入模块,用于在所述原始脚本中嵌入神经网络;所述流程混淆节点具有第一节点标识值,所述流程混淆节点用于根据所述考拉兹序列输出考拉兹特征值;所述神经网络用于输入所述流程混淆节点的第一节点标识值和所述考拉兹特征值,并输出第二节点标识值;
响应组件嵌入模块,用于在所述原始脚本中嵌入防篡改响应组件;所述原始脚本包括有多个候选流程节点;所述候选流程节点具有第三节点标识值;所述原始脚本用于将所述第三节点标识值与所述第二节点标识值匹配的候选流程节点作为所述待跳转流程节点;所述原始脚本还用于当不存在所述第三节点标识值与所述第二节点标识值匹配的候选流程节点时,调用所述防篡改响应组件;所述防篡改响应组件在被调用时执行代码自毁功能;
所述脚本生成模块,具体用于:根据嵌入有所述防篡改验证组件、所述神经网络和所述防篡改响应组件的原始脚本,得到所述受保护脚本。
在一个实施例中,所述防篡改验证组件包括代码位置占位符,所述流程控制节点的代码内容在所述原始脚本中具有第一起始位置;所述装置还具体用于:
根据所述流程混淆节点的代码内容与所述流程控制节点的代码内容之间的差异,确定代码位置偏移量;根据所述第一起始位置和所述代码位置偏移量,确定所述流程混淆节点在所述原始脚本中的第二起始位置;在所述防篡改验证组件的代码位置占位符中写入所述第二起始位置;所述防篡改验证组件用于根据所述第二起始位置定位所述流程混淆节点的代码内容。
在一个实施例中,所述装置还包括:
反调试组件嵌入模块,用于在所述原始脚本中嵌入反调试组件;所述反调试组件用于在检测到对所述受保护脚本的非法调试活动时执行反调试功能。
在一个实施例中,所述装置还包括:
随机生成模块,用于随机生成混淆标识符和/或混淆数值类型;
替换模块,用于将所述流程混淆节点的代码内容中预设的原始标识符替换为所述混淆标识符,和/或,将所述流程混淆节点的代码内容中预设的原始数值类型替换为所述混淆数值类型。
在一个实施例中,所述脚本获取模块,具体用于:
从所述原始脚本中抽取出抽象语法树;所述抽象语法树包括流程节点;判断所述流程节点是否包含有流程控制语句;若是,则将包含有所述流程控制语句的流程节点作为所述流程控制节点。
一种脚本保护装置,包括:
脚本获取模块,用于获取受保护脚本;所述受保护脚本包括流程混淆节点;所述流程混淆节点记录有执行条件;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述执行条件时执行流程跳转;
校验模块,用于在执行所述流程混淆节点的代码内容时,对所述流程混淆节点的代码内容进行校验,得到校验值;
考拉兹运算模块,用于对所述校验值进行考拉兹运算,得到考拉兹序列,并根据所述考拉兹序列更新所述执行条件;
跳转模块,用于当所述流程混淆节点的输入变量符合更新后的所述执行条件、且根据所述考拉兹序列得到待跳转流程节点时,从所述流程混淆节点跳转至所述待跳转流程节点,并执行所述待跳转流程节点的代码内容;
保护模块,用于当所述流程混淆节点的输入变量符合更新后的所述执行条件、且无法根据所述考拉兹序列得到待跳转流程节点时,执行脚本自我保护流程。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取原始脚本,并确定所述原始脚本中的流程控制节点;所述流程控制节点记录有第一执行条件;所述流程控制节点用于在所述流程控制节点的输入变量符合所述第一执行条件时执行流程跳转;
根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点;所述流程混淆节点用于对根据所述流程混淆节点的代码内容进行校验所得到的校验值进行考拉兹运算,并输出考拉兹序列;所述流程混淆节点记录有第二执行条件;所述流程混淆节点还用于根据所述考拉兹序列更新所述第二执行条件,直至所述第二执行条件与所述第一执行条件等价;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述第二执行条件时执行流程跳转;
生成受保护脚本;所述受保护脚本包括所述流程混淆节点;所述受保护脚本用于根据所述流程混淆节点输出的考拉兹序列确定待跳转流程节点,并从所述流程混淆节点跳转至所述待跳转流程节点;所述受保护脚本还用于当无法根据所述考拉兹序列确定所述待跳转流程节点时执行脚本自我保护流程。
一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取原始脚本,并确定所述原始脚本中的流程控制节点;所述流程控制节点记录有第一执行条件;所述流程控制节点用于在所述流程控制节点的输入变量符合所述第一执行条件时执行流程跳转;
根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点;所述流程混淆节点用于对根据所述流程混淆节点的代码内容进行校验所得到的校验值进行考拉兹运算,并输出考拉兹序列;所述流程混淆节点记录有第二执行条件;所述流程混淆节点还用于根据所述考拉兹序列更新所述第二执行条件,直至所述第二执行条件与所述第一执行条件等价;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述第二执行条件时执行流程跳转;
生成受保护脚本;所述受保护脚本包括所述流程混淆节点;所述受保护脚本用于根据所述流程混淆节点输出的考拉兹序列确定待跳转流程节点,并从所述流程混淆节点跳转至所述待跳转流程节点;所述受保护脚本还用于当无法根据所述考拉兹序列确定所述待跳转流程节点时执行脚本自我保护流程。
上述脚本保护方法、装置、计算机可读存储介质和计算机设备,通过确定原始脚本的流程控制节点,并根据流程控制节点中的第一执行条件对流程控制节点进行代码混淆,得到记录有第二执行条件的流程混淆节点,并最终得到包含有流程混淆节点的受保护脚本,受保护脚本的流程混淆节点在执行时,可以对流程混淆节点的代码内容进行校验,并将所得到的校验值进行考拉兹运算,得到考拉兹序列,然后利用该考拉兹序列更新第二执行条件,以使得第二执行条件等价于第一执行条件,此外,还利用考拉兹序列确定待跳转流程节点,以在需要执行流程跳转时,从当前的流程混淆节点跳转至待跳转流程节点,当流程混淆节点的代码内容被篡改,则会由于无法根据考拉兹序列确定待跳转流程节点而触发脚本自我保护流程,从而,在保证脚本中各个流程控制节点的控制逻辑不发生变化的前提下,利用考拉兹运算、根据考拉兹序列更新执行条件等复杂的控制逻辑对脚本进行代码混淆,使得受保护脚本具备防篡改功能的同时,提升了代码结构的复杂度,增加了阅读代码的难度,提升了脚本的防篡改能力,使得脚本得到有效的保护。
附图说明
图1为一个实施例中的一种脚本保护方法的应用环境图;
图2为一个实施例中的一种脚本保护方法的流程示意图;
图3为另一个实施例中的一种脚本保护方法的流程示意图;
图4为一个实施例的一种对脚本进行保护处理的流程示意图;
图5为一个实施例的一种受保护的脚本运行时的流程示意图;
图6为一个实施例中的一种脚本保护装置的结构框图;
图7为另一个实施例中的一种脚本保护装置的结构框图;
图8为一个实施例中计算机设备的结构框图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
图1为一个实施例中的一种脚本保护方法的应用环境图。
参照图1,该脚本保护方法应用于脚本处理系统。该脚本处理系统包括服务器110和终端120。终端120和服务器110通过网络连接。终端120具体可以是台式终端或移动终端,移动终端具体可以手机、平板电脑、笔记本电脑等中的至少一种。服务器110可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
上述的脚本处理系统可以应用于对脚本进行保护的应用场景中。例如,研发人员利用JavaScript脚本语言编写某个应用脚本,并准备发布该应用脚本。在发布应用脚本之前,研发人员可以将应用脚本输入至该脚本处理系统,脚本处理系统的服务器110可以基于本申请中的脚本保护方法对应用脚本中的原始代码进行代码混淆,得到受保护的应用脚本,并下发受保护的应用脚本至多个终端120。
当然,本申请的脚本保护方法可以应用于基于不同脚本语言所编写的脚本,例如,本申请的脚本保护方法还可以对Python(一种脚本语言)、VBScript(一种脚本语言)等脚本进行保护。
如图2所示,在一个实施例中,提供了一种脚本保护方法。本实施例主要以该方法应用于上述图1中的服务器110来举例说明。参照图2,该脚本保护方法具体包括如下步骤:
S202,获取原始脚本,并确定所述原始脚本中的流程控制节点;所述流程控制节点记录有第一执行条件;所述流程控制节点用于在所述流程控制节点的输入变量符合所述第一执行条件时执行流程跳转。
其中,原始脚本可以为代码内容未被保护的脚本。
其中,流程控制节点可以为原始脚本中用于控制是否跳转至下一个流程的流程节点。流程节点用于代表脚本中具有特定语法结构的、用于执行特定处理流程的代码片段。流程节点可以具体包括有流程控制节点和非流程控制节点。流程控制节点用于控制流程节点之间的跳转,相对地,非流程控制节点则不涉及到流程节点的跳转。例如,在JavaScript中,可以用“do()”代表在满足一定条件下将执行跳转至下一流程节点的功能。
其中,执行条件可以代表判断是否执行特定功能的条件逻辑。例如,在JavaScript中的if(x==A)do_sth(),代表当变量x等于C时输出特定功能的执行条件。
具体实现中,软件开发人员在开发出某个脚本后,需要对脚本中的代码进行保护,软件开发人员可以将该脚本输入至上述的服务器110中。服务器110由此可获取该脚本作为上述的原始脚本。
服务器110可以从该脚本的代码中抽取出抽象语法树(Abstract Syntax Tree,AST),抽象语法树通常是以多个流程节点的形式呈现。服务器110可以在多个流程节点中,分别判断各个流程节点是否包含有流程控制语句。例如,对于JavaScript脚本,可以判断某个流程节点的代码内容是否包含有if/switch的语句。服务器110可以将包含有流程控制语句的流程节点,作为上述的流程控制节点。
需要说明的是,流程控制节点中可以包含有执行条件,为了区分说明,流程控制节点中的执行条件命名为第一执行条件。当原始脚本在运行过程中产生的变量输入至流程控制节点时,需要判断该输入变量是否符合第一执行条件,如符合则会执行流程跳转的处理,从而实现对流程的控制。
例如,在一个JavaScript脚本的流程控制节点中,其代码内容包含有“if(x==A),do_sth()”,代表“输入变量x等于A”的执行条件,当x等于A时则会跳转至下一个流程节点。
S204,根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点;所述流程混淆节点用于对根据所述流程混淆节点的代码内容进行校验所得到的校验值进行考拉兹运算,并输出考拉兹序列;所述流程混淆节点记录有第二执行条件;所述流程混淆节点还用于根据所述考拉兹序列更新所述第二执行条件,直至所述第二执行条件与所述第一执行条件等价;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述第二执行条件时执行流程跳转。
其中,考拉兹运算可以为通过考拉兹函数所进行的计算过程。具体地,输入任意大小的正整数至考拉兹函数,若输入的正整数为偶数,考拉兹函数则将该正整数除以2,并输出计算结果;若输入的正整数为奇数,则将该正整数乘以3后再加1,并输出计算结果。当输出的计算结果不为1时,将输出的计算结果再次输入考拉兹函数进行下一轮计算。在该计算过程中,最终必定会输出正整数1。
以下为针对正整数3进行考拉兹运算的例子:
第一步,3为奇数,计算得到3*3+1=10;
第二步,10为偶数,计算得到10/2=5;
第三步,5为奇数,计算得到5*3+1=16;
第四步,16为偶数,计算得到16/2=8;
第五步,8为偶数,计算得到8/2=4;
第六步,4为偶数,计算得到4/2=2;
第七步,2为偶数,计算得到2/2=1。
上述的考拉兹函数是基于考拉兹猜想所设计的,考拉兹猜想又称为“3x+1问题”,其具体内容是指,对于任意一个大于1的正整数,对该正整数反复进行考拉兹函数的计算,最终的计算结果必定为1。
其中,考拉兹序列可以为针对某个正整数进行反复多次考拉兹运算后所输出的计算结果的序列。
例如,在上述对正整数为3进行考拉兹运算的例子的基础上,考拉兹序列则为3-10-5-16-8-4-2-1。对于任意两个不同的正整数进行考拉兹运算,所得到的考拉兹序列必然是不同的。因此,正整数与其进行考拉兹运算所产生的考拉兹序列之间具有唯一对应的特性。由于考拉兹序列中各个数值之间没有呈现出一定的变化规律,因此,考拉兹序列也称为考拉兹冰雹序列。
其中,代码混淆可以为对原始的代码内容进行删减、替换等修改操作以使得修改后的代码内容与原始的代码内容产生较大差异、且难以被阅读的处理。
其中,流程混淆节点可以为经过代码混淆后的流程节点。
其中,校验值可以为对代码内容进行校验后得到的数值。
具体实现中,服务器110可以针对抽象语法树中的流程控制节点进行代码混淆,例如,可以首先获取预设的流程混淆代码模板,然后,读取流程控制节点中的第一执行条件的条件参数,将该条件参数写入至该流程混淆代码模板中,得到流程混淆代码,将该流程混淆代码替换流程控制节点的原始代码,由此,得到了经过代码混淆的流程混淆节点。
流程混淆节点中的流程混淆代码可以包含有考拉兹函数,该考拉兹函数用于进行考拉兹运算。
例如,可以通过以下代码实现在流程混淆节点中通过考拉兹函数进行考拉兹函数:
Figure BDA0002442554820000111
在执行脚本的过程中,当执行流程混淆节点的流程时,则会对流程混淆节点的代码内容进行校验,得到代码内容的校验值。然后,将该校验值输入至考拉兹函数,得到该校验值对应的考拉兹序列。
例如,可以通过CRC32(循环冗余算法,Cyclic Redundancy Check)校验算法对流程混淆节点的代码内容进行校验,得到校验值check为3。将上述例子中的变量y赋值3,经过对正整数3进行考拉兹运算,得到了3-10-5-16-8-4-2-1的考拉兹序列。
实际应用中,可以通过在原始脚本的抽象语法树中嵌入相关组件的方式来实现对代码内容的校验。例如,可以在抽象语法树中嵌入可以实现校验处理的验证组件,该验证组件可以获取代码内容并输出校验值。
服务器110对原始脚本进行代码混淆之后,使得流程控制节点中的第一执行条件被混淆为第二执行条件,得到了流程混淆节点。当脚本在运行过程中产生的变量输入至流程混淆节点时,流程混淆节点可以判断该输入变量是否符合第二执行条件,如符合,则会执行流程跳转的处理,从而实现对流程的控制。
上述通过校验值进行考拉兹运算得到的考拉兹序列,则可以用于更新第二执行条件,直至将第二执行条件更新至为与第一执行条件等价的执行条件。
例如,第一执行条件为“x=A”,经过对第一执行条件进行混淆,得到第二执行条件为“x+check<A+2、且x-check>A-2”。
流程混淆节点的第二执行条件可以根据考拉兹序列进行更新。具体地,在运行脚本的过程中,当执行流程混淆节点的流程时,对校验值进行每一次考拉兹运算所输出的数值,均会对第二执行条件进行更新。由于任何正整数在经过多次反复的考拉兹运算后,最终必然会输出数值正整数1,因此,可以使得第二执行条件与第一执行条件等价。
例如,在上述例子的基础上,第二执行条件为“x+check<A+2、且x-check>A-2”,check经过每一次的考拉兹运算后,check的数值均会发生变化,使得第二执行条件不断更新。无论check取任何正整数的数值,经过反复多次考拉兹运算后,check必然为1,即,考拉兹序列中最后一个数值必然为1,因此,第二执行条件“x+check<A+2、且x-check>A-2”,会根据考拉兹序列中最后一个数值1,被更新为“x+1<A+2、且x-1>A-2”,即,第二执行条件为“A-1<x<A+1”,而在该不等式下,只有A可以符合第二执行条件,也即是说,第二执行条件“A-1<x<A+1”等价于第一执行条件“x=A”。因此,根据考拉兹序列更新第二执行条件,可以使得第二执行条件等价于第一执行条件。
通过对代码内容的校验值进行考拉兹运算得到考拉兹序列,然后利用考拉兹序列最后一个数值必然为1的特性,可以将第一执行条件混淆成等价于第一执行条件的第二执行条件,从而在实现代码内容的混淆的同时,保证流程节点的控制逻辑不发生变化。
S206,生成受保护脚本;所述受保护脚本包括所述流程混淆节点;所述受保护脚本用于根据所述流程混淆节点输出的考拉兹序列确定待跳转流程节点,并从所述流程混淆节点跳转至所述待跳转流程节点;所述受保护脚本还用于当无法跳转至所述待跳转流程节点时执行脚本自我保护流程。
其中,待跳转流程节点可以为进行流程跳转时所要跳至的下一个流程节点。
其中,脚本自我保护流程可以为对受保护脚本进行保护的流程。例如,执行脚本自我保护流程后将会对脚本代码进行自毁,或者将脚本代码替换为无法执行的代码。
具体实现中,服务器110针对抽象语法树中流程控制节点进行代码混淆、得到流程混淆节点后,得到了包含有流程混淆节点的抽象语法树,服务器110可以将包含有流程混淆节点的抽象语法树进行编译,得到受保护脚本。
在运行受保护脚本的过程中,当流程跳转至流程混淆节点时,首先会判断输入至流程混淆节点的变量是否符合该流程混淆节点的第二执行条件,如果符合第二执行条件,则可以执行流程跳转。在执行流程跳转时,则会利用上述的考拉兹序列确定待跳转流程节点,并从当前的流程混淆节点跳转至待跳转流程节点。如果无法利用考拉兹序列确定待跳转流程节点时,则会跳转至代码保护流程节点,以执行脚本自我保护流程。
更具体地,受保护脚本可以包含有用于根据考拉兹序列确定待跳转流程节点的神经网络和用于执行脚本自我保护流程的响应组件。此外,受保护脚本中的各个流程节点可以具有对应的节点标识值。流程混淆节点确定考拉兹序列后,可以计算该考拉兹序列的考拉兹特征值,然后,将流程混淆节点对应的第一节点标识值和考拉兹特征值,输入至神经网络,神经网络输出第二节点标识值。
然后,将该第二节点标识值将受保护脚本中各个流程节点的节点标识值进行匹配,当存在有节点标识值与第二节点标识值匹配的流程节点时,则可以将节点标识值匹配的流程节点,确定为待跳转流程节点。当遍历各个流程节点后,确定不存在节点标识值匹配的流程节点时,则可以调用响应组件,响应组件被调用时执行代码自毁功能,使得脚本无法正常运行。
需要说明的是,本申请的脚本保护方法通过实现考拉兹运算的代码混淆,可以提高脚本的防篡改能力。
具体地,由于任意一个正整数与其进行考拉兹运算所产生的考拉兹序列之间,具有唯一对应的特性,当流程混淆节点的代码内容被篡改,对篡改的代码内容进行校验,所得到的校验值必然会发生变化,针对发生变化的校验值进行考拉兹运算所得到的考拉兹序列,也必然会发生变化。
考拉兹序列的变化,则会导致无法得到与正确的待跳转流程节点的节点标识值匹配的节点标识值,导致无法确定正确的待跳转流程节点而跳转失败,并触发了脚本自我保护流程,导致脚本无法正常运行。在受保护脚本代码未被篡改的情况下,受保护脚本才能根据考拉兹序列跳转至正确的待跳转流程节点。从而,实现了受保护脚本的防篡改功能。
例如,受保护的JavaScript脚本中,某个流程混淆节点的代码内容的校验值check=3,其考拉兹序列为3-10-5-16-8-4-2-1,当该流程混淆节点的代码内容被篡改,校验值check`相应地变更为7,对该校验值check`进行考拉兹运算得到的考拉兹序列为7-22-11-34-17-52-26-13-40-20-10-5-16-8-4-2-1,与check=3的考拉兹序列不同,因此,无法根据该考拉兹序列跳转至正确的待跳转流程节点,并触发脚本自我保护流程。
如果用户想对受保护脚本进行非法篡改,为了不破坏脚本中的代码语义、并保证被篡改的脚本可以顺利运行,则需要通过人工阅读代码的方式来理解各个流程混淆节点包含有考拉兹运算、第二执行条件等复杂的控制逻辑,以移除触发脚本自我保护流程的相关组件,该方式需要花费大量的时间和精力,从而,增加了非法篡改的难度和耗费成本,提高了受保护脚本的防篡改能力。
需要进一步说明的是,本申请的脚本保护方法通过实现考拉兹运算的代码混淆,除了使得脚本有较高的防篡改能力,还可以提高脚本的抗分析能力。
具体地,目前通常是通过代码分析工具对受保护脚本进行逆向解析时,代码分析工具主要以符号执行的方式为基础进行动态程序分析处理。其中,符号执行是一种采用符号来替代真实值以遍历脚本中的节点路径的方式。当脚本中存在流程的循环时,符号执行的方式会尽可能遍历所有路径,因此,在进行每一个流程的循环之后,则会形成至少两个分支路径,当循环的次数足够多时,则会造成数量庞大的路径,迅速消耗内存的计算资源。
因此,当以符号执行为基础对流程混淆节点中的运算逻辑进行动态程序分析处理时,由于流程混淆节点中的考拉兹运算过程存在大量的循环运算,因此会引发路径爆炸效应的循环展开,使得代码分析工具耗尽计算资源,无法有效地对受保护脚本进行逆向解析,从而,提高了受保护脚本的抗分析能力。
需要说明的是,本申请的脚本保护方法中可以针对脚本中的一个流程控制节点进行代码混淆,还可以针对脚本中的多个、甚至全部流程控制节点进行代码混淆。本申请对具体需要进行代码混淆的流程控制节点的数量不作限制。
上述的脚本保护方法中,通过确定原始脚本的流程控制节点,并根据流程控制节点中的第一执行条件对流程控制节点进行代码混淆,得到记录有第二执行条件的流程混淆节点,并最终得到包含有流程混淆节点的受保护脚本,受保护脚本的流程混淆节点在执行时,可以对流程混淆节点的代码内容进行校验,并将所得到的校验值进行考拉兹运算,得到考拉兹序列,然后利用该考拉兹序列更新第二执行条件,以使得第二执行条件等价于第一执行条件,此外,还利用考拉兹序列确定待跳转流程节点,以在需要执行流程跳转时,从当前的流程混淆节点跳转至待跳转流程节点,当流程混淆节点的代码内容被篡改,则会由于无法根据考拉兹序列确定待跳转流程节点而触发脚本自我保护流程,从而,在保证脚本中各个流程控制节点的控制逻辑不发生变化的前提下,利用考拉兹运算、根据考拉兹序列更新执行条件等复杂的控制逻辑对脚本进行代码混淆,使得受保护脚本具备防篡改功能的同时,提升了代码结构的复杂度,增加了阅读代码的难度,提升了脚本的防篡改能力,使得脚本得到有效的保护。
在一个实施例中,所述确定所述原始脚本中的流程控制节点,包括:
从所述原始脚本中抽取出抽象语法树;所述抽象语法树包括流程节点;判断所述流程节点是否包含有流程控制语句;若是,则将包含有所述流程控制语句的流程节点作为所述流程控制节点。
其中,抽象语法树可以为根据语法结构将脚本中的代码划分出的节点及分支节点的集合。
其中,流程控制语句为用于控制流程跳转的语句。例如,JavaScript脚本语言的“if/switch”等。
具体实现中,服务器110可以从原始脚本中抽取出抽象语法树,抽取出的抽象语法树可以包含有多个流程节点,服务器110可以判断流程节点的代码内容中是否包含有“if”、“switch”等的流程控制语句。当流程节点的代码内容包含有流程控制语句,则判定该流程节点为流程控制节点。当流程节点的代码内容不包含有流程控制语句,则判定该流程节点为非流程控制节点。通过流程控制语句将流程节点分类为流程控制节点和非流程控制节点,以便在后续处理中针对控制流程的流程节点进行代码混淆。
上述的脚本保护方法,通过从原始脚本中抽取抽象语法树,并根据流程控制语句确定流程控制节点,以便针对流程控制节点进行代码混淆,从而可以在保证代码混淆的效果的同时减少代码混淆的计算量,提升脚本保护的效率。
在一个实施例中,所述流程控制节点包括节点原始代码,所述节点原始代码包括所述第一执行条件;所述步骤S204,可以具体包括以下步骤:
确定所述第一执行条件的条件参数,以及,获取流程混淆代码模板;所述流程混淆代码模板包括初始执行条件。
在所述流程混淆代码模板中,将所述初始执行条件的条件参数修改为所述第一执行条件的条件参数,得到流程混淆代码。
将所述流程控制节点的节点原始代码替换为所述流程混淆代码,得到所述流程混淆节点。
其中,流程混淆代码模板可以为预设的用于进行代码混淆的模板。
其中,节点原始代码可以为流程控制节点中未被进行代码混淆的代码。
具体实现中,服务器110可以根据在代码混淆中具有通用性的代码内容制作流程混淆代码模板,例如,对于用于进行考拉兹运算的代码内容,通常具有通用性,因此可以制作出包含有用于考拉兹运算的代码内容的流程混淆模板。
由于不同流程节点中,第一执行条件的条件参数通常是不同的,因此,可以设置流程混淆代码模板中的初始执行条件的条件参数为空。在进行代码混淆时,可以首先获取流程控制节点的第一执行条件的条件参数,然后将该条件参数写入至流程混淆代码模板中的初始执行条件的条件参数。然后,将写入了第一执行条件的条件参数的流程混淆代码模板,作为流程混淆代码,并将该流程混淆代码替换流程控制节点的节点原始代码,由此得到了流程混淆节点。
例如,流程控制节点的节点原始代码为:
if(x==A)
do_sth();
该节点原始代码的条件参数为“A”,根据条件参数“A”修改流程混淆代码模板的条件参数,得到如下的流程混淆代码:
Figure BDA0002442554820000171
其中,check为对流程混淆节点的代码内容进行校验得到的校验值;C1(z)和C1(z)用于对考拉兹序列进行特定函数的运算,以得到考拉兹特征值。
将上述的流程混淆代码替换原始节点代码,得到了流程混淆节点,实现了对脚本的代码混淆。
上述脚本保护方法中,通过将流程控制节点的节点原始代码替换为流程混淆代码以得到流程混淆节点,由于受保护脚本在执行时流程混淆节点会进行考拉兹运算,而考拉兹运算需要进行大量的循环运算,使得代码分析工具在对受保护脚本进行逆向解析时,由于大量的循环运算会引发路径爆炸,造成内存的计算资源快速消耗而无法继续分析,从而提升了脚本的抗分析能力。因此,通过上述的脚本保护方法对脚本进行代码混淆,在保证脚本中各个流程控制节点的控制逻辑不发生变化的同时,提升了脚本的防篡改能力和抗分析能力,更有效地对脚本进行保护。
在一个实施例中,所述方法还包括:
在所述原始脚本中嵌入防篡改验证组件;所述防篡改验证组件用于对所述流程混淆节点的代码内容进行校验,得到所述校验值;
在所述原始脚本中嵌入神经网络;所述流程混淆节点具有第一节点标识值,所述流程混淆节点用于根据所述考拉兹序列输出考拉兹特征值;所述神经网络用于输入所述流程混淆节点的第一节点标识值和所述考拉兹特征值,并输出第二节点标识值;
在所述原始脚本中嵌入防篡改响应组件;所述原始脚本包括有多个候选流程节点;所述候选流程节点具有第三节点标识值;所述原始脚本用于将所述第三节点标识值与所述第二节点标识值匹配的候选流程节点作为所述待跳转流程节点;所述原始脚本还用于当不存在所述第三节点标识值与所述第二节点标识值匹配的候选流程节点时,调用所述防篡改响应组件;所述防篡改响应组件在被调用时执行代码自毁功能;
所述生成受保护脚本,包括:
根据嵌入有所述防篡改验证组件、所述神经网络和所述防篡改响应组件的原始脚本,得到所述受保护脚本。
其中,候选流程节点可以为用于在确定待跳转流程节点时候选的流程节点。
其中,节点标识值可以为用于唯一标识流程节点的数值。例如,对于JavaScript脚本中switch-case结构的流程节点,将其case值作为节点标识值。第一节点标识值可以为流程混淆节点的节点标识值,第二节点标识值可以为神经网络输出的节点标识值,第三节点标识值可以为候选流程节点的节点标识值。
其中,神经网络可以为用于根据流程混淆节点的第一节点标识值和考拉兹特征值输出第二节点标识值的算法。神经网络可以具体为卷积神经网络(Convolutional NeuralNetworks,CNN)、支持向量机(Support Vector Machine,SVM)等的神经网络。
其中,代码自毁功能用于对脚本的代码进行破坏以使得脚本无法正常运行的功能。
具体实现中,在从原始脚本抽取出抽象语法树之后,可以在抽象语法树中嵌入防篡改组件。防篡改组件可以具体包括防篡改验证组件和防篡改响应组件。
其中,在运行受保护脚本的过程中,防篡改验证组件用于对流程混淆节点的代码内容进行校验,以得到校验值。
实际应用中,防篡改验证组件可以利用JavaScript所提供的toString方法,读取受保护脚本中各个流程节点的具体代码内容,并通过CRC32算法计算代码内容的校验值。
实际应用中,可以在每个流程节点嵌入防篡改验证组件,也可以在脚本的特定位置嵌入单个的防篡改验证组件。
其中,在运行受保护脚本的过程中,防篡改响应组件用于在被调用时进行代码自毁处理。
此外,还可以在原始脚本中嵌入神经网络,在运行受保护脚本的过程中,该神经网络用于输出节点标识值,以跳转至与节点标识值对应的流程节点。具体地,可以首先确定脚本中各个流程节点的节点标识值。在得到流程混淆节点的校验值时,可以对该校验值通过考拉兹函数进行考拉兹运算,然后,通过复合函数对进行考拉兹运算后得到的数值进行运算,得到考拉兹特征值。由此,建立了校验值、考拉兹序列、考拉兹特征值之间的唯一对应关系。
实际应用中,可以针对奇数和偶数的校验值分别采用不同的运算方式以得到考拉兹特征值。例如,在流程混淆代码中,当校验值check为奇数时,可以通过C1(z)来计算考拉兹特征值z,当校验值check为偶数时,可以通过C2(z)来计算考拉兹特征值z,因此最终的考拉兹特征值z是通过复合函数C1(C2(C1(C2(C2(C2(C2(z)))))))得到。
在运行受保护脚本的过程中,将考拉兹特征值和流程混淆节点的第一节点标识值该两个元素输入至神经网络,神经网络输出第二节点标识值。需要说明的是,在实际应用中,可以通过对上述的神经网络进行训练,使得该神经网络根据所输入的任意一个流程节点的节点标识值与其考拉兹特征值,正确地输出可以用于确定待跳转流程节点的节点标识值。例如,当前的流程节点的节点标识值为10068,输出的考拉兹特征值为50,而待跳转的流程节点的节点标识值为20068,将,10068和50输入至神经网络,神经网络应当输出20068该节点标识值。
所嵌入的神经网络输出第二节点标识值之后,可以将该第二节点标识值与脚本中各个候选流程节点的第三节点标识值进行比较,并将节点标识值匹配的候选流程节点作为上述的待跳转流程节点。当各个候选流程节点的第三节点标识值与第二节点标识值均不匹配,表明脚本中不存在第三节点标识值与第二节点标识值匹配的候选流程节点,说明脚本的代码内容被非法篡改。因此,可以调用防篡改响应组件,以对脚本进行自毁。
实际应用中,对于JavaScript脚本,可以首先确定脚本中具有的switch-case语法结构的流程控制节点,然后在其default(缺省)分支上部署防篡改响应组件。当脚本的代码内容由于被篡改无法得到正确的考拉兹特征值时,神经网络则会由于输入的考拉兹特征值异常而产生错误的输出,根据神经网络所输出的错误节点标识值,无法跳转至脚本中任何一个流程节点,因此,则会根据预定义的处理流程,跳转至default分支,从而触发防篡改响应组件执行代码自毁功能,避免脚本被非法用户进一步篡改利用。
上述的防篡改组件,根据流程混淆节点的节点标识值及其考拉兹特征值得到待跳转的流程节点的节点标识值、并基于节点标识值的匹配结果验证脚本是否被篡改,通过利用节点标识值对脚本中各个流程节点的代码内容进行交叉验证,增强了脚本的防篡改能力。
而且,由于神经网络具有“黑盒子”的特性,通过目前的软件分析工具无法对该神经网络实际的运算逻辑进行解析,因此,在脚本中引入神经网络的运算逻辑来建立流程节点的节点标识值之间的映射关系,使得非法用户难以解析出节点标识值之间的映射关系,因此也难以在篡改脚本代码后保证脚本的正常运行,由此增强了了脚本的防篡改能力。
在原始脚本的抽象语法树中嵌入防篡改验证组件、防篡改响应组件和神经网络,并且对流程控制节点进行代码混淆得到流程混淆节点,从而得到了经过代码混淆处理的抽象语法树,对经过代码混淆处理的抽象语法树进行反编译,即可得到上述的受保护脚本。
上述脚本保护方法中,通过加入少量的代码对原始代码内容的代码混淆,即可大幅度提升代码结构的复杂度,而无须引入大量的冗余代码内容,从而在提升脚本的代码结构的复杂度的同时,避免了由于加入大量冗余代码内容而大幅度增加脚本加载时间的问题。
在一个实施例中,所述防篡改验证组件包括代码位置占位符,所述流程控制节点的代码内容在所述原始脚本中具有第一起始位置;在所述步骤S204之后,还包括:
根据所述流程混淆节点的代码内容与所述流程控制节点的代码内容之间的差异,确定代码位置偏移量;
根据所述第一起始位置和所述代码位置偏移量,确定所述流程混淆节点在所述原始脚本中的第二起始位置;
在所述防篡改验证组件的代码位置占位符中写入所述第二起始位置;所述防篡改验证组件用于根据所述第二起始位置定位所述流程混淆节点的代码内容。
其中,代码位置占位符可以为用于写入代表流程节点起始和结束的代码内容的符号。
其中,起始位置可以用于表示节点的代码内容在脚本中的开始至结束的位置。
需要说明的是,对流程控制节点进行代码混淆之后,由于嵌入了新的代码内容,因此会造成流程控制节点的代码长度及其在代码流中的代码位置发生变化。为了保证防篡改验证组件可以准确地对流程控制节点自身的代码内容进行校验,因此需要确定代码混淆之后流程控制节点的代码位置偏移量。
具体实现中,在对原始脚本中的流程控制节点进行代码混淆得到流程混淆节点之后,可以首先确定将要进行代码混淆的流程控制节点的代码内容在原始脚本中的起始位置,将该起始位置作为第一起始位置。
然后,确定该流程控制节点在进行代码混淆之后的代码内容相对于代码混淆之前的代码内容的差异,根据代码内容的差异,确定该流程控制节点进行代码混淆之后的代码位置偏移量。
下一步,根据流程控制节点的第一起始位置和上述的代码位置偏移量,即可以推算得到流程混淆节点在当前的脚本中所处的位置为第二起始位置。将该第二起始位置写入至防篡改验证组件中预留的代码位置占位符。由此,防篡改验证组件在运行时则可以根据该第二起始位置准确地定位流程混淆节点的代码内容,并针对所定位的代码内容进行校验。
实际应用中,可能还在脚本中嵌入有防篡改响应组件等其他组件,因此,可以在将所有组件嵌入到脚本之后,再确定上述的代码位置偏移量、并将根据代码位置偏移量所确定的第二起始位置并写入至防篡改验证组件中的代码位置占位符。
上述的脚本保护方法中,通过在防篡改验证组件中预留代码位置占位符,在将流程控制节点进行代码混淆得到流程混淆节点之后,根据流程混淆节点的代码内容的代码偏移量确定第二起始位置,并将该第二起始位置写入至代码位置占位符,从而防篡改验证组件在运行时可以准确地定位流程混淆节点的代码内容并进行校验,避免对错误的代码内容进行校验。
在一个实施例中,还包括:
在所述原始脚本中嵌入反调试组件;所述反调试组件用于在检测到对所述受保护脚本的非法调试活动时执行反调试功能。
其中,反调试组件可以为用于防止对受保护脚本进行非法调试的组件。
具体实现中,在从原始脚本抽取出抽象语法树之后,可以在抽象语法树中嵌入反调试组件。将嵌入有防篡改组件和反调试组件的抽象语法树进行反编译,得到受保护脚本。
对于JavaScript脚本而言,可以利用debugger(一种调试指令)指令的特性来构建反调试组件。Debugger指令在运行环境为调试模式时才会生效,并自动地中断代码运行、并转向调试函数,因此,可以在JavaScript脚本中的一个或多个流程节点中,嵌入基于debugger指令构建的反调试组件。
例如,在JavaScript脚本的某个流程节点中嵌入self.setInterval("debugger",50)指令,当运行该流程节点时,会检测到当前的运行环境为调试模式,因此可以确定当前存在有非法调试活动,并触发执行反调试功能。
实际应用中,可以通过多种方式触发反调试功能,例如,对于上述的在流程节点中嵌入self.setInterval("debugger",50)指令的脚本,当检测到处于调试模式时,由于缺少与self.setInterval("debugger",50)指令对应的clearInterval指令,则会导致脚本卡死而无法继续运行脚本,从而保护了脚本。
上述的脚本保护方法中,通过在脚本中嵌入反调试组件,使得受保护脚本在检测到对非法调试活动时执行反调试功能,使得脚本具有反调试功能,从而更有效地更全面地保护了脚本。
在一个实施例中,在所述根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点之后,还包括:
随机生成混淆标识符和/或混淆数值类型;
将所述流程混淆节点的代码内容中预设的原始标识符替换为所述混淆标识符,和/或,将所述流程混淆节点的代码内容中预设的原始数值类型替换为所述混淆数值类型。
其中,标识符可以为某个数据内容的类型的标识。例如,在JavaScript的标识符可以包括有变量名、函数名、属性名等的标识符。
其中,混淆标识符可以为用于进行代码混淆的标识符。
其中,数值类型可以为脚本中所出现的数值的类型。例如,在JavaScript的数值类型可以具体包含有字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)等。
其中,混淆数值类型可以为用于进行代码混淆的数值类型。
具体实现中,可以在将受保护脚本下发至多个终端120之前,对脚本进行词法混淆。具体地,可以首先随机生成标识符和/或数值类型,作为上述的混淆标识符和/或混淆数值类型,并将混淆标识符和/或混淆数值类型替换掉流程混淆节点中预设的原始标识符和/或原始数值类型,在替换之后再将受保护脚本下发至终端120。
上述的脚本保护方法中,通过随机生成混淆标识符和/或混淆数值类型,并将流程混淆节点的代码内容中预设的原始标识符替换为混淆标识符,和/或,将流程混淆节点的代码内容中预设的原始数值类型替换为混淆数值类型,使得受保护脚本中的标识符和数值类型实现变换的随机性,增加了脚本代码的阅读难度。
如图3所示,在一个实施例中,提供了一种脚本保护方法。本实施例主要以该方法应用于上述图1中的终端120来举例说明。参照图2,该脚本保护方法具体包括如下步骤:
S302,获取受保护脚本;所述受保护脚本包括流程混淆节点;所述流程混淆节点记录有执行条件;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述执行条件时执行流程跳转。
具体实现中,终端120可以接收到服务器110下发的受保护脚本。受保护脚本中可以包含有流程混淆节点,该流程混淆节点可以通过对原始脚本中的流程控制节点进行代码混淆后得到。受保护脚本在运行过程中会产生变量并输入至流程混淆节点,流程混淆节点可以判断该输入的变量是否符合执行条件,当符合时则可以执行流程跳转,从而实现流程控制的功能。
S304,在执行所述流程混淆节点的代码内容时,对所述流程混淆节点的代码内容进行校验,得到校验值。
具体实现中,终端120运行受保护脚本后,将会执行受保护脚本中各个流程节点的代码内容。当执行流程混淆节点的代码内容时,可以调用受保护脚本中所嵌入的防篡改验证组件,对流程混淆节点的代码内容进行校验,得到校验值。
S306,对所述校验值进行考拉兹运算,得到考拉兹序列,并根据所述考拉兹序列更新所述执行条件。
具体实现中,终端120中的流程混淆节点中包含有考拉兹函数,通过该考拉兹函数对校验值进行反复多次的考拉兹运算,将每次考拉兹运算后输出的数值组成考拉兹序列。终端120可以根据每次考拉兹运算后输出的数值更新执行条件。
由于对校验值进行考拉兹运算的具体过程在前述实施例中已有详细说明,在此不再赘述。
S308,当所述流程混淆节点的输入变量符合更新后的所述执行条件、且根据所述考拉兹序列得到待跳转流程节点时,从所述流程混淆节点跳转至所述待跳转流程节点,并执行所述待跳转流程节点的代码内容。
具体实现中,终端120可以反复地根据考拉兹序列更新执行条件,当流程混淆节点的输入变量符合更新后的执行条件时,根据考拉兹序列确定待跳转流程节点。
由于根据考拉兹序列确定待跳转流程节点的具体过程在前述实施例中已有详细说明,在此不再赘述。
当根据考拉兹序列确定待跳转流程节点之后,则可以从当前的流程混淆节点跳转至待跳转流程节点,并执行待跳转流程节点的代码内容。
S310,当所述流程混淆节点的输入变量符合更新后的所述执行条件、且无法根据所述考拉兹序列得到待跳转流程节点时,执行脚本自我保护流程。
具体实现中,当无法根据考拉兹序列确定待跳转流程节点,则可以判定受保护脚本中的代码内容被篡改,终端110可以根据脚本中所嵌入的防篡改响应组件执行脚本自我保护流程。
上述的脚本保护方法中,通过对受保护脚本中的流程混淆节点的代码内容进行校验,并对校验得到的校验值进行考拉兹运算,利用考拉兹运算得到的考拉兹序列更新执行条件,在流程混淆节点的输入变量符合更新后的执行条件、且根据考拉兹序列得到待跳转流程节点时,从流程混淆节点跳转至待跳转流程节点并执行待跳转流程节点的代码内容,以完成流程跳转,当无法根据考拉兹序列得到待跳转流程节点时执行脚本自我保护流程,从而,在保证脚本的控制逻辑不发生变化的前提下,利用考拉兹运算、根据考拉兹序列更新执行条件等复杂的控制逻辑对脚本进行代码混淆,使得受保护脚本具备防篡改功能的同时,提升了代码结构的复杂度,增加了阅读代码的难度,提升了脚本的防篡改能力,使得脚本得到有效的保护。
而且,由于受保护脚本在执行时流程混淆节点会进行考拉兹运算,而考拉兹运算需要进行大量的循环运算,使得代码分析工具在对受保护脚本进行逆向解析时,由于大量的循环运算会引发路径爆炸,造成内存的计算资源快速消耗而无法继续分析,从而提升了脚本的抗分析能力。因此,通过上述的脚本保护方法对脚本进行代码混淆,在保证脚本中各个流程控制节点的控制逻辑不发生变化的同时,提升了脚本的防篡改能力和抗分析能力,更有效地对脚本进行保护。
在一个实施例中,所述受保护脚本包括有防篡改验证组件、防篡改响应组件和神经网络;所述防篡改验证组件被调用时,用于对所述流程混淆节点的代码内容进行校验,得到所述校验值;所述流程混淆节点具有第一节点标识值,所述流程混淆节点的代码内容在执行时,用于根据所述考拉兹序列输出考拉兹特征值;所述神经网络被调用时,用于输入所述流程混淆节点的第一节点标识值和所述考拉兹特征值,并输出第二节点标识值;所述受保护脚本还包括有多个候选流程节点;所述候选流程节点具有第三节点标识值;所述受保护脚本用于将所述第三节点标识值与所述第二节点标识值匹配的候选流程节点作为所述待跳转流程节点;所述受保护脚本还用于当不存在所述第三节点标识值与所述第二节点标识值匹配的候选流程节点时,调用所述防篡改响应组件;所述防篡改响应组件被调用时执行代码自毁功能。
上述脚本保护方法中,通过加入少量的代码对原始代码内容的代码混淆,即可大幅度提升代码结构的复杂度,而无须引入大量的冗余代码内容,从而在提升脚本的代码结构的复杂度的同时,避免了由于加入大量冗余代码内容而大幅度增加脚本加载时间的问题。
在一个实施例中,所述受保护脚本还包括反调试组件;所述反调试组件被调用时,检测是否存在对受保护脚本的非法调试活动时,当检测到对受保护脚本的非法调试活动时执行反调试功能。
为了便于本领域技术人员深入理解本申请的脚本保护方法,以下将结合具体的示例进行说明。
图4为一个实施例的一种对脚本进行保护处理的流程示意图。如图所示,首先可以从原始脚本中抽取出抽象语法树,在抽象语法树中嵌入防篡改组件和反调试组件。其中,防篡改组件可以具体包括防篡改验证组件和防篡改响应组件。防篡改组件和反调试组件的作用在前述实施例中已有详细说明,在此不再赘述。然后,确定抽象语法树中的流程控制节点,并对流程控制节点进行基于考拉兹运算的代码混淆,得到流程混淆节点。下一步,可以对抽象语法树中的多个流程节点进行标识符和数值类型的混淆。最后,将用于代码混淆的神经网络嵌入。将经过上述的处理的抽象语法树进行反编译,得到了受保护脚本。
图5为一个实施例的一种受保护的脚本运行时的流程示意图。如图所示,对原始脚本进行本申请的脚本保护处理之后,得到了受保护脚本,受保护脚本在运行时,可能会出现不同的多种运行流程,该多种运行流程主要包括流程A、流程B、流程C和流程D。其中,如果当前运行的流程节点中嵌入有反调试组件,则会进入流程A,反调试组件会检测当前的运行模式是否为调试模式,如否则会调用受保护脚本中的防篡改验证组件对流程节点的代码内容进行校验,计算出校验值,并基于校验值进行考拉兹运算,得到考拉兹序列,对考拉兹序列进行复合函数运算,得到考拉兹特征值,将流程节点的节点标识值和考拉兹特征值输入至神经网络,以确定待跳转流程节点的节点标识值。如没有反调试组件,则会进入流程B至D中的一种。在流程B中,则会调用受保护脚本中的防篡改验证组件对流程节点的代码内容进行校验,计算出校验值,并基于该校验值进行考拉兹运算,并根据考拉兹运算的结果更新校验值,基于更新的校验值再次进行考拉兹运算,如此循环直至确定执行流程跳转。在流程C中,与流程B的主要区别在于当跳转至嵌入有反调试组件的流程节点时则无须执行对运行模式的检测。
以下示出了一个实施例的一种JavaScript脚本中的流程控制节点的代码示例:
if(x==A)
do_sth();
上述代码内容表示,在该流程控制节点中,当输入变量为A时,则执行流程跳转。通过本申请的脚本保护方法对上述的流程控制节点进行代码混淆,得到了流程混淆节点,以下示出了一种受保护的JavaScript脚本中流程混淆节点的代码示例:
Figure BDA0002442554820000281
在执行上述的流程混淆节点的代码内容时,可以首先调用受保护的JavaScript脚本中嵌入的防篡改验证组件,计算出流程混淆节点的代码内容的校验值check,然后,当check大于1时,则会进一步判断check被2整除后的余数是否为1,如是,则代表该校验值check为奇数,对该校验值check进行乘以3后再加1的计算,将计算得到的数值对校验值check进行赋值;如否,代表该校验值check为偶数,对该校验值check进行除以2的计算,将计算得到的数值对校验值check进行赋值;在将进行考拉兹运算得到的数值对校验值check赋值之后,根据新的校验值check更新执行条件“x+check<A1&&x-check<A2”。
由于对于任意正整数进行反复多次的考拉兹运算后,必然会得到正整数为1的数值,因此,执行条件最终被更新为“A-1<x<A+1”,当输入变量x为A时,则符合更新的执行条件,触发执行流程跳转。
此外,执行上述的代码内容时,还可以将对校验值check进行考拉兹运算后得到的数值进行C1(z)和C2(z)的复合函数运算,得到了考拉兹特征值z。
例如,如初始的校验值check为奇数时,计算C1(z)=check*11,当对初始的校验值check进行考拉兹运算,得到新的校验值check为偶数,则计算C2(z)=C1(z)+3,如此类推,通过对考拉兹运算得到的考拉兹序列进行上述的复合函数,得到了考拉兹特征值z。
在执行流程跳转时,可以将流程混淆节点的节点标识值case与上述的考拉兹特征值z输入至神经网络,神经网络输出节点标识值case`,将节点标识值case`与受保护脚本中各个流程节点的节点标识值case进行匹配,如果存在匹配的流程节点,则跳转至该流程节点,当遍历受保护脚本中的流程节点均查找不到节点标识值case匹配的流程节点,表明脚本的代码被篡改,此时则会跳转至流程混淆节点的default流程节点,该default流程节点上部署有防篡改响应组件,跳转至流程混淆节点的default流程节点则会触发执行防篡改响应组件,对脚本进行代码自毁,从而实现了对脚本的保护。
应该理解的是,虽然图2至图5的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2至图5中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图6所示,提供了一种脚本保护装置600,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置具体包括:
脚本获取模块602,用于获取原始脚本,并确定所述原始脚本中的流程控制节点;所述流程控制节点记录有第一执行条件;所述流程控制节点用于在所述流程控制节点的输入变量符合所述第一执行条件时执行流程跳转;
代码混淆模块604,用于根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点;所述流程混淆节点用于对根据所述流程混淆节点的代码内容进行校验所得到的校验值进行考拉兹运算,并输出考拉兹序列;所述流程混淆节点记录有第二执行条件;所述流程混淆节点还用于根据所述考拉兹序列更新所述第二执行条件,直至所述第二执行条件与所述第一执行条件等价;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述第二执行条件时执行流程跳转;
脚本生成模块606,用于生成受保护脚本;所述受保护脚本包括所述流程混淆节点;所述受保护脚本用于根据所述流程混淆节点输出的考拉兹序列确定待跳转流程节点,并从所述流程混淆节点跳转至所述待跳转流程节点;所述受保护脚本还用于当无法根据所述考拉兹序列确定所述待跳转流程节点时执行脚本自我保护流程。
上述的脚本保护装置中,通过确定原始脚本的流程控制节点,并根据流程控制节点中的第一执行条件对流程控制节点进行代码混淆,得到记录有第二执行条件的流程混淆节点,并最终得到包含有流程混淆节点的受保护脚本,受保护脚本的流程混淆节点在执行时,可以对流程混淆节点的代码内容进行校验,并将所得到的校验值进行考拉兹运算,得到考拉兹序列,然后利用该考拉兹序列更新第二执行条件,以使得第二执行条件等价于第一执行条件,此外,还利用考拉兹序列确定待跳转流程节点,以在需要执行流程跳转时,从当前的流程混淆节点跳转至待跳转流程节点,当流程混淆节点的代码内容被篡改,则会由于无法根据考拉兹序列确定待跳转流程节点而触发脚本自我保护流程,从而,在保证脚本中各个流程控制节点的控制逻辑不发生变化的前提下,利用考拉兹运算、根据考拉兹序列更新执行条件等复杂的控制逻辑对脚本进行代码混淆,使得受保护脚本具备防篡改功能的同时,提升了代码结构的复杂度,增加了阅读代码的难度,提升了脚本的防篡改能力,使得脚本得到有效的保护。
在一个实施例中,所述流程控制节点包括节点原始代码,所述节点原始代码包括所述第一执行条件;所述代码混淆模块604,具体用于:
确定所述第一执行条件的条件参数,以及,获取流程混淆代码模板;所述流程混淆代码模板包括初始执行条件;在所述流程混淆代码模板中,将所述初始执行条件的条件参数修改为所述第一执行条件的条件参数,得到流程混淆代码;将所述流程控制节点的节点原始代码替换为所述流程混淆代码,得到所述流程混淆节点。
上述脚本保护装置中,通过将流程控制节点的节点原始代码替换为流程混淆代码以得到流程混淆节点,由于受保护脚本在执行时流程混淆节点会进行考拉兹运算,而考拉兹运算需要进行大量的循环运算,使得代码分析工具在对受保护脚本进行逆向解析时,由于大量的循环运算会引发路径爆炸,造成内存的计算资源快速消耗而无法继续分析,从而提升了脚本的抗分析能力。因此,通过上述的脚本保护方法对脚本进行代码混淆,在保证脚本中各个流程控制节点的控制逻辑不发生变化的同时,提升了脚本的防篡改能力和抗分析能力,更有效地对脚本进行保护。
在一个实施例中,所述装置还包括:
验证组件嵌入模块,用于在所述原始脚本中嵌入防篡改验证组件;所述防篡改验证组件用于对所述流程控制节点的代码内容进行校验,得到所述校验值;
网络嵌入模块,用于在所述原始脚本中嵌入神经网络;所述流程混淆节点具有第一节点标识值,所述流程混淆节点用于根据所述考拉兹序列输出考拉兹特征值;所述神经网络用于输入所述流程混淆节点的第一节点标识值和所述考拉兹特征值,并输出第二节点标识值;
响应组件嵌入模块,用于在所述原始脚本中嵌入防篡改响应组件;所述原始脚本包括有多个候选流程节点;所述候选流程节点具有第三节点标识值;所述原始脚本用于将所述第三节点标识值与所述第二节点标识值匹配的候选流程节点作为所述待跳转流程节点;所述原始脚本还用于当不存在所述第三节点标识值与所述第二节点标识值匹配的候选流程节点时,调用所述防篡改响应组件;所述防篡改响应组件在被调用时执行代码自毁功能;
所述脚本生成模块606,具体用于:根据嵌入有所述防篡改验证组件、所述神经网络和所述防篡改响应组件的原始脚本,得到所述受保护脚本。
上述脚本保护装置中,通过加入少量的代码对原始代码内容的代码混淆,即可大幅度提升代码结构的复杂度,而无须引入大量的冗余代码内容,从而在提升脚本的代码结构的复杂度的同时,避免了由于加入大量冗余代码内容而大幅度增加脚本加载时间的问题。
在一个实施例中,所述防篡改验证组件包括代码位置占位符,所述流程控制节点的代码内容在所述原始脚本中具有第一起始位置;所述装置还具体用于:
根据所述流程混淆节点的代码内容与所述流程控制节点的代码内容之间的差异,确定代码位置偏移量;根据所述第一起始位置和所述代码位置偏移量,确定所述流程混淆节点在所述原始脚本中的第二起始位置;在所述防篡改验证组件的代码位置占位符中写入所述第二起始位置;所述防篡改验证组件用于根据所述第二起始位置定位所述流程混淆节点的代码内容。
在一个实施例中,所述装置还包括:
反调试组件嵌入模块,用于在所述原始脚本中嵌入反调试组件;所述反调试组件用于在检测到对所述受保护脚本的非法调试活动时执行反调试功能。
在一个实施例中,所述装置还包括:
随机生成模块,用于随机生成混淆标识符和/或混淆数值类型;
替换模块,用于将所述流程混淆节点的代码内容中预设的原始标识符替换为所述混淆标识符,和/或,将所述流程混淆节点的代码内容中预设的原始数值类型替换为所述混淆数值类型。
在一个实施例中,所述脚本获取模块602,具体用于:
从所述原始脚本中抽取出抽象语法树;所述抽象语法树包括流程节点;判断所述流程节点是否包含有流程控制语句;若是,则将包含有所述流程控制语句的流程节点作为所述流程控制节点。
在一个实施例中,如图7所示,提供了一种脚本保护装置700,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置具体包括:
脚本获取模块702,用于获取受保护脚本;所述受保护脚本包括流程混淆节点;所述流程混淆节点记录有执行条件;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述执行条件时执行流程跳转;
校验模块704,用于在执行所述流程混淆节点的代码内容时,对所述流程混淆节点的代码内容进行校验,得到校验值;
考拉兹运算模块706,用于对所述校验值进行考拉兹运算,得到考拉兹序列,并根据所述考拉兹序列更新所述执行条件;
跳转模块708,用于当所述流程混淆节点的输入变量符合更新后的所述执行条件、且根据所述考拉兹序列得到待跳转流程节点时,从所述流程混淆节点跳转至所述待跳转流程节点,并执行所述待跳转流程节点的代码内容;
保护模块710,用于当所述流程混淆节点的输入变量符合更新后的所述执行条件、且无法根据所述考拉兹序列得到待跳转流程节点时,执行脚本自我保护流程。
关于脚本保护装置的具体限定可以参见上文中对于脚本保护方法的限定,在此不再赘述。上述脚本保护装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图8所示。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种脚本保护方法。
本领域技术人员可以理解,图8中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(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)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

Claims (12)

1.一种脚本保护方法,其特征在于,包括:
获取原始脚本,并确定所述原始脚本中的流程控制节点;所述流程控制节点记录有第一执行条件;所述流程控制节点用于在所述流程控制节点的输入变量符合所述第一执行条件时执行流程跳转;
根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点;所述流程混淆节点用于对根据所述流程混淆节点的代码内容进行校验所得到的校验值进行考拉兹运算,并输出考拉兹序列;所述流程混淆节点记录有第二执行条件;所述流程混淆节点还用于根据所述考拉兹序列更新所述第二执行条件,直至所述第二执行条件与所述第一执行条件等价;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述第二执行条件时执行流程跳转;
生成受保护脚本;所述受保护脚本包括所述流程混淆节点;所述受保护脚本用于根据所述流程混淆节点输出的考拉兹序列确定待跳转流程节点,并从所述流程混淆节点跳转至所述待跳转流程节点;所述受保护脚本还用于当无法根据所述考拉兹序列确定所述待跳转流程节点时执行脚本自我保护流程。
2.根据权利要求1所述的方法,其特征在于,所述流程控制节点包括节点原始代码,所述节点原始代码包括所述第一执行条件;所述根据所述第一执行条件,对所述流程控制节点进行代码混淆,得到流程混淆节点,包括:
确定所述第一执行条件的条件参数,以及,获取流程混淆代码模板;所述流程混淆代码模板包括初始执行条件;
在所述流程混淆代码模板中,将所述初始执行条件的条件参数修改为所述第一执行条件的条件参数,得到流程混淆代码;
将所述流程控制节点的节点原始代码替换为所述流程混淆代码,得到所述流程混淆节点。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述原始脚本中嵌入防篡改验证组件;所述防篡改验证组件用于对所述流程控制节点的代码内容进行校验,得到所述校验值;
在所述原始脚本中嵌入神经网络;所述流程混淆节点具有第一节点标识值,所述流程混淆节点用于根据所述考拉兹序列输出考拉兹特征值;所述神经网络用于输入所述流程混淆节点的第一节点标识值和所述考拉兹特征值,并输出第二节点标识值;
在所述原始脚本中嵌入防篡改响应组件;所述原始脚本包括有多个候选流程节点;所述候选流程节点具有第三节点标识值;所述原始脚本用于将所述第三节点标识值与所述第二节点标识值匹配的候选流程节点作为所述待跳转流程节点;所述原始脚本还用于当不存在所述第三节点标识值与所述第二节点标识值匹配的候选流程节点时,调用所述防篡改响应组件;所述防篡改响应组件在被调用时执行代码自毁功能;
所述生成受保护脚本,包括:
根据嵌入有所述防篡改验证组件、所述神经网络和所述防篡改响应组件的原始脚本,得到所述受保护脚本。
4.根据权利要求3所述的方法,其特征在于,所述防篡改验证组件包括代码位置占位符,所述流程控制节点的代码内容在所述原始脚本中具有第一起始位置;在所述根据所述第一执行条件,对所述流程控制节点进行代码混淆,得到流程混淆节点之后,还包括:
根据所述流程混淆节点的代码内容与所述流程控制节点的代码内容之间的差异,确定代码位置偏移量;
根据所述第一起始位置和所述代码位置偏移量,确定所述流程混淆节点在所述原始脚本中的第二起始位置;
在所述防篡改验证组件的代码位置占位符中写入所述第二起始位置;所述防篡改验证组件用于根据所述第二起始位置定位所述流程混淆节点的代码内容。
5.根据权利要求1所述的方法,其特征在于,还包括:
在所述原始脚本中嵌入反调试组件;所述反调试组件用于在检测到对所述受保护脚本的非法调试活动时执行反调试功能。
6.根据权利要求1所述的方法,其特征在于,在所述根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点之后,还包括:
随机生成混淆标识符和/或混淆数值类型;
将所述流程混淆节点的代码内容中预设的原始标识符替换为所述混淆标识符,和/或,将所述流程混淆节点的代码内容中预设的原始数值类型替换为所述混淆数值类型。
7.根据权利要求1所述的方法,其特征在于,所述确定所述原始脚本中的流程控制节点,包括:
从所述原始脚本中抽取出抽象语法树;所述抽象语法树包括流程节点;
判断所述流程节点是否包含有流程控制语句;
若是,则将包含有所述流程控制语句的流程节点作为所述流程控制节点。
8.一种脚本保护方法,其特征在于,包括:
获取受保护脚本;所述受保护脚本包括流程混淆节点;所述流程混淆节点记录有执行条件;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述执行条件时执行流程跳转;
在执行所述流程混淆节点的代码内容时,对所述流程混淆节点的代码内容进行校验,得到校验值;
对所述校验值进行考拉兹运算,得到考拉兹序列,并根据所述考拉兹序列更新所述执行条件;
当所述流程混淆节点的输入变量符合更新后的所述执行条件、且根据所述考拉兹序列得到待跳转流程节点时,从所述流程混淆节点跳转至所述待跳转流程节点,并执行所述待跳转流程节点的代码内容;
当所述流程混淆节点的输入变量符合更新后的所述执行条件、且无法根据所述考拉兹序列得到待跳转流程节点时,执行脚本自我保护流程。
9.一种脚本保护装置,其特征在于,包括:
脚本获取模块,用于获取原始脚本,并确定所述原始脚本中的流程控制节点;所述流程控制节点记录有第一执行条件;所述流程控制节点用于在所述流程控制节点的输入变量符合所述第一执行条件时执行流程跳转;
代码混淆模块,用于根据所述第一执行条件,对所述原始脚本中的流程控制节点进行代码混淆,得到流程混淆节点;所述流程混淆节点用于对根据所述流程混淆节点的代码内容进行校验所得到的校验值进行考拉兹运算,并输出考拉兹序列;所述流程混淆节点记录有第二执行条件;所述流程混淆节点还用于根据所述考拉兹序列更新所述第二执行条件,直至所述第二执行条件与所述第一执行条件等价;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述第二执行条件时执行流程跳转;
脚本生成模块,用于生成受保护脚本;所述受保护脚本包括所述流程混淆节点;所述受保护脚本用于根据所述流程混淆节点输出的考拉兹序列确定待跳转流程节点,并从所述流程混淆节点跳转至所述待跳转流程节点;所述受保护脚本还用于当无法根据所述考拉兹序列确定所述待跳转流程节点时执行脚本自我保护流程。
10.一种脚本保护装置,其特征在于,包括:
脚本获取模块,用于获取受保护脚本;所述受保护脚本包括流程混淆节点;所述流程混淆节点记录有执行条件;所述流程混淆节点用于在所述流程混淆节点的输入变量符合所述执行条件时执行流程跳转;
校验模块,用于在执行所述流程混淆节点的代码内容时,对所述流程混淆节点的代码内容进行校验,得到校验值;
考拉兹运算模块,用于对所述校验值进行考拉兹运算,得到考拉兹序列,并根据所述考拉兹序列更新所述执行条件;
跳转模块,用于当所述流程混淆节点的输入变量符合更新后的所述执行条件、且根据所述考拉兹序列得到待跳转流程节点时,从所述流程混淆节点跳转至所述待跳转流程节点,并执行所述待跳转流程节点的代码内容;
保护模块,用于当所述流程混淆节点的输入变量符合更新后的所述执行条件、且无法根据所述考拉兹序列得到待跳转流程节点时,执行脚本自我保护流程。
11.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至8中任一项所述方法的步骤。
12.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至8中任一项所述的方法的步骤。
CN202010269363.0A 2020-04-08 2020-04-08 脚本保护方法、装置、计算机可读存储介质和计算机设备 Active CN111488558B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010269363.0A CN111488558B (zh) 2020-04-08 2020-04-08 脚本保护方法、装置、计算机可读存储介质和计算机设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010269363.0A CN111488558B (zh) 2020-04-08 2020-04-08 脚本保护方法、装置、计算机可读存储介质和计算机设备

Publications (2)

Publication Number Publication Date
CN111488558A true CN111488558A (zh) 2020-08-04
CN111488558B CN111488558B (zh) 2022-07-22

Family

ID=71812588

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010269363.0A Active CN111488558B (zh) 2020-04-08 2020-04-08 脚本保护方法、装置、计算机可读存储介质和计算机设备

Country Status (1)

Country Link
CN (1) CN111488558B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113076550A (zh) * 2021-04-16 2021-07-06 顶象科技有限公司 脚本文本的更新方法、脚本文本的加密方法及装置

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103778355A (zh) * 2014-01-15 2014-05-07 西北大学 一种基于代码变形的二进制代码混淆方法
US20190132355A1 (en) * 2017-10-31 2019-05-02 Bluvector, Inc. Malicious script detection
CN109933962A (zh) * 2019-03-14 2019-06-25 西安电子科技大学 基于考拉兹猜想的软件水印方法
CN110196718A (zh) * 2018-05-10 2019-09-03 腾讯科技(深圳)有限公司 脚本混淆方法
CN110619220A (zh) * 2019-08-09 2019-12-27 北京小米移动软件有限公司 对神经网络模型加密的方法及装置、存储介质

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103778355A (zh) * 2014-01-15 2014-05-07 西北大学 一种基于代码变形的二进制代码混淆方法
US20190132355A1 (en) * 2017-10-31 2019-05-02 Bluvector, Inc. Malicious script detection
CN110196718A (zh) * 2018-05-10 2019-09-03 腾讯科技(深圳)有限公司 脚本混淆方法
CN109933962A (zh) * 2019-03-14 2019-06-25 西安电子科技大学 基于考拉兹猜想的软件水印方法
CN110619220A (zh) * 2019-08-09 2019-12-27 北京小米移动软件有限公司 对神经网络模型加密的方法及装置、存储介质

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
ZHI WANG.ET AL: "Linear obfuscation to combat symbolic execution", 《COMPUTER SECURITY-ESORICS 2011》 *
陈喆 等: "基于代码移动的二进制程序控制流混淆方法", 《计算机研究与发展》 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113076550A (zh) * 2021-04-16 2021-07-06 顶象科技有限公司 脚本文本的更新方法、脚本文本的加密方法及装置

Also Published As

Publication number Publication date
CN111488558B (zh) 2022-07-22

Similar Documents

Publication Publication Date Title
JP7164017B2 (ja) フォールトツリー分析を使用して機能安全のため制御フローグラフを最適化するシステム及び方法
US8407800B2 (en) Method for software vulnerability flow analysis, generation of vulnerability-covering code, and multi-generation of functionally-equivalent code
US20200125475A1 (en) Systems and methods for dynamically identifying data arguments and instrumenting source code
JP7154365B2 (ja) ソフトウェアコードをセキュアにするための方法
CN106203006A (zh) 基于dex与so文件动态执行的Android应用加固方法
US20080271001A1 (en) Method of generating program, information processing device and microcomputer
US9721120B2 (en) Preventing unauthorized calls to a protected function
Sridhar et al. Model-checking in-lined reference monitors
CN111723345B (zh) 基于回调函数的控制流混淆方法及系统
CN103559125B (zh) 一种利用图同构验证编译器的方法
US20200380150A1 (en) Method of encoding and decoding memory data for software security, recording medium and apparatus for performing the method
US11269988B2 (en) Automated software application verification system
US9129137B2 (en) Method, computer program and device for providing security for intermediate programming code for its execution by a virtual machine
CN101872393A (zh) 一种Java程序防篡改响应方案
CN113366474A (zh) 用于通过将计算机程序的控制流表示为数据来混淆计算机程序的系统、方法和存储介质
CN106933642B (zh) 应用程序的处理方法及处理装置
US9047448B2 (en) Branch auditing in a computer program
CN111488558B (zh) 脚本保护方法、装置、计算机可读存储介质和计算机设备
Habib et al. Is this class thread-safe? inferring documentation using graph-based learning
Letychevskyi Two-level algebraic method for detection of vulnerabilities in binary code
US11256786B2 (en) Method to secure a software code
CN116361806A (zh) 基于多示例和注意力机制的智能合约分析方法及装置
Durães et al. A methodology for the automated identification of buffer overflow vulnerabilities in executable software without source-code
CN108549585B (zh) 修改应用数据的方法、应用测试方法和装置
Gicquel et al. SAMVA: Static Analysis for Multi-fault Attack Paths Determination

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant