CN109992935B - 一种源代码保护方法及装置 - Google Patents

一种源代码保护方法及装置 Download PDF

Info

Publication number
CN109992935B
CN109992935B CN201910200131.7A CN201910200131A CN109992935B CN 109992935 B CN109992935 B CN 109992935B CN 201910200131 A CN201910200131 A CN 201910200131A CN 109992935 B CN109992935 B CN 109992935B
Authority
CN
China
Prior art keywords
variable
syntax tree
code
source code
protected
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.)
Active
Application number
CN201910200131.7A
Other languages
English (en)
Other versions
CN109992935A (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.)
TONGDUN TECHNOLOGY Co.,Ltd.
Original Assignee
Tongdun Holdings 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 Tongdun Holdings Co Ltd filed Critical Tongdun Holdings Co Ltd
Priority to CN201910200131.7A priority Critical patent/CN109992935B/zh
Publication of CN109992935A publication Critical patent/CN109992935A/zh
Application granted granted Critical
Publication of CN109992935B publication Critical patent/CN109992935B/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/60Protecting data
    • G06F21/602Providing cryptographic facilities or services
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding

Landscapes

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

Abstract

本发明提供了一种源代码保护方法,属于计算机技术领域。所述方法可以包括:获取待保护的源代码,并将所述源代码转化为语法树;遍历所述语法树,对所述语法树中的待保护单元进行保护处理;其中,所述待保护单元包括常量、变量、代码块中的至少一种;将保护处理后的所述语法树转化为目标代码。本发明实施例提供有力的源代码保护方案的同时,通用适配MINA JS引擎的底层结构,从而使得本发明实施例的方案能够应用于微信小程序代码的深度保护。

Description

