CN113704706A - 代码加固方法、装置 - Google Patents

代码加固方法、装置 Download PDF

Info

Publication number
CN113704706A
CN113704706A CN202111115647.5A CN202111115647A CN113704706A CN 113704706 A CN113704706 A CN 113704706A CN 202111115647 A CN202111115647 A CN 202111115647A CN 113704706 A CN113704706 A CN 113704706A
Authority
CN
China
Prior art keywords
syntax tree
code
function
reinforced
source code
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
CN202111115647.5A
Other languages
English (en)
Other versions
CN113704706B (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.)
Shenzhen Tencent Information Technology Co Ltd
Original Assignee
Shenzhen Tencent Information Technology 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 Shenzhen Tencent Information Technology Co Ltd filed Critical Shenzhen Tencent Information Technology Co Ltd
Priority to CN202111115647.5A priority Critical patent/CN113704706B/zh
Publication of CN113704706A publication Critical patent/CN113704706A/zh
Application granted granted Critical
Publication of CN113704706B publication Critical patent/CN113704706B/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
    • 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
    • G06F8/447Target code generation

Landscapes

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

Abstract

本申请提供了一种代码加固方法、装置、设备、计算机可读存储介质及计算机程序产品;方法包括:确定源代码的第一语法树,其中,所述第一语法树用于表征所述源代码的语法结构;对所述第一语法树进行解析,得到与所述源代码中的待加固函数对应的第二语法树,其中,所述第二语法树为所述第一语法树的子树结构;对所述第二语法树中对应所述待加固函数的函数逻辑进行编译处理,得到目标二进制代码;根据所述目标二进制代码和运行时,生成与所述待加固函数对应的可执行二进制代码;将与所述待加固函数对应的可执行二进制代码替换所述源代码中的所述待加固函数,得到加固代码。通过本申请,能够实现对源代码的有效加固,提高源代码的安全性。

Description