一种源代码保护方法及装置
技术领域
本发明属于网络技术领域,特别是涉及一种源代码保护方法及一种源代码保护装置。
背景技术
微信小程序平台目前已经拥有超过100万个小程序、150万开发者和5000多个第三方平台,用户日活过亿。微信小程序使用MINA JS(Multipurpose Infrastructure forNetwork Applications,MINA)引擎开发,这是一个腾讯自主研发的Javascript引擎。由于Javascript程序可以在浏览器中直接获取源代码,因此基于微信小程序的源代码也是有多种方式可以直接从客户端得到源代码,安全性较低。目前整个行业都缺乏有效的保护手段,小程序业务逻辑被破解、小程序代码被抄袭盗版等风险广泛困扰着开发者。
针对常规浏览器环境下的Javascript代码的混淆保护方案,通常是对发布的程序进行重新组织处理,使处理后的代码与处理之前的代码完成相同的功能但难以阅读,处理方法如下:
1)进行压缩,即将多行代码转成一行代码,降低代码的可读性:该方法从表面来看是降低了代码的可读性,但目前有太多的代码格式化工具可以补全被删除的空格,换行及符号等,例如JSbeautifier(JavaScript Beautifier,JS代码美化工具),并未对可读性造成特别的影响,保护力度弱;
2)删除注释:该方法删除掉代码的注释对源代码本身并无影响,且分析代码逻辑依旧可以获知本段代码的作用及使用情况,对黑产的分析人员来说并不影响可读性;
3)简化变量名:该方法对变量名进行了简化,例如原本的setcookie的函数名被改为a等操作,但是写代码遵循的是固定的规则,因此很容易还原源代码,而且函数名不同并不影响黑产的分析人员读懂源代码的逻辑;
4)分散变量:该方法对变量的定义进行分散,如本为连续执行的变量定义,被分散在不同的代码段进行定义。这种方式对源代码并无影响,可读性依旧很高。
上述保护方法一方面并不能对源代码进行有力的保护,另一方面由于现有的深度保护方法基于常规Javascript引擎设计,因此对于微信小程序也无法通用适配。
发明内容
有鉴于此,本发明提供一种源代码保护方法,以便解决现有代码深度保护方法保护力度弱的问题。
依据本发明的第一方面,提供了一种源代码保护方法,该方法可以包括:
获取待保护的源代码,并将所述源代码转化为语法树。
遍历所述语法树,对所述语法树中的待保护单元进行保护处理;其中,所述待保护单元包括常量、变量、代码块中的至少一种。
将保护处理后的所述语法树转化为目标代码。
依据本发明的第二方面,提供了一种源代码保护装置,该装置可以包括:
语法树转化模块,用于获取待保护的源代码,并将所述源代码转化为语法树。
语法树处理模块,用于遍历所述语法树,对所述语法树中的待保护单元进行保护处理;其中,所述待保护单元包括常量、变量、代码块中的至少一种。
目标代码获取模块,用于将保护处理后的所述语法树转化为目标代码。
针对现有技术,本发明具备如下优点:
本发明实施例提供一种源代码的保护方法,通过将源代码转化为语法树,并对语法树进行分析和加工,包括常量、变量和代码块的分化,之后再根据不同的分化,对所述语法树采取不同的保护处理,确保其得到有效保护,整个过程中都是黑盒处理,在保证不影响源代码执行的前提下,尽可能降低代码可读性,从而降低不法分析人员破解的成功率,同时在处理过程中,语法树的转换、根据分化不同的保护处理、变形输出的新语法树可以通用适配MINAJS引擎的底层结构,从而使得本发明实施例的方案能够应用于微信小程序代码的深度保护。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1是本发明实施例提供的一种源代码保护方法的步骤流程图;
图2是本发明实施例提供的另一种源代码保护方法的步骤流程图;
图3是本发明实施例提供的一种源代码保护装置的结构框图。
具体实施方式
下面将参照附图更详细地描述本发明的示例性实施例。虽然附图中显示了本发明的示例性实施例,然而应当理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本发明,并且能够将本发明的范围完整的传达给本领域的技术人员。
实施例一
图1是本发明实施例提供的一种源代码保护方法的步骤流程图,如图1所示,该方法可以包括:
步骤101,获取待保护的源代码,并将所述源代码转化为语法树。
语法树又名抽象语法树,是源代码语法结构的一种抽象表示,它以树状结构的形式表现编程语言的语法结构,但这里的语法并不会表示出真实语法中出现的每个细节,一般来说,通过语法树可以进行“语法高亮”、“关键字匹配”、“作用域判断”、以及“代码压缩”等等,除解构语法外,还需要提供各种函数去遍历与修改语法树。
本发明实施例中,在进行代码保护前需要获取待保护的源代码,并根据源代码的编写机制将其转化为对应的语法树,例如,对于微信小程序的源代码来说,由于通过MINAJS引擎进行编写,因此,其执行适用于MINA JS引擎的底层结构,通过对MINA JS引擎的解析能够将微信小程序的源代码转化为对应的语法树,以进行后续的修改。
步骤102,遍历所述语法树,对所述语法树中的待保护单元进行保护处理;其中,所述待保护单元包括常量、变量、代码块中的至少一种。
本发明实施例中,语法树遍历遵循编写引擎的底层循环机制,如,微信小程序源代码所对应的语法树遵循MINA JS引擎,从而进行遍历、打标、修改等。
本发明实施例中,由于代码保护过程中的保护处理过程有可能会使代码膨胀过大,这样一来虽然加强了保护力度,但是却影响了代码执行效率,因此出于代码安全与代码执行效率的考虑,本领域技术人员可以设置相应的阈值,当语法树符合阈值时则触发相应的保护措施,如,只处理60%的常量,只插入代码量70%的废代码,只对50%的控制流进行平坦化,以及在常量加密处理时选择的加密方式唯一还是多个等操作,本领域技术人员可根据具体的情况进行其他保护处理阈值的设置,本发明对此不做具体限制。
本发明实施例中,在遍历语法树时,需要对待保护单元中常量、变量、代码块进行分化,并根据不同的待保护单元选择不同的保护处理,即对语法树的修改,同时,对于不同待保护单元的保护处理,如常量的保护处理时,可以选择对所有的常量进行保护处理,也可以在兼顾安全性与便捷性的情况下,仅对一部分常量进行保护处理,具体的,可由本领域技术人员自行设置。
步骤103,将保护处理后的所述语法树转化为目标代码。
本发明实施例中,在对语法树的修改结束后,根据语法树所遵循的引擎机制,将修改后的语法树转化为目标代码,即保护后的源代码输出。这样,目标代码能够在不影响可执行性的情况下使目标代码与源代码相去甚远,达到了对源代码有力的保护。
本发明实施例提供一种源代码的保护方法,通过将源代码转化为语法树,并对语法树进行分析和加工,包括常量、变量和代码块的分化,之后再根据不同的分化,对所述语法树采取不同的保护处理,确保其得到有效保护,整个过程中都是黑盒处理,在保证不影响源代码执行的前提下,尽可能降低代码可读性,从而降低不法分析人员破解的成功率,同时在处理过程中,语法树的转换、根据分化不同的保护处理、变形输出的新语法树可以通用适配MINA JS引擎的底层结构,从而使得本发明实施例的方案能够应用于微信小程序代码的深度保护。
实施例二
图2是本发明实施例提供的另一种源代码保护方法的步骤流程图,如图2所示,该方法可以包括:
步骤201,获取待保护的源代码,并将所述源代码转化为语法树。
本发明实施例中,获取待保护的源代码可以由工作人员自行上传,也可以对平台内已上线的源代码进行获取,本发明对获取源代码的方式不做限定。
步骤202,遍历所述语法树,对所述语法树中的待保护单元进行保护处理;其中,所述待保护单元包括常量、变量、代码块中的至少一种。
本发明实施例中,在对语法树循环遍历的过程中,可以先标记代码的执行逻辑,如对于语法树的变量声明、函数执行等进行标记,当标记函数执行后还可以在函数执行逻辑中进行如常量、变量等进行标记,通过上述操作整理代码执行库,从而对语法树的情况有一个整体的把握,当进行后续修改保护时,可以根据预设阈值选取需要保护处理的代码即处理方式,并根据标记定位待保护的代码在语法树的位置,并对语法树进行相应的修改。
可选地,当所述保护单元为常量时,步骤202可以包括:
步骤2021,遍历所述语法树,以查找所述语法树中的常量。
对于编程语言来说,常量指程序运行时不会被修改的量,常量可以是任何基本数据类型,如整数常量、浮点常量、字符常量等,本发明实施例中,遵循引擎底层循环机制遍历语法树,通过对语法树的语法节点进行分析,查找语法树中的常量,以待后续保护处理。
步骤2022,根据预设编码方式,对所述语法树中的常量进行加密。
本发明实施例中,对于语法树中的常量,可以选择编码加密的方式进行保护处理,如通过对常量进行简单异或或颠倒字符串的形式加密,或者进一步的,可以通过base64、Unicode(统一码)或自写字符串加密解密的方式进行,上述加密方式可以仅使用一种,也可以使用多种进行多重加密作为常量处理的最终方式,根据应用环境的不同本领域技术人员也可以使用其他加密方式,本发明对此不做具体限制。
或,步骤2023,对所述语法树中的常量赋值于至少一个变量名,并且在所述语法树中隐藏所述常量的赋值语句。
本发明实施例中,对于常量的保护处理还可以是赋值变量名,通过遍历语法树,判断常量执行过程中所必需的控制流,再找出控制流中必执行的函数,将至少一个赋值语句放入该函数,从而将常量赋值于至少一个变量名,当代码执行需要该常量时,在之前常量赋值的变量名中随机选取一个,替换该常量,从而达到对常量的赋值与隐藏。常量的隐藏还可以去除同一常量的多次出现,从而达到精简代码的效果。
本发明实施例中,还可以对赋值语句进行隐藏,从而对源代码中的常量进行进一步的保护,上述保护处理方式可以仅使用一种,也可以同时使用,本领域技术人员可自行设定保护处理方式的使用方式,本发明对此不做具体限制。
可选地,当所述保护单元为变量时,步骤202可以包括:
步骤2024,遍历所述语法树,以标记所述语法树中各变量对应的当前作用域以及真实作用域。
在计算机语言中,变量是能储存计算结果或能表示值抽象概念的量,可以通过变量名来访问。通常来说,变量是可变的,在一些语言中,变量可以被明确为是能表示可变状态、具有存储空间的抽象;但另外一些语言可以使用其它概念来指称这种抽象,而不严格地定义“变量”的准确外延。变量一般包括变量名、变量声明等。
本发明实施例中,通过遍历语法树,标记各变量对应的当前作用域及其真实作用域,当前作用域为遍历语法树的过程中,遍历至该变量时所对应的作用域,真实作用域为变量实际的作用域,通常来说,真实作用域包括当前作用域,从而获得一个作用域链,作用域链可以是各自独立的,也可以是互相交集的,通过对所有的作用域链进行整合,可以获得语法树的作用域库,其中包括父作用域以及与之对应的子作用域,本领域技术人员可以通过其他方式对变量进行标记,本发明对此不做限制。
本发明实施例中,作用域库中的父作用域与子作用域仅用于描述作用域范围的大小,即父作用域包括了子作用域的范围,因此,其概念是相对的,同一个作用域对于上一级作用域来说是子作用域,对于下一级作用域来说就是父作用域,作用域库中每一个作用域内包括该作用域所定义的全部变量。对于每一个变量来说,通过遍历语法树的方式可获知其当前作用域,再通过作用域库中作用域链的关联关系,可以追溯至定义该变量的当前作用域最高级的父作用域为该变量的真实作用域。
步骤2025,将所述语法树中每个作用域的非全局变量进行替换,以及在所述语法树中隐藏替换后的变量的变量声明和赋值。
通常来说,代码中的变量可以分为全局变量与局部变量,局部变量又称内部变量,由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用;全局变量又称外部变量,既可以是某对象函数创建,也可以是在本程序任何地方创建,但可以被本程序所有对象或函数引用。在代码保护的过程中,一般只能对局部变量进行修改,而不能修改全局变量,以免出现未知错误。
本发明实施例中,在进行变量保护处理时,需要判断该变量是否为非全局变量,首先判断该变量的当前作用域是否定义该变量,若是则该变量为非全局变量,若否则向当前作用域的上一级父作用域进行查找,直到最外层的父作用域,若有作用域对该变量定义,则该变量也为非全局变量,可以对该变量进行修改,若所有的作用域都没有定义该变量,则判断该变量为全局变量,不可以对该变量进行修改。
本发明实施例中,对于局部变量进行修改时,可以通过语法树根据对应关系生成新的变量名与原先的变量名进行替换,并修改变量声明与赋值语句,也可以通过其他方式生成替换用的新变量名,本发明实施例对此不作具体限制,在完成变量的替换后,还可以对新变量的变量声明与赋值进行隐藏。可选地,步骤2025中在所述语法树中隐藏替换后的变量的变量声明和赋值的步骤包括:
步骤20251,将所述替换后的变量的变量声明和赋值划分为至少一个变量代码块。
代码块即为用大括号封装的多行代码,本发明实施例中,在对变量声明与赋值语句进行加密前,需要将其换分为至少一个代码块,形成独立的数据体,以便调用。
步骤20252,从所述变量代码块中提取相应的变量名与变量赋值。
本发明实施例中,在变量名替换的过程中,首先在语法树中提取待替换的变量名及变量赋值语句,并生成一个双层对象,对象第一层的key值为待替换的变量名,对象第二层有两个key值,第一key值为新变量名用于替换带替换的变量名,第二key值为新变量名的赋值。然后,再用新的变量名替换待替换的变量名,并生成新的对象,其中,新对象中与第一key值对应的第一value值为新变量名,第二key值对应的第二value值为待替换变量名的赋值。待替换的变量名所对应的赋值,可在之前生成的对象中查找。之后,可以将新变量名与赋值进行提取,并将新变量名作为key,赋值作为value以备后续的加密操作。
步骤20253,对所述变量名与所述变量赋值采取不同的加密方式进行加密,以获得密文变量名与密文变量赋值。
本发明实施例中,对key和value分别使用不同的加密方式进行加密,从而将其转化为密文变量名或密文变量赋值,达到对变量的隐藏,具体加密方式可由本领域技术人员自行选择,本发明对此不做具体限制。本发明实施例中,对于替换后变量名与赋值进行隐藏的步骤,实际上类似于常量的隐藏步骤,赋值后的变量可按常量处理,通过对变量名与赋值的隐藏,可以在不影响代码执行的情况下,更好的进行代码保护。
本发明实施例中,对于变量的保护处理,除了替换变量名外,还可以对变量进行多重分支处理,在代码保护过程中产生多个中间值,将所有赋值语句都改为函数调用等。可选地,当所述保护单元为代码块时,所述步骤202包括:
步骤2026,遍历所述语法树,以在所述语法树中查找所述代码块。
本发明实施例中,对语法树进行循环遍历,将语法树的整体代码进行分化获得代码块,每一个函数,每一个变量声明赋值,每一个函数执行,每一个循环等都可以分化为一个代码块,其中,包括语法树的节点,由于语法树是以树状的形式表现编程语言的语法结构,因此每一个节点均表示源代码的一种结构。
步骤2027,在所述代码块的节点中插入预置代码。
本发明实施例中,可以通过大量收集欲保护源代码所在平台的废代码,并根据对废代码的分析,生成废代码生成器,或自主编写废代码模板以适配欲保护源代码,如,针对微信小程序的源代码,可以收集微信小程序的废代码进行解析,获得微信小程序废代码生成器,通过该微信小程序可以大量成圣不同类型废代码,如变量声明、函数、对象等等,从而获得与欲保护源代码适配性高的预置代码。
本发明实施例中,在获得预置代码后,根据预置代码的类型将其插入节点的相应位置,从而在不影响函数执行的情况下,极大程度上改变源代码的可读性,却不影响代码的可执行性,对源代码形成有效的保护。
和/或,步骤2028,将所述代码块中的控制语句转换为分支语句。
本发明实施例中,除废代码插入外,对于代码块也可以采用分支平坦化的方式,即将代码块中的控制语句转化为分支语句,首先可以将代码块转化为switch case语句中,之后再通过循环遍历,将switch case语句进行平坦化,也就是说,每个基本块就是一个case块,所有的基本块都有共同的前驱块,而该前驱块进行基本块的分发,前驱块分发用switch语句,依赖于switch变量进行分发。
本发明实施例中,在通过switch case语句进行平坦化后,还可以对case值进行隐藏,例如将switch(x)的转化为switch(f(x)),f(x)可以是散列函数、在区间[casemin,casemax]有唯一值的数学函数、RSA加密算法(由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一同提出的,RSA为他们三人姓氏首字母拼成的)、离散对数、椭圆曲线离散对数等,此时switch语句需要转化为if语句,为了进一步加密,本领域技术人员还可以对平坦化后的语句进行其他处理,本发明对此不做具体限制。
步骤203,将保护处理后的所述语法树转化为目标代码。
本发明实施例中,在对语法树进行了修改后,还需要通过源代码编写引擎的底层结构,将语法树转化为目标代码,目标代码即为经过深度保护处理后的源代码,与源代码相比结构经过了各种更改,达到了前后处理后的代码就关联性极低的效果,无法进行对比分析,且并不影响代码的正确执行,极大提高了不法分子破解源代码的门槛,改善了代码的安全性。
本领域技术人员可以理解,上述保护处理的措施可以顺序执行,也可以单独执行,可以仅对常量进行处理,也可以仅对常量和变量进行处理,或者也可以对所有的待保护单元进行处理,可以对常量中所有的代码进行处理,也可以仅对一部分常量进行处理,本领域技术人员可对上述处理步骤进行组合、重排等,本发明对此不做限制。
本发明实施例提供一种源代码的保护方法,通过将源代码转化为语法树,并对语法树进行分析和加工,包括常量、变量和代码块的分化,之后再根据不同的分化,对所述语法树采取不同的保护处理,确保其得到有效保护,整个过程中都是黑盒处理,在保证不影响源代码执行的前提下,尽可能降低代码可读性,从而降低不法分析人员破解的成功率,同时在处理过程中,语法树的转换、根据分化不同的保护处理、变形输出的新语法树可以通用适配MINA JS引擎的底层结构,从而使得本发明实施例的方案能够应用于微信小程序代码的深度保护。
实施例三
图3是本发明实施例提供的一种源代码保护装置的框图,如图3所示,该装置可以包括:
语法树转化模块301,用于获取待保护的源代码,并将所述源代码转化为语法树。
语法树处理模块302,用于遍历所述语法树,对所述语法树中的待保护单元进行保护处理;其中,所述待保护单元包括常量、变量、代码块中的至少一种。
目标代码获取模块303,用于将保护处理后的所述语法树转化为目标代码。
可选地,所述待保护单元为常量,所述语法树处理模块302包括:
常量获取子模,用于遍历所述语法树,以查找所述语法树中的常量。
常量加密子模块,用于根据预设编码方式,对所述语法树中的常量进行加密。或
常量赋值子模块,用于对所述语法树中的常量赋值于至少一个变量名,并且在所述语法树中隐藏所述常量的赋值语句。
可选地,所述待保护单元为变量,所述语法树处理模块302包括:
变量标记子模块,用于遍历所述语法树,以标记所述语法树中各变量对应的当前作用域以及真实作用域。
变量混淆子模块,用于将所述语法树中每个作用域的非全局变量进行替换,以及在所述语法树中隐藏替换后的变量的变量声明和赋值。
可选地,所述变量混淆子模块,包括:
变量代码块生成单元,用于将所述替换后的变量的变量声明和赋值划分为至少一个变量代码块;
变量提取单元,用于从所述变量代码块中提取相应的变量名与变量赋值。
变量加密单元,用于对所述变量名与所述变量赋值采取不同的加密方式进行加密,以获得密文变量名与密文变量赋值。
可选地,所述待保护单元为代码块,所述语法树处理模块包括:
节点获取子模块,用于遍历所述语法树,以在所述语法树中查找所述代码块。
代码插入子模块,用于在所述代码块的节点中插入预置代码。
和/或,平坦化子模块,用于将所述代码块中的控制语句转换为分支语句。
对于上述装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域技术人员可以理解,上述保护处理的模块可以顺序启用,也可以单独启用,可以仅对常量进行处理,也可以仅对常量和变量进行处理,或者也可以对所有的待保护单元进行处理;可以对常量中所有的代码进行处理,也可以仅对一部分常量进行处理,本领域技术人员可对上述处理模块进行组合、重排等,本发明对此不做限制。
本发明实施例提供一种源代码的保护装置,通过将源代码转化为语法树,并对语法树进行分析和加工,包括常量、变量和代码块的分化,之后再根据不同的分化,对所述语法树采取不同的保护处理,确保其得到有效保护,整个过程中都是黑盒处理,在保证不影响源代码执行的前提下,尽可能降低代码可读性,从而降低不法分析人员破解的成功率,同时在处理过程中,语法树的转换、根据分化不同的保护处理、变形输出的新语法树可以通用适配MINA JS引擎的底层结构,从而使得本发明实施例的方案能够应用于微信小程序代码的深度保护。
另外,本发明实施例还提供一种终端,包括处理器,存储器,存储在存储器上并可在处理上运行的计算机程序,该计算机程序被处理器执行时实现上述源代码保护方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
本发明实施例还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现上述源代码保护方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。其中,所述的计算机可读存储介质,可以为只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random Access Memory,简称RAM)、磁碟或者光盘等。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域技术人员易于想到的是:上述各个实施例的任意组合应用都是可行的,故上述各个实施例之间的任意组合都是本发明的实施方案,但是由于篇幅限制,本说明书在此就不一一详述了。
在此提供的源代码保护方法不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造具有本发明方案的系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本发明并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的源代码保护方法中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。

Claims (4)

1.一种源代码保护方法,其特征在于,所述方法包括:
获取待保护的源代码,并将所述源代码转化为语法树;
遍历所述语法树,对所述语法树中的待保护单元进行保护处理;
将保护处理后的所述语法树转化为目标代码;
其中,所述待保护单元为变量,所述遍历所述语法树,对所述语法树中的待保护单元进行保护处理的步骤,包括:
遍历所述语法树,以标记所述语法树中各变量对应的当前作用域以及真实作用域;
将所述语法树中每个作用域的非全局变量进行替换,以及在所述语法树中隐藏替换后的变量的变量声明和赋值。
2.根据权利要求1所述的方法,其特征在于,所述在所述语法树中隐藏替换后的变量的变量声明和赋值的步骤,包括:
将所述替换后的变量的变量声明和赋值划分为至少一个变量代码块;
从所述变量代码块中提取相应的变量名与变量赋值;
对所述变量名与所述变量赋值采取不同的加密方式进行加密,以获得密文变量名与密文变量赋值。
3.一种微信小程序源代码保护装置,其特征在于,所述装置包括:
语法树转化模块,用于获取待保护的源代码,并将所述源代码转化为语法树;
语法树处理模块,用于遍历所述语法树,对所述语法树中的待保护单元进行保护处理;
目标代码获取模块,用于将保护处理后的所述语法树转化为目标代码;
所述待保护单元为变量,所述语法树处理模块包括:
变量标记子模块,用于遍历所述语法树,以标记所述语法树中各变量对应的当前作用域以及真实作用域;
变量混淆子模块,用于将所述语法树中每个作用域的非全局变量进行替换,以及在所述语法树中隐藏替换后的变量的变量声明和赋值。
4.根据权利要求3所述的装置,其特征在于,所述变量混淆子模块,包括:
变量代码块生成单元,用于将所述替换后的变量的变量声明和赋值划分为至少一个变量代码块;
变量提取单元,用于从所述变量代码块中提取相应的变量名与变量赋值;
变量加密单元,用于对所述变量名与所述变量赋值采取不同的加密方式进行加密,以获得密文变量名与密文变量赋值。
CN201910200131.7A 2019-03-15 2019-03-15 一种源代码保护方法及装置 Active CN109992935B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910200131.7A CN109992935B (zh) 2019-03-15 2019-03-15 一种源代码保护方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910200131.7A CN109992935B (zh) 2019-03-15 2019-03-15 一种源代码保护方法及装置