代码加固方法、装置
技术领域
本申请涉及互联网技术领域,尤其涉及一种代码加固方法、装置、设备、计算机可读存储介质及计算机程序产品。
背景技术
互联网特别是移动互联网的快速发展,各种应用程序的数量也飞速增长。然而,在一些核心技术领域,技术拥有方并不希望应用程序的源代码的计算逻辑被外界所知晓,为了防止应用程序的源代码被窃取,可以对应用程序的源代码进行加固处理。
相关技术中,对于应用程序的源代码的加固处理,通常是对源代码进行加密的方式实现。这样,当加密密钥被破解时,应用程序的源代码将整体被破解,导致加固安全性极低。
对于如何实现对源代码的有效加固,提高源代码的安全性,相关技术尚无有效解决方案。
发明内容
本申请实施例提供一种代码加固方法、装置、设备、计算机可读存储介质及计算机程序产品,能够实现对源代码的有效加固,提高源代码的安全性。
本申请实施例的技术方案是这样实现的:
本申请实施例提供一种代码加固方法,包括:
确定源代码的第一语法树,其中,所述第一语法树用于表征所述源代码的语法结构;
对所述第一语法树进行解析,得到与所述源代码中的待加固函数对应的第二语法树,其中,所述第二语法树为所述第一语法树的子树结构;
对所述第二语法树中对应所述待加固函数的函数逻辑进行编译处理,得到目标二进制代码;
根据所述目标二进制代码和运行时,生成与所述待加固函数对应的可执行二进制代码;
将与所述待加固函数对应的可执行二进制代码替换所述源代码中的所述待加固函数,得到加固代码。
本申请实施例提供一种代码加固装置,包括:
确定模块,用于确定源代码的第一语法树,其中,所述第一语法树用于表征所述源代码的语法结构;
解析模块,用于对所述第一语法树进行解析,得到与所述源代码中的待加固函数对应的第二语法树,其中,所述第二语法树为所述第一语法树的子树结构;
编译模块,用于对所述第二语法树中对应所述待加固函数的函数逻辑进行编译处理,得到目标二进制代码;
生成模块,用于根据所述目标二进制代码和运行时,生成与所述待加固函数对应的可执行二进制代码;
替换模块,用于将与所述待加固函数对应的可执行二进制代码替换所述源代码中的所述待加固函数,得到加固代码。
上述方案中,所述生成模块,用于将所述目标二进制代码转换为与所述目标二进制代码对应的字节码,其中,所述字节码为所述目标二进制代码的文本抽象描述;基于所述字节码调用所述运行时执行以下处理:将所述字节码中的字符依次存储至所述运行时的堆栈数据结构中;基于存储后的所述堆栈数据结构执行所述字节码中的字符,得到与所述待加固函数对应的可执行二进制代码。
上述方案中,所述生成模块,还用于从所述字节码中裁剪掉所述非指令字符;将所述字节码中剩余的所述指令字符依次存储至所述运行时的所述堆栈数据结构中;基于存储有所述指令字符的所述堆栈数据结构执行所述字节码中的指令字符,得到与所述指令字符对应的可执行二进制代码;基于与所述指令字符对应的可执行二进制代码和剩余二进制代码,生成与所述待加固函数对应的可执行二进制代码,其中,所述剩余二进制代码为所述目标二进制代码中除所述指令字符对应的二进制代码以外的二进制代码。
上述方案中,所述确定模块,用于基于所述源代码的字符序列进行词法解析,得到所述源代码的标记序列;基于所述源代码的标记序列进行语法解析,得到所述源代码的第一语法树。
上述方案中,所述解析模块,用于基于所述待加固函数的字符序列进行词法解析,得到所述待加固函数的标记序列;对所述第一语法树进行解析,得到所述第一语法树中每个节点的字符;将所述标记序列的起始字符与所述第一语法树每个节点的字符进行匹配,得到所述第一语法树中与所述标记序列的起始字符匹配的节点;将所述第一语法树中与所述标记序列的起始字符匹配的节点确定为所述第二语法树的根节点;将所述第一语法树中与所述第二语法树的根节点对应的子树结构,确定为与所述源代码中的待加固函数对应的第二语法树。
上述方案中,所述编译模块,用于对所述第二语法树进行逻辑遍历处理,得到所述待加固函数的函数逻辑;基于所述待加固函数的函数逻辑调用编译器进行编译处理,得到与所述待加固函数对应的中间代码;基于所述中间代码调用所述编译器进行转换处理,得到所述目标二进制代码。
上述方案中,所述代码加固装置还包括:验证模块,用于按照所述第二语法树的层级顺序,通过编译器对所述第二语法树中不同类型的节点进行验证处理,得到所述第二语法树中的错误类型节点;将所述第二语法树中的类型错误节点进行展开改写处理,得到与所述类型错误节点对应的正确类型节点;将所述正确类型节点替换所述第二语法树中对应的错误类型节点。
上述方案中,所述代码加固装置还包括:膨胀模块,用于在所述第二语法树中的所述待加固函数的函数逻辑中随机插入膨胀逻辑,得到膨胀处理后的第二语法树,其中,所述膨胀逻辑用于对所述第二语法树进行所述膨胀处理,且保持所述待加固函数的原有的函数逻辑;裁剪变换模块,用于在所述膨胀处理后的第二语法树中随机插入裁剪变换逻辑,得到裁剪变换后的第二语法树,其中,所述裁剪变换逻辑用于对所述第二语法树进行代码平展化处理;加密变换模块,用于对所述裁剪变换后的第二语法树中的每个节点的字符进行加密变换处理,得到加密后的第二语法树,其中,所述加密后的第二语法树用于对所述待加固函数的函数逻辑进行所述编译处理。
上述方案中,所述代码加固装置还包括:混淆压缩模块,用于基于所述加固代码调用混淆工具软件进行混淆处理,得到混淆后的加固代码;基于所述混淆后的加固代码调用压缩工具软件进行压缩处理,得到更新的加固代码。
本申请实施例提供一种代码加固装置,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现本申请实施例提供的代码加固方法。
本申请实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行时,实现本申请实施例提供的代码加固方法。
本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本申请实施例上述的代码加固方法。
本申请实施例具有以下有益效果:
通过获取源代码中的待加固函数对应的第二语法树,对源代码中的待加固函数对应的第二语法树进行处理,生成与待加固函数对应的可执行二进制代码,并通过可执行二进制代码替换源代码中的待加固函数,从而实现了对源代码中待加固函数的加固,由于是以源代码中的待加固函数为粒度进行的加固处理,使得被破解者破解时,也无法得知源代码中待加固函数的具体信息,因此无法对源代码中的待加固函数进行有效破解,进而无法对整个源代码进行破解,从而能够提高源代码的安全性。
附图说明
图1是本申请实施例提供的代码加固系统架构的结构示意图;
图2是本申请实施例提供的代码加固装置的结构示意图;
图3A至图3E是本申请实施例提供的代码加固方法的流程示意图;
图4A至图4K是本申请实施例提供的代码加固方法的原理示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本申请实施例能够以除了在这里图示或描述的以外的顺序实施。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
对本申请实施例进行进一步详细说明之前,对本申请实施例中涉及的名词和术语进行说明,本申请实施例中涉及的名词和术语适用于如下的解释。
1)语法树(Syntax Tree):又名抽象语法树(Abstract Syntax Tree,AST),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
2)运行时:运行时是一种面向对象的编程语言(面向对象编程)的运行环境。运行时表明了在某个时间段内,哪个程序正在运行。运行时是计算机程序运行生命周期内的一个阶段,其它阶段还包括:编译时、链接时和加载时。
3)二进制代码(Binary Code):由两个基本字符0、1组成的代码。其中,码元:"一位"二进制代码。码字:N个码元可以组成的不同组合,任意一个组合称一个码字。
4)字节码(Byte Code):是一种包含执行程序、由一序列操作码(Operat ionCode,OP)/数据对组成的二进制文件,字节码是一种中间码,且比机器码更抽象。
5)堆栈数据结构(Stack):是一种数据项按序排列的数据结构,只能在一端(称为栈顶)对数据项进行插入和删除。堆栈数据结构是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。
在本申请实施例的实施过程中,申请人发现相关技术存在以下问题:
相关技术中,通常是以整个代码文件为粒度进行加密、压缩、混淆、反调试、防篡改等加固保护,由于相关技术以整个代码文件为粒度进行加固,导致加固成本较高,且针对代码整体加固,当出现问题后存在着不容易定位的问题。而且兼容性较差,当存在某一中语法结构不兼容可能会导致整个代码文件或项目加固失败。同时,相关技术中,虚拟化加固虚拟机运行时相对固定,当运行时被破解后意味着所有的代码逻辑均会被以同样的方式被破解。
本申请实施例提供一种代码加固方法、装置、设备、计算机可读存储介质及计算机程序产品,能够实现对源代码的更有效加固,提高源代码的安全性,下面说明本申请实施例提供的代码加固设备的示例性应用,本申请实施例提供的设备可以实施为笔记本电脑,平板电脑,台式计算机,机顶盒,移动设备(例如,移动电话,便携式音乐播放器,个人数字助理,专用消息设备,便携式游戏设备)等各种类型的用户终端,也可以实施为服务器。
参见图1,图1是本申请实施例提供的代码加固系统100的架构示意图,为实现支撑一个代码加固应用,终端(示例性示出了终端400)通过网络300连接服务器200,网络300可以是广域网或者局域网,又或者是二者的组合。
终端400用于供用户使用客户端410,在图形界面410-1(示例性示出了图形界面410-1)显示。终端400和服务器200通过有线或者无线网络相互连接。
在一些实施例中,服务器200可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等基础云计算服务的云服务器。终端400可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请实施例中不做限制。
在一些实施例中,终端400根据用户针对图形界面410-1的操作,对源代码中的待加固函数进行加固,并在图形界面410-1中显示加固成功的提示消息。
在另一些实施例中,终端400根据用户针对图形界面410-1的操作,终端400通过网络300向服务器200发送加固请求,服务器200响应于加固请求,对源代码中的待加固函数进行加固,并将加固结果发送至终端400,终端400在图形界面410-1中显示加固成功的提示消息。
参见图2,图2是本申请实施例提供的代码加固服务器200的结构示意图,图2所示的服务器200包括:至少一个处理器410、存储器450、至少一个网络接口420。服务器200中的各个组件通过总线系统440耦合在一起。可理解,总线系统440用于实现这些组件之间的连接通信。总线系统440除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线系统440。
处理器410可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
存储器450可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器450可选地包括在物理位置上远离处理器410的一个或多个存储设备。
存储器450包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Memory),易失性存储器可以是随机存取存储器(RAM,Random Access Memory)。本申请实施例描述的存储器450旨在包括任意适合类型的存储器。
在一些实施例中,存储器450能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作系统451,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块452,用于经由一个或多个(有线或无线)网络接口420到达其他计算设备,示例性的网络接口420包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(USB,Universal Serial Bus)等;
在一些实施例中,本申请实施例提供的代码加固装置可以采用软件方式实现,图2示出了存储在存储器450中的代码加固装置455,其可以是程序和插件等形式的软件,包括以下软件模块:确定模块4551、解析模块4552、编译模块4553、生成模块4554、替换模块4555,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
在另一些实施例中,本申请实施例提供的代码加固装置可以采用硬件方式实现,作为示例,本申请实施例提供的代码加固装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本申请实施例提供的代码加固方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(ASIC,Application Specific IntegratedCircuit)、DSP、可编程逻辑器件(PLD,Programmable Logic Device)、复杂可编程逻辑器件(CPLD,Complex Programmable Logic Device)、现场可编程门阵列(FPGA,Field-Programmable Gate Array)或其他电子元件。
在一些实施例中,终端或服务器可以通过运行计算机程序来实现本申请实施例提供的代码加固方法。举例来说,计算机程序可以是操作系统中的原生程序或软件模块;例如可以是本地(Native)应用程序(APP,Application),即需要在操作系统中安装才能运行的程序。总而言之,上述计算机程序可以是任意形式的应用程序、模块或插件。
将结合本申请实施例上文提供的代码加固方法的示例性应用和实施,说明本申请实施例提供的代码加固方法,如前所述,本申请实施例提供的代码加固方法可以由终端设备、服务器或二者的协同实现,下文不再重复说明。
在一些实施例中,参见图3A,图3A是本申请实施例提供的代码加固方法的流程示意图,将结合图3A示出的步骤101至步骤105进行说明。
在步骤101中,确定源代码的第一语法树,其中,第一语法树用于表征源代码的语法结构。
在一些实施例中,源代码的第一语法树可以是与源代码对应的语法树结构,其中,语法树结构是源代码语法结构的一种抽象表示,语法树以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
在一些实施例中,参见图3B,图3B是本申请实施例提供的代码加固方法的一个可选的流程示意图,图3B示出的步骤101可以通过步骤1011至步骤1012实现,下面分别说明。
在步骤1011中,基于源代码的字符序列进行词法解析,得到源代码的标记序列。
例如,源代码可以包括字符序列,词法解析可以把字符序列形式的源代码转换为令牌(Tokens)流,令牌流是一个扁平的语法片段数组,从而根据令牌流,得到源代码的标记序列。
在步骤1012中,基于源代码的标记序列进行语法解析,得到源代码的第一语法树。
例如,源代码的标记序列是通过对源代码的字符序列进行语法解析而得到的,语法解析可以把源代码的标记序列转换为抽象语法树(即语法树)的形式。即,将令牌流中的信息转换成一个抽象语法树的树结构,即将令牌流中的信息转换成源代码的第一语法树。
如此,通过对源代码的字符序列进行词法解析,得到源代码的标记序列,再将源代码的标记序列进行语法解析,得到源代码的第一语法树。由于源代码的第一语法树不依赖于具体的文法,不依赖于源代码语言的具体细节,将源代码转换成与源代码对应的第一语法树之后,可以对第一语法树进行下一步操作,有效减少了源代码中冗余的信息,避免了在进行进一步操作时造成不利影响。
在步骤102中,对第一语法树进行解析,得到与源代码中的待加固函数对应的第二语法树,其中,第二语法树为第一语法树的子树结构。
在一些实施例中,对第一语法树进行解析可以通过以下方式实现:对第一语法树的树结构中的每一节点进行解析,确定第一语法树的树结构中的每一节点的字符。根据第一语法树的树结构中的每一节点的字符,确定第二语法树的根节点。基于第二语法树的根节点,确定与源代码中的待加固函数对应的第二语法树。
在一些实施例中,上述步骤102可以通过以下方式实现:在待加固函数的函数头部加入注释标签,通过对第一语法树进行解析,确定第一语法树的树结构中的每一节点的字符,根据第一语法树的树结构中的每一节点的字符,确定第一语法树中包含注释标签的节点,并将第一语法树中包含注释标签的节点确定为第二语法树的根节点。
在一些实施例中,参见图3B,图3B是本申请实施例提供的代码加固方法的一个可选的流程示意图,图3B示出的步骤102可以通过步骤1021至步骤1025实现,下面分别说明。
在步骤1021中,基于待加固函数的字符序列进行词法解析,得到待加固函数的标记序列。
例如,待加固函数可以包括字符序列,通过词法解析,可以把待加固函数的字符序列转换为令牌(Tokens)流,令牌流是一个扁平的语法片段数组,从而根据令牌流,得到待加固函数的标记序列。
在步骤1022中,对第一语法树进行解析,得到第一语法树中每个节点的字符。
例如,对第一语法树进行解析,所得到的第一语法树中每个节点的字符可以为“sdfsa”、“sdfwe”等等,即第一语法树中每个节点中均承载有与该节点对应的节点数据,该节点数据即为该节点对应的字符。
在步骤1023中,将标记序列的起始字符与第一语法树每个节点的字符进行匹配,得到第一语法树中与标记序列的起始字符匹配的节点。
例如,第一语法树中的节点包括:第一节点(假设第一节点的字符为zad)、第二节点(假设第二节点的字符为aaw)、第三节点(假设第三节点的字符为xhd),假设标记序列的起始字符为(aaw),通过将标记序列的起始字符与第一语法树每个节点的字符进行匹配,得到第一语法树中与标记序列的起始字符匹配的节点为第二节点。
在步骤1024中,将第一语法树中与标记序列的起始字符匹配的节点确定为第二语法树的根节点。
例如,标记序列的起始字符可以为待加固函数对应的第二语法树的根节点的节点数据的起始字符。通过将标记序列的起始字符与第一语法树每个节点的字符进行匹配,从而可以得到第一语法树中与标记序列的起始字符匹配的节点即,在第一语法树中寻找到第二语法树的根节点。
在步骤1025中,将第一语法树中与第二语法树的根节点对应的子树结构,确定为与源代码中的待加固函数对应的第二语法树。
例如,一个子树结构中存在一个根节点,在第一语法树中寻找到第二语法树的根节点后,即可将第一语法树中与第二语法树的根节点对应的子树结构,确定为待加固函数对应的第二语法树。即,将第一语法树的第二节点对应的子树结构确定为待加固函数对应的第二语法树。
通过对第一语法树进行解析,得到与源代码中的待加固函数对应的第二语法树,便于通过对第二语法树进行操作从而对待加固函数进行加固。由于第二语法树是第一语法树的子树结构,对第二语法树进行操作相比于直接对第一语法树进行操作,可以有效减少代码加固过程的运行时长,大幅缩短计算量。
在一些实施例中,参见图3D,在步骤102之后,通过执行步骤109至步骤111对第二语法树中的节点进行验证,下面分别进行说明。
在步骤109中,在第二语法树中的待加固函数的函数逻辑中随机插入膨胀逻辑,得到膨胀处理后的第二语法树,其中,膨胀逻辑用于对第二语法树进行膨胀处理,且保持待加固函数的原有的函数逻辑。
例如,膨胀逻辑可以是不具备任何实质功能的函数逻辑,是一个不会被执行的判断逻辑。在待加固函数的函数逻辑中随机插入膨胀逻辑后,待加固函数的函数逻辑保持不变,但是待加固函数的代码长度明显增加,复杂度明显增加,使得膨胀处理后的第二语法树更加不易被破解。
在步骤110中,在膨胀处理后的第二语法树中随机插入裁剪变换逻辑,得到裁剪变换后的第二语法树,其中,裁剪变换逻辑用于对第二语法树进行代码平展化处理。
例如,裁剪变换逻辑可以是具有代码裁剪功能的逻辑函数,通过在裁剪插件中设置相应的加载器,进而通过加载器来注入裁剪变换逻辑。裁剪变换逻辑可以根据类名信息和/或函数名信息,遍历第二语法树的节点,并生成删除了冗余代码的第二语法树节点,进而根据所生成的删除了冗余代码的第二语法树节点,得到裁剪变换后的第二语法树。
如此,通过在第二语法树中随机插入裁剪变化逻辑,使得的裁剪变换后的第二语法树中每个节点的节点数据更加平展化,有效增加了第二语法树的语法复杂度,使得裁剪变换后的第二语法树更加不易被破解。
在步骤111中,对裁剪变换后的第二语法树中的每个节点的字符进行加密变换处理,得到加密后的第二语法树,其中,加密后的第二语法树用于对待加固函数的函数逻辑进行编译处理。
例如,加密变换处理可以是通过选取相应的加密算法实现的,加密算法可以包括MD5加密算法(Message-Digest Algorithm 5)、DES加密算法(Data EncryptionStandard)、IDEA加密算法(International Data Encryption Algorithm)、DSA加密算法(Digital Signature Algorithm)等。
如此,加密变换处理所选取的加密算法可以随机选取,通过随机选取的加密算法对裁剪变换后的第二语法树的每个节点的字符进行加密变换,可以有效保证加密变换的安全性。加密后的第二语法树较之于裁剪变换后的第二语法树,安全性更高,使得加密后的第二语法树更加不容易被破解。
在步骤103中,对第二语法树中对应待加固函数的函数逻辑进行编译处理,得到目标二进制代码。
例如,编译处理(Compilation)可以是利用编译程序将待加固函数的函数逻辑转化为目标程序(即目标二进制代码)的过程,也即编译处理就是将高级语言(即待加固函数的函数逻辑)转化为计算机可识别的二进制语言(即目标二进制代码)的过程。
在一些实施例中,参见图3C,图3C是本申请实施例提供的代码加固方法的一个可选的流程示意图,图3C示出的步骤103可以通过步骤1031至步骤1033实现,下面分别说明。
在步骤1031中,对第二语法树进行逻辑遍历处理,得到待加固函数的函数逻辑。
例如,逻辑遍历处理可以是对第二语法树中的每一节点的节点逻辑进行遍历。也即,逻辑遍历处理可以是在第二语法树中沿着某条搜索路线(即起始节点至终止节点的路径),依次对第二语法树中的该条搜索路径中的每个节点均做一次且仅做一次访问,访问节点所做的操作可以是获取该节点的节点逻辑。
在步骤1032中,基于待加固函数的函数逻辑调用编译器进行编译处理,得到与待加固函数对应的中间代码。
在一些实施例中,编译器就是将一种语言(通常为高级语言,即便于编写、阅读交流、维护的语言)翻译为另一种语言(通常为低级语言,即机器语言)的程序。
例如,通过编译器将待加固函数的函数逻辑翻译为与待加固函数对应的中间代码。
在步骤1033中,基于中间代码调用编译器进行转换处理,得到目标二进制代码。
例如,通过编译器将中间代码翻译为目标二进制代码。
如此,通过对第二语法树中对应待加固函数的函数逻辑进行编译处理,所得到的目标二进制代码相比于源代码而言,代码逻辑保持不变,但是代码复杂符显著提高,有效加强了代码加固效果,使得代码逻辑破解难度显著提高。
参见图3E,在步骤102之后,在步骤103之前,通过执行步骤106至步骤108对第二语法树中的节点进行验证,下面分别说明。
在步骤106中,按照第二语法树的层级顺序,通过编译器对第二语法树中不同类型的节点进行验证处理,得到第二语法树中的错误类型节点。
在一些实施例中,编译器对第二语法树中不同类型的节点进行验证处理,可以是通过编译器对第二语法树中的节点数据所定义和使用的类型进行验证,验证处理可以按照以下维度对第二语法树中不同类型的节点进行验证:常量、类型和函数名及类型;变量的赋值和初始化;函数和闭包的主体;哈希键值正确的类型;外部声明等。
例如,对第二语法树中不同类型的节点进行验证处理,可以是验证节点数据在执行期间的取值范围是否在合法取值范围之内(比如,当所定义的整型变量出现小数类型时,则验证处理的结果判断该节点数据对应的节点为第二语法树中错误类型节点)。
在一些实施例中,编译器分析的对象可以是第二语法树中不同类型的节点数据,即对第二语法树中不同类型的节点数据进行验证,当第二语法树中节点的节点数据验证为错误类型时,将该节点确定为第二语法树中的错误类型节点。
例如,第二语法树的层级可以包括第二语法树的叶子节点所在的层级、第二语法树的根节点所在的层级等等。按照第二语法树的层级顺序可以是按照第二语法树从叶子节点所在的层级至根节点所在的层级的顺序,也可以是按照第二语法树从根节点所在的层级至叶子节点所在的层级的顺序。
在一些实施例中,上述步骤106可以通过以下方式实现:按照第二语法树从叶子节点所在的层级至根节点所在的层级的顺序,通过编译器对第二语法树中不同类型的节点进行验证处理,得到第二语法树中的错误类型节点;或者,按照第二语法树从根节点所在的层级至叶子节点所在的层级的顺序通过编译器对第二语法树中不同类型的节点进行验证处理,得到第二语法树中的错误类型节点。
在步骤107中,将第二语法树中的类型错误节点进行展开改写处理,得到与类型错误节点对应的正确类型节点。
例如,当第二语法树中的类型错误节点为第二节点时,将第二节点中的节点数据进行改写处理,得到第二节点中类型正确的节点数据,将第二节点中类型正确的节点数据替换第二节点中类型错误的节点数据,得到与类型错误节点对应的正确类型节点。
在步骤108中,将正确类型节点替换第二语法树中对应的错误类型节点。
如此,由于正确类型节点中包含类型正确的节点数据,进而将正确类型节点替换第二语法树中对应的错误类型节点,从而对第二语法树中的每一节点进行验证的同时,更正了第二语法树中的错误节点信息,进而保证了第二语法树中每一节点的节点数据的准确性。
在步骤104中,根据目标二进制代码和运行时,生成与待加固函数对应的可执行二进制代码。
在一些实施例中,上述步骤104可以通过以下方式实现:基于运行时执行目标二进制代码对应的字节码,生成与待加固函数对应的可执行二进制代码。
在一些实施例中,由于目标二进制代码是不具备可执行条件的,可以根据目标二进制代码和运行时,生成与待加固函数对应的可执行二进制代码,可执行二进制代码仍然保留了目标二进制代码原有的逻辑功能,且使得目标二进制代码得以具备可执行条件。
参见图3C,图3C是本申请实施例提供的代码加固方法的一个可选的流程示意图,图3C示出的步骤104可以通过步骤1041至步骤1043实现。
在步骤1041中,将目标二进制代码转换为与目标二进制代码对应的字节码,其中,字节码为目标二进制代码的文本抽象描述。
在一些实施例中,字节码是一种包含执行程序,由一序列op代码/数据对组成的二进制文件,字节码是一种中间码,比目标二进制代码更加抽象。在计算机中的数据通常只有0和1两种表示形式,一个0或者1占一个“位”,而系统中规定8位为一个字节,用来表示常用的256个字母、符号、控制标记,其中,一位用来进行数据校验,其他七个位用来记录数据。
在步骤1042中,将字节码中的字符依次存储至运行时的堆栈数据结构中。
在一些实施例中,上述步骤1042可以通过以下方式实现:将字节码中的字符按照从栈顶到栈底的顺序依次存储至运行时的堆栈数据结构中,或者,将字节码中的字符按照从栈底到栈顶的顺序依次存储至运行时的堆栈数据结构中。
例如,参见图4A,图4A是本申请实施例提供的代码加固方法的原理示意图。将字节码(load a、load b、add、push 1、add、store c)依次存储至运行时的堆栈数据结构中(即图4A所示出的堆栈),在图4A所示出的堆栈中,从栈顶到栈底依次存储有load、a、load、b、add、push、1、add、store、c。
在一些实施例中,上述步骤1042可以通过以下方式实现:从字节码中裁剪掉非指令字符;将字节码中剩余的指令字符依次存储至运行时的堆栈数据结构中。
由于字节码中的字符包括指令字符和非指令字符,将字节码中的非指令字符裁剪后,字节码中剩余的字符则为指令字符。
作为示例,参见图4B,图4B是本申请实施例提供的代码加固方法的原理示意图。字节码中的非指令字符可以为a、b、1、c,字节码中的指令字符可以为load、add、push、store。将字节码中的非指令字符(a、b、1、c)裁剪后,将字节码中剩余的指令字符(load、add、push、store)依次存储至运行时的堆栈数据结构中。
在步骤1043中,基于存储后的堆栈数据结构执行字节码中的字符,得到与待加固函数对应的可执行二进制代码。
在一些实施例中,上述步骤1043可以通过以下方式实现:基于存储后的堆栈数据结构执行字节码中的指令字符和非指令字符,得到与待加固函数对应的可执行二进制代码,或者,基于存储后的堆栈数据结构执行字节码中的指令字符,得到与待加固函数对应的可执行二进制代码。
作为示例,参见图4A,基于存储后的堆栈数据结构执行字节码中的字符(load、a、load、b、add、push、1、add、store、c),得到与待加固函数对应的可执行二进制代码。
在一些实施例中,上述步骤1043可以通过以下方式实现:基于存储有指令字符的堆栈数据结构执行字节码中的指令字符,得到与指令字符对应的可执行二进制代码;基于与指令字符对应的可执行二进制代码和剩余二进制代码,生成与待加固函数对应的可执行二进制代码,其中,剩余二进制代码为目标二进制代码中除指令字符对应的二进制代码以外的二进制代码。
在一些实施例中,目标二进制代码中包括与指令字符对应的二进制代码和与非指令字符对应的二进制代码,也即剩余二进制代码为目标二进制代码中与非指令字符对应的二进制代码。将指令字符转换为与指令字符对应的可执行二进制代码后,基于与指令字符对应的可执行二进制代码和与非指令字符对应的二进制代码,生成与待加固函数对应的可执行二进制代码。
作为示例,参见图4B,基于存储有指令字符的堆栈数据结构执行字节码中的指令字符(load、load、add、push、add、store),得到与指令字符(load、load、add、push、add、store)对应的可执行二进制代码。
如此,通过将运行时的堆栈数据结构中的非指令字符进行裁剪,可以在保证能够正常生成与待加固函数对应的可执行二进制代码的同时,有效减少运行时的堆栈数据结构的体积,提高运行时的执行效率。
在步骤105中,将与待加固函数对应的可执行二进制代码替换源代码中的待加固函数,得到加固代码。
在一些实施例中,将与待加固函数对应的可执行二进制代码替换源代码中的待加固函数对应的代码,得到加固代码,其中,待加固函数对应的可执行二进制代码的复杂度大于源代码中的待加固函数对应的代码,待加固函数对应的可执行二进制代码与源代码中的待加固函数对应的代码具有相同的逻辑功能。
如此,由于与待加固函数对应的可执行二进制代码的复杂度远大于源代码中的待加固函数的代码,通过将待加固函数对应的可执行二进制代码替换源代码中的待加固函数,从而在保证了源代码的逻辑功能不变的情况下,有效增加了源代码的复杂度,从而实现了对源代码的加固。
参见图3D,在步骤105之后,通过执行步骤112至步骤113对加固代码进行更新。
在步骤112中,基于加固代码调用混淆工具软件进行混淆处理,得到混淆后的加固代码。
在一些实施例中,混淆处理可以是将加固代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。重写加固代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。
例如,混淆工具软件可以对加固代码进行混淆处理,混淆处理可以有效降低加固代码的可读性,有效防止被追踪出函数逻辑。
在步骤113中,基于混淆后的加固代码调用压缩工具软件进行压缩处理,得到更新的加固代码。
例如,压缩工具软件可以对加固代码进行压缩处理,压缩处理可以实现对混淆后的加固代码压缩的同时,实现对加固代码的进一步混淆,可以更进一步的降低加固代码的可读性,有效防止被追踪出函数逻辑。
如此,通过对源代码的第一语法树进行解析,得到源代码中的待加固函数对应的第二语法树,通过对源代码中的待加固函数对应的第二语法树进行处理,生成与待加固函数对应的可执行二进制代码,通过可执行二进制代码替换源代码中的待加固函数,从而实现了对源代码中待加固函数的加固,由于是以源代码中的待加固函数为粒度进行的加固,破解者在破解时,也无法得知源代码中待加固函数的具体信息,因此无法对源代码中的待加固函数进行破解,更加无法对整个源代码进行破解,从而能够实现对源代码的更有效加固,提高源代码的安全性。
下面,将说明本申请实施例在一个能够嵌入至任意APP中的小程序的应用场景中的示例性应用。
在能够嵌入至任意APP中的小程序的应用场景下,用户在具有浏览器环境的任意APP中,下载用于加固的小程序,并在小程序界面中选择并上传待加固的源代码。小程序响应于用户相应的触发操作,调用终端本地或服务器的资源,将源代码中的待加固函数进行加固,得到加固代码。
在一些实施例中,参见图4A,以JS源码(即上文所述的源代码){c=a+b+1}为例,根据解析后的语法树逻辑编译生成的二进制代码,并将二进制代码转换为字节码,其中,字节码是编译后的二进制代码的文本抽象描述。即JS源码{c=a+b+1}转换为字节码{load a;load b;add;push 1;add;store c}。运行自定义二进制代码需要自定义的虚拟机运行时(vPC)执行,该运行时是一个基于堆栈的代码虚拟机,虚拟机的输入是一个二进制数组,该二进制数组提供虚拟机运行的所有信息,虚拟机的内存为一个二进制数组,内存中主要包括堆栈(vStack)、常量表(vData)等,虚拟机指令是操作数(即上文所述的指令字符)(如add、load)集合,操作数绑定的函数逻辑可以操作堆栈,通过操作堆栈执行源代码逻辑。
参见图4A,堆栈中的指令顺序是可以随机变换的,虚拟机指令集是一个通过指令描述符索引的字典,其中每个操作都被抽象成一个操作数,通过变换指令集的字典的索引值,可以改变每个指令描述符对应的操作数,操作数对应的堆栈操作函数不变(如,add在第一次编译时操作数值等于1,第二次编译时操作数值等于2)。
参见图4B,虚拟机运行时(vPC)可以根据代码逻辑进行裁剪,裁剪过程是指编译过程中统计使用到的指令,将其记录下来,在生成运行时的过程中,从运行时模板中选取用到的指令代码逻辑(如load、add、push、store),将其打包到运行时中,这样可以减少虚拟机运行时(vPC)的体积,提高执行效率,不完整的虚拟机运行时也可增加分析难度。
接着,提供图4A中所示出的运行时原理的伪代码如下所示:
Figure BDA0003275481490000141
在一些实施例中,在一个小程序应用场景中,参见图4C,图4C是本申请实施例提供的代码加固方法的原理示意图。在图4C中,小程序名称为Test,版本号为1.1。
第一步:接收上传的代码包(即上文所述的源代码),可以在将代码包文件拖至上传代码包的相应操作区域,或者在上传代码包的相应操作区域“点击上传”,在将代码包上传后,响应于点击“下一步”控件的操作,即上传代码包成功,其中,代码包名称为“tttt.zip”,显示界面同步跳转到显示第二步“确认加固”的显示界面。
在一些实施例中,参见图4D,图4D是本申请实施例提供的代码加固方法的原理示意图。上传成功的代码包的基本信息为:名称:Test,版本号:1.1,创建时间:2021-04-0618:42:13。
第二步:对上传成功的代码包进行加固,响应于用户点击“确认加固”控件,对上传成功的代码包进行加固。
在一些实施例中,参见图4I,图4I是本申请实施例提供的代码加固方法的原理示意图。接着,本申请实施例提供的代码加固方法中如图4I所示出的代码,通过“确认加固”控件实现对上传的代码包进行一键加固,通过执行一条命令即可完成对代码的加固,启动平台命令行终端,输入加固可执行程序命令,传入需要加固的文件及目录,命令行本地执行的伪代码如下所示:
选择;
版本V;
代码转换前后的对应位置信息source-map-base-url<string>;
开启生成source-map-output<path>;
输出版本号;
将基本url设置为源地图导入url中;
将url的源映射导入http://demo.com/demo.js.map中;
将输出源映射设置为文件路径;
输出obfed代码的文件;
保护级别为0-5;
将源代码转换为ES2015;
过滤筛选无法加固的代码;
创建新目录并将加固代码复制到新目录;
进行反调试;
请求函数文件名;
功能保护级别为0-5;
解除锁定约束文件;
显示帮助命令。
在一些实施例中,参见图4E,图4E是本申请实施例提供的代码加固方法的原理示意图。对代码包进行加固后,在人机交互界面中显示“小程序已加固,可有效防盗版、反破解”的提示消息,提示用户代码包已加固完成,便于用户进一步下载加固后的代码包。
第三步:下载加固成功后的代码包,响应于用户点击“下载加固包”控件,实现对加固成功的代码包的下载。并且可以响应于用户点击“查看加固列表”控件,在人机交互界面中显示相应的加固列表。
在人机交互界面中的相应区域,显示不同维度的加固方式,便于用户查看加固过程。例如,参见图4E,在人机交互界面的相应区域显示“维度,安全性”,提示用户加固过程中安全性维度的加固过程。例如,在加固前,代码包在“代码压缩”、“代码混淆”、“函数加密”、“字符串加密”、“变量名加密”、“动态防调试”、“控制流平坦化”、“花指令注入”等方面均存在较大安全隐患。在加固后,加固后的代码包“代码压缩”、“代码混淆”“函数加密”、“字符串加密”、“变量名加密”、“动态防调试”、“控制流平坦化”、“花指令注入”等方面的安全隐患已消除。
例如,参见图4E,在人机交互界面中所显示相应的加固列表可以是在“我的报告”子窗口下显示的加固列表,其中,加固列表中的内容可以包括“手游测试报告”、“游戏安全报告”、“应用安全报告”、“H5游戏性能测试报告”、“小程序安全加固报告”、“小程序安全扫描报告”、“IOS预审报告”、“专家测试预约”等。
在一些实施例中,在一个小程序应用场景中,参见图4F至图4H,图4F至图4H是本申请实施例提供的代码加固方法的原理示意图。如图4F所示出的源代码经过代码初加固后,得到如图4G所示出的中间加固代码,中间加固代码的复杂度明显大于加固前的源代码,如图4G所示出的中间加固代码的执行结果与如图4F所示出的加固前的源代码的执行结果完全相同,但是代码可读性完全改变,经过代码初加固后,中间加固代码的可读性明显低于初加固前的源代码,使得中间加固代码更不容易被破解。如图4G所示出的中间加固代码已经无法看到如图4F所示出的源代码中的变量(lsw、x、y等)、静态数据(0xFFFF、16),除还保留一些相关的运算操作(+、-、>>、&)外,整个中间加固代码已经完全看不出与源代码有任何关联。如图4H所示出的加固后最终得到的加固代码已经完全不具备可读性,但是仍保留了源代码的基本逻辑功能。从而能够实现对源代码的更有效加固,提高源代码的安全性。
在一些实施例中,参见图4J,图4J是本申请实施例提供的代码加固方法的原理示意图。
在解析阶段(参见图4J解析),从源代码中确定待加固函数,可以通过标签确定相应的标签函数,或者在源代码中随机选取相应的待加固函数。在寻找到相应的待加固函数后,通过对源代码的语法树(即上文所述的第一语法树)进行语法树解析,确定与待加固函数对应的语法树(即上文所述的第二语法树)。
在编译阶段(参见图4J编译),对于待加固函数对应的语法树(即上文所述的第二语法树)进行语法树逻辑遍历(即上文所述的逻辑遍历处理),得到待加固函数的函数逻辑。将待加固函数的函数逻辑进行编译转换,得到二进制代码(即上文所述的目标二进制代码)。并生成动态运行时(即上文所述的运行时),并将运行时和目标二进制代码打包,生成可执行二进制代码。
在连接阶段(参见图4J连接),将可执行二进制代码替换与待加固函数对应的语法树的根节点,生成加固代码。
在一些实施例中,参见图4K,图4K是本申请实施例提供的代码加固方法的原理示意图。
在步骤401中,对代码语法树进行分析(代码语法树分析)。
例如,代码语法树分析是解析代码语法树(即上文所述的语法树),该语法树可以被自定义编辑器解析、编辑。
在步骤402中,对分析后的代码语法树进行虚拟化加固处理,得到虚拟化加固处理后的代码语法树(虚拟化加固)。
例如,虚拟化加固是将解析后的语法树进行虚拟化编译,编译后可生成虚拟机运行时二进制代码,将生成的二进制代码(即上文所述的目标二进制代码)与虚拟机运行时(即上文所述的运行时)一起打包生成新的语法树逻辑,并替换原逻辑。
在步骤403中,对虚拟化加固处理后的代码语法树进行代码膨胀处理,得到膨胀后的代码语法树(代码膨胀)。
例如,代码膨胀是在解析后的语法树逻辑中随机插入膨胀逻辑,膨胀逻辑为一个不会执行的判断逻辑,该判断逻辑会生成与原语法树相似的代码逻辑。
在步骤404中,对膨胀后的代码语法树进行代码平展化处理,得到平展化的代码语法树(代码平展化)。
例如,代码平展化是对语法树进行裁剪变换,并插入控制裁剪变换的语法树逻辑。
在步骤405中,对平展化的代码语法树进行函数加密处理,得到加密后的代码语法树(函数加密)。
例如,函数加密可以是对待加固函数采用加密算法进行加密。
在步骤406中,将加密后的代码语法树中的每一节点的字符串进行字符串加密,得到字符串加密后的代码语法树(字符串加密)。
例如,字符串加密是对语法树结构中的字符串部分进行加密变换处理的过程,其中,进行加密变换处理的加密算法可以随机选取。
在步骤407中,对字符串加密后的代码语法树编译成与源代码相同代码类型的代码,对编译后的代码进行代码混淆与压缩(代码混淆与压缩)。
例如,代码混淆与压缩可以是在语法树处理完毕后重新编译成与源代码相同代码类型的代码,可以使用相应的压缩工具对处理完毕后的代码进行混淆与压缩。
下面继续说明本申请实施例提供的代码加固装置455的实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器440的代码加固装置455中的软件模块可以包括:确定模块,用于确定源代码的第一语法树,其中,第一语法树用于表征源代码的语法结构;解析模块,用于对第一语法树进行解析,得到与源代码中的待加固函数对应的第二语法树,其中,第二语法树为第一语法树的子树结构;编译模块,用于对第二语法树中对应待加固函数的函数逻辑进行编译处理,得到目标二进制代码;生成模块,用于根据目标二进制代码和运行时,生成与待加固函数对应的可执行二进制代码;替换模块,用于将与待加固函数对应的可执行二进制代码替换源代码中的待加固函数,得到加固代码。
在一些实施例中,生成模块,用于将目标二进制代码转换为与目标二进制代码对应的字节码,其中,字节码为目标二进制代码的文本抽象描述;基于字节码调用运行时执行以下处理:将字节码中的字符依次存储至运行时的堆栈数据结构中;基于存储后的堆栈数据结构执行字节码中的字符,得到与待加固函数对应的可执行二进制代码。
在一些实施例中,生成模块,还用于从字节码中裁剪掉非指令字符;将字节码中剩余的指令字符依次存储至运行时的堆栈数据结构中;基于存储有指令字符的堆栈数据结构执行字节码中的指令字符,得到与指令字符对应的可执行二进制代码;基于与指令字符对应的可执行二进制代码和剩余二进制代码,生成与待加固函数对应的可执行二进制代码,其中,剩余二进制代码为目标二进制代码中除指令字符对应的二进制代码以外的二进制代码。
在一些实施例中,确定模块,用于基于源代码的字符序列进行词法解析,得到源代码的标记序列;基于源代码的标记序列进行语法解析,得到源代码的第一语法树。
在一些实施例中,解析模块,用于基于待加固函数的字符序列进行词法解析,得到待加固函数的标记序列;对第一语法树进行解析,得到第一语法树中每个节点的字符;将标记序列的起始字符与第一语法树每个节点的字符进行匹配,得到第一语法树中与标记序列的起始字符匹配的节点;将第一语法树中与标记序列的起始字符匹配的节点确定为第二语法树的根节点;将第一语法树中与第二语法树的根节点对应的子树结构,确定为与源代码中的待加固函数对应的第二语法树。
在一些实施例中,编译模块,用于对第二语法树进行逻辑遍历处理,得到待加固函数的函数逻辑;基于待加固函数的函数逻辑调用编译器进行编译处理,得到与待加固函数对应的中间代码;基于中间代码调用编译器进行转换处理,得到目标二进制代码。
在一些实施例中,代码加固装置还包括:验证模块,用于按照第二语法树的层级顺序,通过编译器对第二语法树中不同类型的节点进行验证处理,得到第二语法树中的错误类型节点;将第二语法树中的类型错误节点进行展开改写处理,得到与类型错误节点对应的正确类型节点;将正确类型节点替换第二语法树中对应的错误类型节点。
在一些实施例中,代码加固装置还包括:膨胀模块,用于在第二语法树中的待加固函数的函数逻辑中随机插入膨胀逻辑,得到膨胀处理后的第二语法树,其中,膨胀逻辑用于对第二语法树进行膨胀处理,且保持待加固函数的原有的函数逻辑;裁剪变换模块,用于在膨胀处理后的第二语法树中随机插入裁剪变换逻辑,得到裁剪变换后的第二语法树,其中,裁剪变换逻辑用于对第二语法树进行代码平展化处理;加密变换模块,用于对裁剪变换后的第二语法树中的每个节点的字符进行加密变换处理,得到加密后的第二语法树,其中,加密后的第二语法树用于对待加固函数的函数逻辑进行编译处理。
在一些实施例中,代码加固装置还包括:混淆压缩模块,用于基于加固代码调用混淆工具软件进行混淆处理,得到混淆后的加固代码;基于混淆后的加固代码调用压缩工具软件进行压缩处理,得到更新的加固代码。
本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本申请实施例上述的代码加固方法。
本申请实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本申请实施例提供的代码加固方法,例如,如图3A示出的代码加固方法。
在一些实施例中,计算机可读存储介质可以是FRAM、ROM、PROM、EPROM、EEPROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(HTML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
综上,通过本申请实施例具有以下有益效果:
(1)通过对源代码的第一语法树进行解析,得到源代码中的待加固函数对应的第二语法树,通过对源代码中的待加固函数对应的第二语法树进行处理,生成与待加固函数对应的可执行二进制代码,通过可执行二进制代码替换源代码中的待加固函数,从而实现了对源代码中待加固函数的加固,由于是以源代码中的待加固函数为粒度进行的加固,破解者在破解时,也无法得知源代码中待加固函数的具体信息,因此无法对源代码中的待加固函数进行破解,更加无法对整个源代码进行破解,从而能够实现对源代码的更有效加固,提高源代码的安全性。
(2)通过在第二语法树中随机插入裁剪变化逻辑,使得的裁剪变换后的第二语法树中每个节点的节点数据更加平展化,有效增加了第二语法树的语法复杂度,使得裁剪变换后的第二语法树更加不易被破解。
(3)加密变换处理所选取的加密算法可以随机选取,通过随机选取的加密算法对裁剪变换后的第二语法树的每个节点的字符进行加密变换,可以有效保证加密变换的安全性。加密后的第二语法树较之于裁剪变换后的第二语法树,安全性更高,使得加密后的第二语法树更加不容易被破解。
(4)通过对源代码的字符序列进行词法解析,得到源代码的标记序列,再将源代码的标记序列进行语法解析,得到源代码的第一语法树。由于源代码的第一语法树不依赖于具体的文法,不依赖于源代码语言的具体细节,将源代码转换成与源代码对应的第一语法树之后,可以对第一语法树进行下一步操作,有效减少了源代码中冗余的信息,避免了在进行进一步操作时造成不利影响。
(5)通过对第一语法树进行解析,得到与源代码中的待加固函数对应的第二语法树,便于通过对第二语法树进行操作从而对待加固函数进行加固。由于第二语法树是第一语法树的子树结构,对第二语法树进行操作相比于直接对第一语法树进行操作,可以有效减少代码加固过程的运行时长,大幅缩短计算量。
(6)通过对第二语法树中对应待加固函数的函数逻辑进行编译处理,所得到的目标二进制代码相比于源代码而言,代码逻辑保持不变,但是代码复杂符显著提高,有效加强了代码加固效果,使得代码逻辑破解难度显著提高。
(7)由于正确类型节点中包含类型正确的节点数据,进而将正确类型节点替换第二语法树中对应的错误类型节点,从而对第二语法树中的每一节点进行验证的同时,更正了第二语法树中的错误节点信息,进而保证了第二语法树中每一节点的节点数据的准确性。
(8)通过将运行时的堆栈数据结构中的非指令字符进行裁剪,可以在保证能够正常生成与待加固函数对应的可执行二进制代码的同时,有效减少运行时的堆栈数据结构的体积,提高运行时的执行效率。
(9)由于与待加固函数对应的可执行二进制代码的复杂度远大于源代码中的待加固函数的代码,通过将待加固函数对应的可执行二进制代码替换源代码中的待加固函数,从而在保证了源代码的逻辑功能不变的情况下,有效增加了源代码的复杂度,从而实现了对源代码的加固。
(10)压缩工具软件可以对加固代码进行压缩处理,压缩处理可以实现对混淆后的加固代码压缩的同时,实现对加固代码的进一步混淆,可以更进一步的降低加固代码的可读性,有效防止被追踪出函数逻辑。
以上所述,仅为本申请的实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本申请的保护范围之内。

Claims (10)

1.一种代码加固方法,其特征在于,所述方法包括:
确定源代码的第一语法树,其中,所述第一语法树用于表征所述源代码的语法结构;
对所述第一语法树进行解析,得到与所述源代码中的待加固函数对应的第二语法树,其中,所述第二语法树为所述第一语法树的子树结构;
对所述第二语法树中对应所述待加固函数的函数逻辑进行编译处理,得到目标二进制代码;
根据所述目标二进制代码和运行时,生成与所述待加固函数对应的可执行二进制代码;
将与所述待加固函数对应的可执行二进制代码替换所述源代码中的所述待加固函数,得到加固代码。
2.根据权利要求1所述的方法,其特征在于,所述根据所述目标二进制代码和运行时,生成与所述待加固函数对应的可执行二进制代码,包括:
将所述目标二进制代码转换为与所述目标二进制代码对应的字节码,其中,所述字节码为所述目标二进制代码的文本抽象描述;
基于所述字节码调用所述运行时执行以下处理:将所述字节码中的字符依次存储至所述运行时的堆栈数据结构中;
基于存储后的所述堆栈数据结构执行所述字节码中的字符,得到与所述待加固函数对应的可执行二进制代码。
3.根据权利要求2所述的方法,其特征在于,
所述字节码中的字符包括指令字符和非指令字符;
所述将所述字节码中的字符依次存储至所述运行时的堆栈数据结构中,包括:
从所述字节码中裁剪掉所述非指令字符;
将所述字节码中剩余的所述指令字符依次存储至所述运行时的所述堆栈数据结构中;
所述基于存储后的所述堆栈数据结构执行所述字节码中的字符,得到与所述待加固函数对应的可执行二进制代码,包括:
基于存储有所述指令字符的所述堆栈数据结构执行所述字节码中的指令字符,得到与所述指令字符对应的可执行二进制代码;
基于与所述指令字符对应的可执行二进制代码和剩余二进制代码,生成与所述待加固函数对应的可执行二进制代码,其中,所述剩余二进制代码为所述目标二进制代码中除所述指令字符对应的二进制代码以外的二进制代码。
4.根据权利要求1所述的方法,其特征在于,所述确定源代码的第一语法树,包括:
基于所述源代码的字符序列进行词法解析,得到所述源代码的标记序列;
基于所述源代码的标记序列进行语法解析,得到所述源代码的第一语法树。
5.根据权利要求1所述的方法,其特征在于,所述对所述第一语法树进行解析,得到与所述源代码中的待加固函数对应的第二语法树,包括:
基于所述待加固函数的字符序列进行词法解析,得到所述待加固函数的标记序列;
对所述第一语法树进行解析,得到所述第一语法树中每个节点的字符;
将所述标记序列的起始字符与所述第一语法树每个节点的字符进行匹配,得到所述第一语法树中与所述标记序列的起始字符匹配的节点;
将所述第一语法树中与所述标记序列的起始字符匹配的节点确定为所述第二语法树的根节点;
将所述第一语法树中与所述第二语法树的根节点对应的子树结构,确定为与所述源代码中的待加固函数对应的第二语法树。
6.根据权利要求1所述的方法,其特征在于,所述对所述第二语法树中对应所述待加固函数的函数逻辑进行编译处理,得到目标二进制代码,包括:
对所述第二语法树进行逻辑遍历处理,得到所述待加固函数的函数逻辑;
基于所述待加固函数的函数逻辑调用编译器进行编译处理,得到与所述待加固函数对应的中间代码;
基于所述中间代码调用所述编译器进行转换处理,得到所述目标二进制代码。
7.根据权利要求1所述的方法,其特征在于,所述对所述第二语法树中对应所述待加固函数的函数逻辑进行编译处理,得到目标二进制代码之前,所述方法还包括:
按照所述第二语法树的层级顺序,通过编译器对所述第二语法树中不同类型的节点进行验证处理,得到所述第二语法树中的错误类型节点;
将所述第二语法树中的类型错误节点进行展开改写处理,得到与所述类型错误节点对应的正确类型节点;
将所述正确类型节点替换所述第二语法树中对应的错误类型节点。
8.根据权利要求1所述的方法,其特征在于,所述对所述第一语法树进行解析,得到与所述源代码中的待加固函数对应的第二语法树之后,所述方法还包括:
在所述第二语法树中的所述待加固函数的函数逻辑中随机插入膨胀逻辑,得到膨胀处理后的第二语法树,其中,所述膨胀逻辑用于对所述第二语法树进行所述膨胀处理,且保持所述待加固函数的原有的函数逻辑;
在所述膨胀处理后的第二语法树中随机插入裁剪变换逻辑,得到裁剪变换后的第二语法树,其中,所述裁剪变换逻辑用于对所述第二语法树进行代码平展化处理;
对所述裁剪变换后的第二语法树中的每个节点的字符进行加密变换处理,得到加密后的第二语法树,其中,所述加密后的第二语法树用于对所述待加固函数的函数逻辑进行所述编译处理。
9.根据权利要求1所述的方法,其特征在于,所述将与所述待加固函数对应的所述可执行二进制代码替换所述源代码中的所述待加固函数,得到加固代码之后,所述方法还包括:
基于所述加固代码调用混淆工具软件进行混淆处理,得到混淆后的加固代码;
基于所述混淆后的加固代码调用压缩工具软件进行压缩处理,得到更新的加固代码。
10.一种代码加固装置,其特征在于,所述装置包括:
确定模块,用于确定源代码的第一语法树,其中,所述第一语法树用于表征所述源代码的语法结构;
解析模块,用于对所述第一语法树进行解析,得到与所述源代码中的待加固函数对应的第二语法树,其中,所述第二语法树为所述第一语法树的子树结构;
编译模块,用于对所述第二语法树中对应所述待加固函数的函数逻辑进行编译处理,得到目标二进制代码;
生成模块,用于根据所述目标二进制代码和运行时,生成与所述待加固函数对应的可执行二进制代码;
替换模块,用于将与所述待加固函数对应的可执行二进制代码替换所述源代码中的所述待加固函数,得到加固代码。
CN202111115647.5A 2021-09-23 2021-09-23 代码加固方法、装置 Active CN113704706B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111115647.5A CN113704706B (zh) 2021-09-23 2021-09-23 代码加固方法、装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111115647.5A CN113704706B (zh) 2021-09-23 2021-09-23 代码加固方法、装置

Publications (2)

Publication Number Publication Date
CN113704706A true CN113704706A (zh) 2021-11-26
CN113704706B CN113704706B (zh) 2023-10-27

Family

ID=78661630

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111115647.5A Active CN113704706B (zh) 2021-09-23 2021-09-23 代码加固方法、装置

Country Status (1)

Country Link
CN (1) CN113704706B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114625660A (zh) * 2022-03-22 2022-06-14 阿里巴巴(中国)有限公司 调试方法及装置
CN115048623A (zh) * 2022-04-01 2022-09-13 上海任意门科技有限公司 用于加密代码的方法、计算设备和存储介质
CN115129361A (zh) * 2022-08-26 2022-09-30 北京亿赛通科技发展有限责任公司 一种Java应用程序的安全加固方法及系统
CN118041534A (zh) * 2024-04-12 2024-05-14 浙江金网信息产业股份有限公司 一种源码动态算子加密方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20180088937A1 (en) * 2016-09-29 2018-03-29 Microsoft Technology Licensing, Llc Code refactoring mechanism for asynchronous code optimization using topological sorting
CN108345773A (zh) * 2017-07-27 2018-07-31 江苏通付盾信息安全技术有限公司 基于虚拟机的代码保护方法及装置、电子设备、存储介质
CN109598107A (zh) * 2018-11-20 2019-04-09 江苏通付盾信息安全技术有限公司 一种基于应用安装包文件的代码转换方法及装置
CN110187885A (zh) * 2019-06-10 2019-08-30 合肥本源量子计算科技有限责任公司 一种量子程序编译的中间代码生成方法及装置
CN111767058A (zh) * 2020-06-30 2020-10-13 上海商汤智能科技有限公司 程序编译方法及装置、电子设备和存储介质

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20180088937A1 (en) * 2016-09-29 2018-03-29 Microsoft Technology Licensing, Llc Code refactoring mechanism for asynchronous code optimization using topological sorting
CN108345773A (zh) * 2017-07-27 2018-07-31 江苏通付盾信息安全技术有限公司 基于虚拟机的代码保护方法及装置、电子设备、存储介质
CN109598107A (zh) * 2018-11-20 2019-04-09 江苏通付盾信息安全技术有限公司 一种基于应用安装包文件的代码转换方法及装置
CN110187885A (zh) * 2019-06-10 2019-08-30 合肥本源量子计算科技有限责任公司 一种量子程序编译的中间代码生成方法及装置
CN111767058A (zh) * 2020-06-30 2020-10-13 上海商汤智能科技有限公司 程序编译方法及装置、电子设备和存储介质

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114625660A (zh) * 2022-03-22 2022-06-14 阿里巴巴(中国)有限公司 调试方法及装置
CN115048623A (zh) * 2022-04-01 2022-09-13 上海任意门科技有限公司 用于加密代码的方法、计算设备和存储介质
CN115129361A (zh) * 2022-08-26 2022-09-30 北京亿赛通科技发展有限责任公司 一种Java应用程序的安全加固方法及系统
CN115129361B (zh) * 2022-08-26 2022-12-30 北京亿赛通科技发展有限责任公司 一种Java应用程序的安全加固方法及系统
CN118041534A (zh) * 2024-04-12 2024-05-14 浙江金网信息产业股份有限公司 一种源码动态算子加密方法

Also Published As

Publication number Publication date
CN113704706B (zh) 2023-10-27

Similar Documents

Publication Publication Date Title
CN113704706B (zh) 代码加固方法、装置
KR101098718B1 (ko) 재사용 가능한 코드 세그먼트들을 생성 및 재사용하는 컴퓨터화된 방법 및 컴퓨터 구현 시스템, 및 컴퓨터 판독 가능 저장 매체
CN112052006B (zh) 一种软件代码编译方法及系统
TWI536263B (zh) 將作業系統之原始應用程式介面投射至其它程式語言
US20040111702A1 (en) Method and apparatus for visual programming
CN107924326A (zh) 对经更新的类型的迁移方法进行覆盖
CN109948308A (zh) 代码安全保护方法、装置、电子设备和计算机可读存储介质
CN110309631B (zh) 一种编程语言结构混淆处理方法、智能终端及存储介质
CN111880777A (zh) 程序信息下发方法、装置、电子设备
CN111694613A (zh) 应用程序模块间的解耦方法、电子装置及存储介质
Price C# 10 and. NET 6–Modern Cross-Platform Development: Build apps, websites, and services with ASP. NET Core 6, Blazor, and EF Core 6 using Visual Studio 2022 and Visual Studio Code
CN113721928B (zh) 一种基于二进制分析的动态库裁剪方法
CN113849781B (zh) Go语言源代码混淆方法、系统、终端及存储介质
Olsson PHP 7 Quick Scripting Reference
CN116235174A (zh) 用于执行加密算法的设备和方法
CN112306463A (zh) 基于POJO的mybatis生成方法、系统、存储介质及设备
CN114924771A (zh) 非覆盖更新代码方法、装置、设备及介质
CN114398912A (zh) 语言处理方法、装置、设备及存储介质
CN114816364A (zh) 基于Swagger动态生成范本文件的方法、装置及应用
Siemer Exploring the apache Jena framework
Bangert et al. Nail: A practical interface generator for data formats
Betz Xlisp: an object-oriented lisp
Schröpfer et al. A Generic Projectional Editor for EMF Models.
CN113760360A (zh) 一种文件生成方法、装置、设备及存储介质
Kramer et al. Reflection in attribute grammars

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