Publications (2)

Publication Number Publication Date
CN109992935A CN109992935A (zh) 2019-07-09
CN109992935B true CN109992935B (zh) 2021-05-25

Family

ID=67130661

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910200131.7A Active CN109992935B (zh) 2019-03-15 2019-03-15 一种源代码保护方法及装置

Country Status (1)

Country Link
CN (1) CN109992935B (zh)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110457872B (zh) * 2019-07-19 2021-08-06 西安理工大学 一种Android App应用资源的隐藏加固方法
CN110457869B (zh) * 2019-07-23 2022-03-22 Oppo广东移动通信有限公司 程序编译加密方法、装置、存储介质及电子设备
CN110413283B (zh) * 2019-08-02 2023-05-30 北京智游网安科技有限公司 基于编译器前端的混淆方法、存储介质及终端设备
CN110555291B (zh) * 2019-08-06 2021-08-27 苏宁云计算有限公司 网页脚本代码保护方法及装置
CN110716746B (zh) * 2019-09-03 2023-04-07 五八有限公司 将rn样式代码转换为小程序样式代码的方法及装置
CN112541188B (zh) * 2019-09-20 2022-05-13 武汉斗鱼网络科技有限公司 阻止应用程序代码被静态分析的方法及装置
CN110598379B (zh) * 2019-09-23 2021-06-08 北京智游网安科技有限公司 一种实现字符串混淆的方法、设备及存储介质
CN111049897B (zh) * 2019-12-10 2023-02-17 北京百度网讯科技有限公司 小程序包的加密上传和解密部署方法、装置、设备和介质
CN111143204B (zh) * 2019-12-19 2021-06-29 支付宝(杭州)信息技术有限公司 一种小程序代码扫描方法和装置
CN113031930B (zh) * 2019-12-24 2022-07-05 武汉斗鱼鱼乐网络科技有限公司 一种控制流平坦化的源代码混淆生成方法及装置
CN111249736B (zh) * 2020-01-16 2023-03-21 网易(杭州)网络有限公司 代码处理方法及装置
CN111488569B (zh) * 2020-04-09 2022-12-27 支付宝(杭州)信息技术有限公司 一种权限确定、管理方法、装置、设备及介质
CN113158147B (zh) * 2021-03-24 2022-12-09 中国人民解放军战略支援部队信息工程大学 一种基于母体融合的代码混淆方法
CN112948726A (zh) * 2021-03-29 2021-06-11 建信金融科技有限责任公司 一种处理异常信息的方法、装置和系统
CN113342657A (zh) * 2021-06-09 2021-09-03 网易(杭州)网络有限公司 一种检测代码异常的方法和装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1588265A (zh) * 2004-09-01 2005-03-02 中国科学院计算技术研究所 一种基于函数加密的软件保护方法
JP2009048259A (ja) * 2007-08-14 2009-03-05 Seiko Epson Corp プログラム変換方法及び変換用プログラム
CN108037926A (zh) * 2017-12-26 2018-05-15 网易(杭州)网络有限公司 字节码的优化方法、装置、存储介质、处理器及终端
CN108363911A (zh) * 2018-02-11 2018-08-03 西安四叶草信息技术有限公司 一种Python脚本混淆、水印的方法及装置

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8640088B2 (en) * 2010-01-21 2014-01-28 International Business Machines Corporation Software reuse utilizing naive group annotation of incomplete software descriptions employing a self-reporting element
CN109033764B (zh) * 2017-06-09 2023-04-11 腾讯科技(深圳)有限公司 反混淆处理方法及终端、计算机设备
CN108345773B (zh) * 2017-07-27 2020-09-08 江苏通付盾信息安全技术有限公司 基于虚拟机的代码保护方法及装置、电子设备、存储介质
CN108595921B (zh) * 2018-03-22 2020-11-13 北京奇艺世纪科技有限公司 一种源代码中字符串的混淆方法和装置
CN108710787B (zh) * 2018-03-26 2020-09-08 江苏通付盾信息安全技术有限公司 代码混淆方法及装置、计算设备、计算机存储介质

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1588265A (zh) * 2004-09-01 2005-03-02 中国科学院计算技术研究所 一种基于函数加密的软件保护方法
JP2009048259A (ja) * 2007-08-14 2009-03-05 Seiko Epson Corp プログラム変換方法及び変換用プログラム
CN108037926A (zh) * 2017-12-26 2018-05-15 网易(杭州)网络有限公司 字节码的优化方法、装置、存储介质、处理器及终端
CN108363911A (zh) * 2018-02-11 2018-08-03 西安四叶草信息技术有限公司 一种Python脚本混淆、水印的方法及装置

Also Published As

Publication number Publication date
CN109992935A (zh) 2019-07-09

Similar Documents

Publication Publication Date Title
CN109992935B (zh) 一种源代码保护方法及装置
Compton et al. Embedding java classes with code2vec: Improvements from variable obfuscation
CN101084478B (zh) 为计算机程序代码加水印
CN108595921B (zh) 一种源代码中字符串的混淆方法和装置
CN105453481B (zh) 包括表网络的计算设备
US9454456B2 (en) Method for separately executing software, apparatus, and computer-readable recording medium
US20150244737A1 (en) Detecting malicious advertisements using source code analysis
WO2006101755A2 (en) Methods and systems for identifying an area of interest in protectable content
CN113918951B (zh) 基于抽象语法树的恶意代码检测方法、装置及电子设备
CN111819542A (zh) 编译设备和方法
CN112115427A (zh) 代码混淆方法、装置、电子设备及存储介质
CN104573427A (zh) 一种可执行应用的混淆方法和装置
US8677149B2 (en) Method and system for protecting intellectual property in software
WO2008132395A1 (fr) Procede de protection de documents numeriques contre des utilisations non autorisees
KR20190050691A (ko) 전주기적 비식별화 관리 장치 및 방법
CN109241707A (zh) 应用程序的混淆方法、装置和服务器
Cheers et al. Spplagiarise: A tool for generating simulated semantics-preserving plagiarism of java source code
US9396177B1 (en) Systems and methods for document tracking using elastic graph-based hierarchical analysis
Andrey et al. A Technique for Analyzing Bytecode in a Java Project for the Purpose of an Automated Assessment of the Possibility and Effectiveness of the Hidden Investment of Information and its Volumes in a Java Project
CN109241706B (zh) 基于静态胎记的软件抄袭检测方法
CN108460253B (zh) 基于顺序、符号执行和单点逻辑的源代码加固方法及装置
CN114090965B (zh) java代码混淆方法、系统、计算机设备及存储介质
Hamilton et al. An evaluation of the resilience of static java bytecode watermarks against distortive attacks
CN108446542B (zh) 一种基于符号执行的源代码混淆方法及装置
CN113946804B (zh) 一种源代码的混淆方法和装置

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
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20210913

Address after: 311100 18 Yuhang 207, Wen Yi Xi Road, Yuhang District, Hangzhou, Zhejiang.

Patentee after: TONGDUN TECHNOLOGY Co.,Ltd.

Address before: Room 704, building 18, No. 998, Wenyi West Road, Wuchang Street, Yuhang District, Hangzhou City, Zhejiang Province

Patentee before: TONGDUN HOLDINGS Co.,Ltd.