CN117828556A - 一种代码处理方法、装置、电子设备及可读存储介质 - Google Patents

一种代码处理方法、装置、电子设备及可读存储介质 Download PDF

Info

Publication number
CN117828556A
CN117828556A CN202311641497.0A CN202311641497A CN117828556A CN 117828556 A CN117828556 A CN 117828556A CN 202311641497 A CN202311641497 A CN 202311641497A CN 117828556 A CN117828556 A CN 117828556A
Authority
CN
China
Prior art keywords
code
codes
file
byte
confusion
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202311641497.0A
Other languages
English (en)
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.)
China Telecom Corp Ltd
Original Assignee
China Telecom Corp 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 China Telecom Corp Ltd filed Critical China Telecom Corp Ltd
Priority to CN202311641497.0A priority Critical patent/CN117828556A/zh
Publication of CN117828556A publication Critical patent/CN117828556A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明实施例提供了一种代码处理方法、装置、电子设备及可读存储介质,所述方法包括:获取项目代码,对所述项目代码进行代码混淆,得到混淆后的代码;对所述混淆后的代码进行字节加密,得到字节码;基于所述字节码,生成二进制文件。通过在对代码混淆的基础上,利用字节加密、编译等手段进一步对项目代码进行加密处理,编译生成可直接运行的二进制文件,解决简单打包或混淆代码就直接进行业务部署,而导致核心代码成果泄漏的问题,以及经由前述一系列的加密处理,极大提升代码逆向难度,进而达到实现保护项目关键代码的目的。

Description

一种代码处理方法、装置、电子设备及可读存储介质
技术领域
本发明涉及通信技术领域,特别是涉及一种代码处理方法、一种代码处理装置、相应的一种电子设备以及相应的一种计算机可读存储介质。
背景技术
JavaScript语言诞生后,随着Ajax和Web技术的发展逐渐成为前端开发的重要语言,而自从V8引擎发布以来,诞生了Node.js,从此JavaScript不再仅限于前端开发,能够跟Java、PHP等后端语言一样进行后端开发,例如基于Node.js主流的开发框架可以包括Koa、Express、Egg等。
然而,当将JavaScript语言作为后端语言进行开发时,将会涉及较多核心的业务代码,即相比其作为前端时所涉及的简单事件处理更为核心且复杂,需要对后端Node.js的重要业务代码进行加密保护。
发明内容
鉴于上述问题,提出了本发明实施例以便提供一种克服上述问题或者至少部分地解决上述问题的一种代码处理方法、一种代码处理装置、相应的一种电子设备以及相应的一种计算机可读存储介质。
本发明实施例公开了一种代码处理方法,所述方法包括:
获取项目代码,对所述项目代码进行代码混淆,得到混淆后的代码;
对所述混淆后的代码进行字节加密,得到字节码;
基于所述字节码,生成二进制文件。
可选地,所述项目代码的文件包括脚本文件和前端视图类文件;所述对所述项目代码进行代码混淆,得到混淆后的代码,包括:
对所述脚本文件进行依赖解析得到所述脚本文件的依赖关系,基于所述依赖关系对所述脚本文件形成调用链;
对所述调用链和所述前端视图类文件进行打包,得到目标文件;
对所述目标文件进行代码混淆,得到混淆后的代码。
可选地,所述对所述目标文件进行代码混淆,得到混淆后的代码,包括:
对所述目标文件进行代码混淆,并在所述代码混淆的过程中对所述目标文件进行编码填充,得到混淆后的代码。
可选地,所述对所述目标文件进行代码混淆,包括:
对所述目标文件中的源代码执行如下的一项或者多项代码混淆操作:变量名混淆、函数名混淆、将源代码中的条件语句和循环结构进行转换以及压缩操作。
可选地,所述对所述目标文件进行编码填充,得到混淆后的代码,包括:
生成字符串,以及获取与所述目标文件中的源代码对应的第一字符串数组;
将所述字符串加入所述第一字符串数组,得到第二字符串数组;
对所述第二字符串数组进行编码,得到编码结果;
在所述编码结果中插入预设指定代码,得到混淆后的代码。
可选地,所述在所述编码结果中插入预设指定代码,得到混淆后的代码,包括:
在所述编码结果中,填充具备执行代码能力的空白函数,得到混淆后的代码;其中,所述空白函数的函数体用于插入任意所要执行的代码。
可选地,所述对所述混淆后的代码进行字节加密,得到字节码,包括:
基于所述混淆后的代码生成语法树;所述语法树用于指示所述混淆后的代码的句法结构的树形表示形式;
按照所述句法结构的树形表示形式对所述语法树进行编译,得到字节码。
可选地,所述二进制文件可执行;所述基于所述字节码,生成二进制文件,包括:
获取目标系统,根据所述目标系统将所述字节码生成二进制文件;
获取所述目标系统的运行环境,基于所述运行环境对所述二进制文件赋予相应的可执行权限,得到二进制可执行文件。
本发明实施例还公开了一种代码处理装置,所述装置包括:
代码混淆模块,用于获取项目代码,对所述项目代码进行代码混淆,得到混淆后的代码;
字节加密模块,用于对所述混淆后的代码进行字节加密,得到字节码;
文件生成模块,用于基于所述字节码,生成二进制文件。
可选地,所述项目代码的文件包括脚本文件和前端视图类文件;所述代码混淆模块包括:
代码混淆子模块,用于对所述脚本文件进行依赖解析得到所述脚本文件的依赖关系,基于所述依赖关系对所述脚本文件形成调用链;对所述调用链和所述前端视图类文件进行打包,得到目标文件;对所述目标文件进行代码混淆,得到混淆后的代码。
可选地,所述代码混淆子模块包括:
代码混淆单元,用于对所述目标文件进行代码混淆,并在所述代码混淆的过程中对所述目标文件进行编码填充,得到混淆后的代码。
可选地,所述代码混淆单元包括:
代码混淆子单元,用于对所述目标文件中的源代码执行如下的一项或者多项代码混淆操作:变量名混淆、函数名混淆、将源代码中的条件语句和循环结构进行转换以及压缩操作。
可选地,所述代码混淆单元包括:
编码填充子单元,用于生成字符串,以及获取与所述目标文件中的源代码对应的第一字符串数组;将所述字符串加入所述第一字符串数组,得到第二字符串数组;对所述第二字符串数组进行编码,得到编码结果;在所述编码结果中插入预设指定代码,得到混淆后的代码。所述在所述编码结果中插入预设指定代码,得到混淆后的代码的步骤可以包括:在所述编码结果中,填充具备执行代码能力的空白函数,得到混淆后的代码;其中,所述空白函数的函数体用于插入任意所要执行的代码。
可选地,所述字节加密模块包括:
字节编译子模块,用于基于所述混淆后的代码生成语法树;所述语法树用于指示所述混淆后的代码的句法结构的树形表示形式;按照所述句法结构的树形表示形式对所述语法树进行编译,得到字节码。
可选地,所述二进制文件可执行;所述文件生成模块包括:
文件编译子模块,用于获取目标系统,根据所述目标系统将所述字节码生成二进制文件;获取所述目标系统的运行环境,基于所述运行环境对所述二进制文件赋予相应的可执行权限,得到二进制可执行文件。
本发明实施例还公开了一种电子设备,包括:处理器、存储器及存储在所述存储器上并能够在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现任一项所述代码处理方法。
本发明实施例还公开了一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现任一项所述代码处理方法。
本发明实施例包括以下优点:
在本发明实施例中,可以对所获取的项目代码进行代码混淆得到混淆后的代码,以及对混淆后的代码进行字节加密,从而基于所得到的字节码生成得到二进制文件。通过在对代码混淆的基础上,利用字节加密、编译等手段进一步对项目代码进行加密处理,编译生成可直接运行的二进制文件,解决简单打包或简单混淆代码就直接进行业务部署,而导致核心代码成果泄漏的问题,以及经由前述一系列的加密处理,极大提升代码逆向难度,达到保护项目关键代码的目的。
附图说明
图1是本发明实施例提供的代码处理的改进部分示意图;
图2是本发明的一种代码处理方法实施例的步骤流程图;
图3是本发明的另一种代码处理方法实施例的步骤流程图;
图4是本发明实施例提供的代码处理的应用场景示意图;
图5是本发明的一种代码处理装置实施例的结构框图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
为便于本领域技术人员理解本发明,下面对本发明下述各实施例中涉及的术语或名词做出解释:
Express:是一个用于Node.js的快速、不拘一格、极简主义的Web框架。Express是一个最小且灵活的Node.jsWeb应用程序框架,主要用于为Web和移动应用程序提供一组强大的功能。
Node.js:指的是运行在服务端的JavaScript,是一个开源的、跨平台的JavaScript运行时环境,是一个事件驱动I/O服务端JavaScript环境,通常基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
JavaScript:简称JS,是一种解释型或即时编译型的脚本编程语言。
Ajax:Asynchronous Javascript And XML,即是异步的JavaScript和XML,为浏览器与服务器之间的一种异步通信方式。
Web:World Wide Web,全球广域网。
PHP:Hypertext Preprocessor,超文本预处理器。
require/import:分别是不同模块化规范下引入模块的语句。
Webpack:是一个用于现代JavaScript应用程序的静态模块打包工具。
字节码(ByteCode):是一种源码编译后的中间表示,与汇编有类似之处,但是运行于特定的语言虚拟机中,因此它其中包含的指令不是机器指令,而是平台无关的,由虚拟机实现的虚拟机指令。
V8:是用C++编写的开源高性能JavaScript和WebAssembly引擎,为JavaScript虚拟机的一种,用于模拟实际计算机各种功能来实现代码的编译和执行。
代码混淆:指的是将计算机程序的代码,转换成功能上等价,但是难于阅读和理解形式的行为。
Bytenode:为用于Node.js的极简字节码编译器,可将JavaScript代码真正编译为V8字节码,从而保护源代码。
Nodec:是一个开源、跨平台支持require特性将Node.js应用打包成单个可执行文件的工具。
由于JavaScript具有的易学、门槛低等特点,较为容易被用户掌握,因此,在进行后端开发时,大多选择基于Node.js的Express框架快速进行后端开发。其中,因为JavaScript一般大量用于前端开发,且其又是解释型语言,在代码加密处理的传统方式中,所进行的是对前端开发代码,即前端文件的,如图1所示,主要表现为将单个JS前端文件进行简单的格式混淆或者最小化压缩处理,该简单事件处理能够被轻易还原,不利于对后端Node.js的重要业务代码的加密保护;而当将JavaScript作为后端语言进行开发时,如果需要私有化部署项目,或者项目代码价值很高,仅仅通过前述的简单混淆代码或者简单压缩无法满足保护核心业务代码的需求。在对后端代码进行加密处理的现有技术中,如图1所示,具体表现为在将项目后端业务JS文件打包成单个JS文件之后,可以对该文件进行可逆加密,并在后续运行时进行对所加密的文件进行逆向解密,以运行解密后的业务JS文件,即其所进行可逆加密之后的文件需要进行解密之后才可以执行,且由于其所采用的是可逆加密,容易使得源代码可逆,代码逆向难度低,不利于保护核心业务代码。
本发明实施例通过对基于Express框架开发的项目代码进行加密,以确保关键代码的保护和商业价值,主要是基于代码混淆的原理,并结合V8字节码的特性,通过打包、编码填充/加密、编译等方法,实现对基于Node.js的Express框架开发出来的项目代码进行加密保护。具体的,可以在代码混淆的基础上,利用字节加密、编译等手段,进一步对Node.js代码进行加密处理,如图1所示,包括对Express框架的项目后端业务JS文件统一打包为单个JS文件,然后进行复杂混淆、加密为字节码以及编译生成单一可直接运行的二进制文件,抹除源码中携带的额外语义信息和格式,解决简单打包或简单混淆JavaScript代码就直接进行业务部署而导致核心代码成果泄漏的问题,其中在经过复杂混淆、编码填充以及字节编译后的源代码几乎不可逆,能够极大提升代码的逆向难度,保护核心业务代码,达到保护项目关键代码的目的,给为担心使用传统解释型语言js编码开发,导致核心业务价值泄漏而放弃对该代码进行使用的用户提供新的方法和思路,进而实现基于Express框架用Node.js开发的项目代码保护。进一步地,统一打包为单个可执行二进制文件,不仅能够极大的方便项目的部署和启动运行,在通过统一编译得到二进制文件以保护代码的前提下,由于二进制可直接执行,其还能够按需生成跨平台的可执行文件,经由跨平台二进制文件,极大降低跨平台的业务部署难度,实现业务的快速部署与启动运行。此外,还能够让大量本身熟练掌握javascript的开发人员,没有顾虑的使用Node.js进行后端开发,促进Node.js开发生态发展,以及大量功能优秀的npm三方库能够更好地被Node.js利用,加快项目的开发效率。
参照图2,示出了本发明的一种代码处理方法实施例的步骤流程图,具体可以包括如下步骤:
步骤201,获取项目代码;
所获取的项目代码可以指的是基于Express框架开发的项目代码,本发明实施例可以对基于Express框架开发的项目代码进行加密,确保关键代码的保护和商业价值。
其中,Express是一个Node.js的Web应用程序框架,在实际应用中,基于Express框架的项目代码可以通过脚手架快速生成,具体可以通过express-generator生成器直接生成Node.js代码实现,对于具体生成方式,本发明实施例不加以限制。
步骤202,对项目代码进行代码混淆,得到混淆后的代码;
在本发明的一种实施例中,在对项目代码进行加密处理的过程中,可以在代码混淆的基础上,进一步对Node.js代码进行其他处理手段的加密处理实现。
混淆,具体表现为对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义,通过进行代码混淆可以有效提升应用被逆向破解的难度。此时可以对项目代码进行代码混淆,以便后续对所得到的混淆后的代码进行其他的加密处理手段。
在本发明实施例中,所进行的代码混淆不同于传统方式的简单混淆,示例性地,传统方式的简单混淆可以表现为使用例如uglifyjs等常规工具对代码进行压缩混淆,而本发明实施例可以使用类似javascript-obfuscator的混淆器进行复杂混淆,其中,常规混淆工具仅仅是删除源代码中的空格、换行符、注释等内容,进一步减小代码的体积,javascript-obfuscator复杂混淆主要是在前述的基础上,将源代码中的变量名、函数名替换为随机生成的名字,使他人难以理解代码的实际功能,以及将源代码中的条件语句和循环结构进行转换,并插入字符、代码,使其看起来更加复杂,从而增加反向工程的难度。
在实际应用中,前述生成的项目代码,示例性地,其框架代码目录结构可以如下所示:
1.APP
1.1bin
1.1.1www
1.2.public
1.2.1images
1.2.2javascripts
1.2.3stylesheets
1.3routes
1.3.1index.is
1.3.2users.js
1.4views
1.4.1error.jade
1.4.2index.jade
1.4.3layout.jade
1.5app.js
1.6package.json
由上述可知,整个Express项目中可以包括不同模块、类别,且所生成的项目代码,其整个框架初始代码可以分为主应用文件、路由脚本、启动入口文件、配置文件、前端视图文件和前端公共文件,以及项目正常运行时会安装的各类第三方依赖库,即根据业务开发需求,项目中可以完善和添加各类业务.js文件和前端视图相关文件、资源。即所生成的项目代码的文件,通常可以包括脚本文件和前端视图类文件。
在具体实现中,出于将整个Express项目中不同模块、类别所有.js脚本文件打包为单个文件的思路,此时可以对项目代码的文件统一打包得到单个目标文件,以对单个目标文件进行代码混淆操作,使得后续能够仅使用单一文件实现业务部署,有利于项目发布上线和迁移。
其中,可以将项目代码包括前端视图、前端静态资源以及与各类业务.js文件统一打包为单个可执行文件方式,进一步保护代码,并实现项目快速部署、运行启动的便捷性。需要说明的是,本发明实施例在进行打包时,可以将项目代码包括前端视图、前端静态资源统一打包为单个可执行文件方式,即并不局限仅将前端代码文件或者仅将后端代码文件进行打包,其可以将原本不属于核心业务代码的文件也打包进二进制文件添加干扰,增加二进制文件的逆向分析难度,有利于对核心业务代码的保护。
步骤203,对混淆后的代码进行字节加密,得到字节码;
在对项目代码进行代码混淆之后,可以对所得到的混淆后的代码进行其他的加密处理手段,在本发明实施例中,可以对混淆后的代码进行字节加密,在实际应用中,主要是将混淆后的代码编译成字节码,此时因为字节码将会经历完整的编译流程,能够抹除源码中携带的额外语义信息。
步骤204,基于字节码,生成二进制文件。
在对所生成的项目代码进行相关加密处理,例如进行代码混淆以及字节加密的处理操作之后,此时可以将字节码编译打包成可以直接运行的二进制可执行文件。
在本发明的一种优选实施例中,所编译得到的二进制可执行文件,可以结合目标系统和相应的运行环境进行生成,以在通过统一编译得到二进制文件以保护代码的前提下,按需生成跨平台的可执行文件,经由跨平台二进制文件,极大降低跨平台的业务部署难度,实现业务的快速部署与启动运行。需要说明的是,对于具体的文件编译方式,本发明实施例不加以限制。
在本发明实施例中,可以对所获取的项目代码进行代码混淆得到混淆后的代码,以及对混淆后的代码进行字节加密,从而基于所得到的字节码生成得到二进制文件。通过在对代码混淆的基础上,利用字节加密、编译等手段进一步对项目代码进行加密处理,编译生成可直接运行的二进制文件,解决简单打包或混淆JavaScript代码就直接进行业务部署导致核心代码成果泄漏的问题,极大提升代码逆向难度,进而达到实现保护项目关键代码的目的。
参照图3,示出了本发明的另一种代码处理方法实施例的步骤流程图,具体可以包括如下步骤:
步骤301,对项目代码的文件统一打包得到单个目标文件;
项目代码,可以指的是基于Express框架开发的项目代码,本发明实施例可以对基于Express框架开发的项目代码进行加密,确保关键代码的保护和商业价值。
在对项目代码进行加密处理的过程中,由于整个Express项目可以包含不同模块、类别的.js脚本文件,示例性地,package.json是在安装项目依赖库时需要的配置文件,项目启动运行时并不需要,那么整个项目的所有代码文件可以分为两大类,一类是.js格式的脚本文件,一类是前端视图类文件,例如包括public公共目录下的前端.js脚本、CSS样式及图片等静态资源,此时可以对项目代码的文件统一打包得到单个目标文件,使得后续能够仅使用单一文件就能实现业务部署,有利于项目发布上线和迁移。
由上述可知,项目代码的文件可以包括脚本文件和前端视图类文件,此时可以将原本不属于核心业务代码的文件也打包进二进制文件添加干扰,增加二进制文件的逆向分析难度。具体可以表现为对脚本文件进行依赖解析得到脚本文件的依赖关系,基于依赖关系对脚本文件形成调用链,然后对调用链和前端视图类文件进行打包,得到目标文件。
其中,所进行的打包为统一打包,所得到的目标文件为单一的目标文件。
示例性地,后缀为.js格式脚本文件并不能单独运行,相互之间的调用必须通过require或者import指令引入,也就是.js脚本文件之间会形成依赖关系,程序的主入口为/bin/www,该文件会引入/app.js,而所有的后台逻辑、路由等文件都会引入到app.js进行提前声明,从而形成一个完整的调用链,基于这种依赖关系,通过打包工具统一打包成一个js文件,从而进行后续的混淆、加密操作。即主要是将调用链上所涉及的所有.js文件统一打包生成单个目标.js文件,基于依赖关系进行打包生成。
在实际应用中,在执行统一打包操作之前,首先需要配置与打包相关的工具、环境、参数等,特别关键的是将目标配置为节点,然后再通过配置的命令进行构建打包。
在具体实现中,首先准备好已经开发完成并且可以正常启动运行的项目代码,然后可以根据不同操作系统平台安装、配置对应的工具环境(如表1所示),以及配置webpack相关的工具、环境。
表1
在对webpack相关的工具、环境、参数时,将目标配置为节点,示例性地,由于webpack通常用来对前端代码进行打包,且本发明实施例中的Express框架是使用Node.js进行后端代码的开发,target需要配置为node;通过配置的命令进行构建打包,表现为采用package.json所配置的webpack的scripts命令,通过npm run build进行构建打包,将所有的.js脚本文件统一打包为bundle.js单个文件,完成对项目代码的统一打包的处理操作。需要说明的是,build命令在package.json中配置可以如下:"scripts":{"build":"webpack"},即其实际上是调用webpack命令对当前项目代码所有.js进行打包,并在指定目录(一般为./dist)生成打包后的js文件,例如bundle.js文件。
步骤302,对目标文件进行代码混淆,得到混淆后的代码;
在生成目标文件之后,可以对目标文件进行代码混淆,使得混淆后的代码很难被反编译,通过进行代码混淆有效增加应用被逆向破解的难度。
具体的,可以对目标文件进行代码混淆,并在代码混淆的过程中对目标文件进行编码填充,得到混淆后的代码。
其中,对目标文件进行的代码混淆,具体可以经由混淆器实现,对目标文件中的源代码执行如下的一项或者多项代码混淆操作:变量名混淆、函数名混淆、将源代码中的条件语句和循环结构进行转换以及压缩操作,对此,本发明实施例不加以限制。示例性地,javascript-obfuscator混淆器通过变量名混淆、函数名混淆、控制流平坦化、压缩等方式进行代码的复杂混淆,其中,控制流平坦化主要指的是将源代码中的条件语句和循环结构进行转换,使其看起来更加复杂,从而增加反向工程的难度。
编码填充是整体混淆过程中的一个环节,在代码混淆的过程中所进行的编码填充,主要可以生成字符串,将字符串加入第一字符串数组,得到第二字符串数组,然后对第二字符串数组进行编码,得到编码结果,并在编码结果中插入预设指定代码,得到混淆后的代码。
其中,所生成的字符串可以为在JavaScript Obfuscator整体混淆代码的过程中,根据用户需求所生成的动态字符串组stringArray中所存储的字符串。通常可以在混淆的过程中动态地生成一组字符串,并将所生成的字符串存储在一个字符串数组中,然后可以将这个字符串数组作为输入项传入相应的混淆器中,由混淆器对其采用相应的编码方式、编码规则进行编码和混淆处理。
混淆器一般可以提供多种不同的混淆策略供用户选择,例如字符串数组的编码方式、编码规则等,示例性地,string-array-encoding rc4,可以表现为配置rc4参数(为一种常用的流密码)对上述第二字符串数组中的所有字符串文字进行编码,从而提高代码的安全性。
代码混淆具体可以使用命令实现,示例性地,可以使用javascript-obfuscator对bundle.js文件进行混淆,所使用的命令可以为:javascript-obfuscator./dist/bundle.js--string-array-encoding rc4,即在本示例中可以通过配置rc4参数对stringArray的所有字符串文字进行编码,并插入一个特殊代码,从而更难获得初始值增加还原难度。
其中,在编码结果中所插入的预设指定代码,即所填充的特殊代码,主要可以通过在编码结果中,填充具备执行代码能力的空白函数,而空白函数的函数体用于插入任意所要执行的代码,进而实现编码填充,得到最终混淆后的代码。
步骤303,对混淆后的代码编译得到字节码;
在混淆后的文件中,其代码混淆仅仅只是障眼法,无法防止篡改者在混淆后的源码中加入探针和钩子代码,而为了防止前述情况,本发明实施例可以进一步对混淆后的代码进行字节加密与二进制编译的处理。
对混淆后的代码所进行的字节加密处理,可以表现为基于混淆后的代码生成语法树,该语法树可以用于指示混淆后的代码的句法结构的树形表示形式,在字节编译过程中,可以按照句法结构的树形表示形式对语法树进行编译,得到字节码。
具体的,基于V8字节码的特性,即V8可以直接运行字节码,可以使用SquashFS、javascript-obfuscator、bytenode、nodec等工具的组合使用,将混淆后的代码编译成字节码,由于字节码经历了完整的编译流程,能够抹除源码中携带的额外语义信息,其逆向难度可以与传统的编译型语言相当。
在实际应用中,当V8编译JavaScript代码时,解析器(parser)可以将混淆后的代码生成一个抽象语法树,而语法树是JavaScript代码的句法结构的树形表示形式,此时解释器Ignition可以根据语法树生成字节码。其中,由于V8字节码是V8引擎在解析和编译JavaScript后产物的序列化形式,且通常用于浏览器内的性能优化,此时通过V8字节码运行代码,不仅能够起到代码保护作用,还对性能有一定的提升。
字节编译具体可以通过使用命令实现,示例性地,可以通过bytenode对已经混淆的代码进行字节码编译,所使用的命令可以为:bytenode--compile./dist/bundle-obfuscated.js,以得到编译完成的字节码。
步骤304,基于字节码,生成可执行二进制文件。
完成字节码的编译后,虽然已经基本实现对代码的加密和保护,但是为了更进一步保护代码,也为了根据业务部署环境需要能够更好启动运行项目代码,此时可以将代码编译打包为可执行文件,即可以基于字节码得到可执行二进制文件。
所编译得到的二进制可执行文件,可以结合目标系统和相应的运行环境进行生成,具体可以表现为获取目标系统,根据目标系统将字节码生成二进制文件,然后可以获取目标系统的运行环境,并基于运行环境对二进制文件赋予相应的可执行权限,得到二进制可执行文件。
即可以将代码编译打包成可以直接运行的二进制可执行文件,具体通过使用命令实现,示例性地,可以通过nodec将代码编译打包为可执行文件,所使用的命令可以为:nodec./dist/bundle-obfuscated.js--skip-npm-instal。
其中,编译生成二进制文件过程,可以根据目标系统分别生成Windows、Mac、Linux可执行文件,结合运行环境要求赋予可执行权限,以按需生成跨平台的可执行二进制文件,成功运行项目。在本发明实施例中,可以将最初的脚本语言变成可执行的二进制文件,不再是可读的源代码,其中二进制文件包含了程序的机器指令和其他相关数据,当某个平台打开一个二进制文件时,程序会将其解析为机器指令并执行相应的操作,如同编译型语言的源代码被编译成机器指令。
参照图4,示出了本发明实施例提供的代码处理的应用场景示意图,应用于项目代码开发系统410,在本应用场景中,可以通过编排实现上述代码加密处理的整个过程。
具体可以通过命令脚本的编排配置,示例性地,可以通过npm run enc即可一次调用obfuscate、bytenode、nodec三个命令,分别对应混淆、字节加密、打包二进制的动作,不仅操作简单,且还能通过使用所配置的针对文件编排的脚本,一键完成混淆、字节码编译、二进制打包等操作。
通过命令脚本的编排配置,能够组合使用混淆、字节码、编译等手段,对所获取的项目代码进行代码混淆得到混淆后的代码,以及对混淆后的代码进行字节加密,从而基于所得到的字节码生成得到二进制文件,达到与编译型语言相当的逆向难度。
具体可以表现为在准备项目代码,安装加密工具、依赖库以及配置打包环境、参数之后,项目代码开发系统410可以响应用于实现编排配置的命令,按照命令脚本进行编排配置,执行框架代码加密的核心步骤,即项目代码打包、代码混淆/编码填充、字节加密以及编译二进制文件等步骤,以得到可执行二进制文件,完成对项目代码的混淆加密,对于步骤的具体执行过程可参照上述方法实施例,本发明实施例在此不加以赘述。其中,加密后的文件无需解密可以直接运行,即加密后的文件不依赖环境,能够根据操作系统平台生成不同的目标可执行文件,实现跨平台直接运行,且非对称不可逆的混淆加密,没有加密密钥泄露的风险,同时能够打包加密前、后端的文件,以及基于字节码的特性,同时无需解密,运行效率高。
在本发明实施例中,通过对基于Express框架开发的项目代码进行加密,以确保关键代码的保护和商业价值,主要是基于代码混淆的原理,并结合V8字节码的特性,通过打包、编码填充/加密、编译等方法,实现对基于Node.js的Express框架开发出来的项目代码进行加密保护。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
参照图5,示出了本发明的一种代码处理装置实施例的结构框图,具体可以包括如下模块:
代码混淆模块501,用于获取项目代码,对所述项目代码进行代码混淆,得到混淆后的代码;
字节加密模块502,用于对所述混淆后的代码进行字节加密,得到字节码;
文件生成模块503,用于基于所述字节码,生成二进制文件。
在本发明的一种实施例中,所述项目代码的文件包括脚本文件和前端视图类文件;代码混淆模块501可以包括如下子模块:
代码混淆子模块,用于对所述脚本文件进行依赖解析得到所述脚本文件的依赖关系,基于所述依赖关系对所述脚本文件形成调用链;对所述调用链和所述前端视图类文件进行打包,得到目标文件;对所述目标文件进行代码混淆,得到混淆后的代码。
在本发明的一种实施例中,代码混淆子模块可以包括如下单元:
代码混淆单元,用于对所述目标文件进行代码混淆,并在所述代码混淆的过程中对所述目标文件进行编码填充,得到混淆后的代码。
在本发明的一种实施例中,代码混淆单元可以包括如下子单元:
代码混淆子单元,用于对所述目标文件中的源代码执行如下的一项或者多项代码混淆操作:变量名混淆、函数名混淆、将源代码中的条件语句和循环结构进行转换以及压缩操作。
在本发明的一种实施例中,代码混淆单元可以包括如下子单元:
编码填充子单元,用于生成字符串,以及获取与所述目标文件中的源代码对应的第一字符串数组;将所述字符串加入所述第一字符串数组,得到第二字符串数组;对所述第二字符串数组进行编码,得到编码结果;在所述编码结果中插入预设指定代码,得到混淆后的代码。所述在所述编码结果中插入预设指定代码,得到混淆后的代码的步骤可以包括:在所述编码结果中,填充具备执行代码能力的空白函数,得到混淆后的代码;其中,所述空白函数的函数体用于插入任意所要执行的代码。
在本发明的一种实施例中,字节加密模块502可以包括如下子模块:
字节编译子模块,用于基于所述混淆后的代码生成语法树;所述语法树用于指示所述混淆后的代码的句法结构的树形表示形式;按照所述句法结构的树形表示形式对所述语法树进行编译,得到字节码。
在本发明的一种实施例中,所述二进制文件可执行;文件生成模块503可以包括如下子模块:
文件编译子模块,用于获取目标系统,根据所述目标系统将所述字节码生成二进制文件;获取所述目标系统的运行环境,基于所述运行环境对所述二进制文件赋予相应的可执行权限,得到二进制可执行文件。
在本发明实施例中,本发明实施例提供的代码处理装置,可以对所获取的项目代码进行代码混淆得到混淆后的代码,以及对混淆后的代码进行字节加密,从而基于所得到的字节码生成得到二进制文件。通过在对代码混淆的基础上,利用字节加密、编译等手段进一步对项目代码进行加密处理,编译生成可直接运行的二进制文件,解决简单打包或混淆JavaScript代码就直接进行业务部署导致核心代码成果泄漏的问题,极大提升代码逆向难度,进而达到实现保护项目关键代码的目的。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本发明实施例还提供了一种电子设备,包括:
包括处理器、存储器及存储在所述存储器上并能够在所述处理器上运行的计算机程序,该计算机程序被处理器执行时实现上述代码处理方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储计算机程序,计算机程序被处理器执行时实现上述代码处理方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本发明所提供的一种代码处理方法、一种代码处理装置、相应的一种电子设备以及相应的一种计算机可读存储介质,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

Claims (11)

1.一种代码处理方法,其特征在于,所述方法包括:
获取项目代码,对所述项目代码进行代码混淆,得到混淆后的代码;
对所述混淆后的代码进行字节加密,得到字节码;
基于所述字节码,生成二进制文件。
2.根据权利要求1所述的方法,其特征在于,所述项目代码的文件包括脚本文件和前端视图类文件;所述对所述项目代码进行代码混淆,得到混淆后的代码,包括:
对所述脚本文件进行依赖解析得到所述脚本文件的依赖关系,基于所述依赖关系对所述脚本文件形成调用链;
对所述调用链和所述前端视图类文件进行打包,得到目标文件;
对所述目标文件进行代码混淆,得到混淆后的代码。
3.根据权利要求2所述的方法,其特征在于,所述对所述目标文件进行代码混淆,得到混淆后的代码,包括:
对所述目标文件进行代码混淆,并在所述代码混淆的过程中对所述目标文件进行编码填充,得到混淆后的代码。
4.根据权利要求2或3所述的方法,其特征在于,所述对所述目标文件进行代码混淆,包括:
对所述目标文件中的源代码执行如下的一项或者多项代码混淆操作:变量名混淆、函数名混淆、将源代码中的条件语句和循环结构进行转换以及压缩操作。
5.根据权利要求3所述的方法,其特征在于,所述对所述目标文件进行编码填充,得到混淆后的代码,包括:
生成字符串,以及获取与所述目标文件中的源代码对应的第一字符串数组;
将所述字符串加入所述第一字符串数组,得到第二字符串数组;
对所述第二字符串数组进行编码,得到编码结果;
在所述编码结果中插入预设指定代码,得到混淆后的代码。
6.根据权利要求5所述的方法,其特征在于,所述在所述编码结果中插入预设指定代码,得到混淆后的代码,包括:
在所述编码结果中,填充具备执行代码能力的空白函数,得到混淆后的代码;其中,所述空白函数的函数体用于插入任意所要执行的代码。
7.根据权利要求1所述的方法,其特征在于,所述对所述混淆后的代码进行字节加密,得到字节码,包括:
基于所述混淆后的代码生成语法树;所述语法树用于指示所述混淆后的代码的句法结构的树形表示形式;
按照所述句法结构的树形表示形式对所述语法树进行编译,得到字节码。
8.根据权利要求1或7所述的方法,其特征在于,所述二进制文件可执行;所述基于所述字节码,生成二进制文件,包括:
获取目标系统,根据所述目标系统将所述字节码生成二进制文件;
获取所述目标系统的运行环境,基于所述运行环境对所述二进制文件赋予相应的可执行权限,得到二进制可执行文件。
9.一种代码处理装置,其特征在于,所述装置包括:
代码混淆模块,用于获取项目代码,对所述项目代码进行代码混淆,得到混淆后的代码;
字节加密模块,用于对所述混淆后的代码进行字节加密,得到字节码;
文件生成模块,用于基于所述字节码,生成二进制文件。
10.一种电子设备,其特征在于,包括:处理器、存储器及存储在所述存储器上并能够在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至8中任一项所述代码处理方法。
11.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如权利要求1至8中任一项所述代码处理方法。
CN202311641497.0A 2023-12-01 2023-12-01 一种代码处理方法、装置、电子设备及可读存储介质 Pending CN117828556A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311641497.0A CN117828556A (zh) 2023-12-01 2023-12-01 一种代码处理方法、装置、电子设备及可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311641497.0A CN117828556A (zh) 2023-12-01 2023-12-01 一种代码处理方法、装置、电子设备及可读存储介质

Publications (1)

Publication Number Publication Date
CN117828556A true CN117828556A (zh) 2024-04-05

Family

ID=90521589

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311641497.0A Pending CN117828556A (zh) 2023-12-01 2023-12-01 一种代码处理方法、装置、电子设备及可读存储介质

Country Status (1)

Country Link
CN (1) CN117828556A (zh)

Similar Documents

Publication Publication Date Title
Karim et al. Platform-independent dynamic taint analysis for javascript
KR101490047B1 (ko) 자가변환 기반 애플리케이션 코드 난독화 장치 및 그 방법
KR101328012B1 (ko) 애플리케이션 코드 난독화 장치 및 그 방법
CN106462677B (zh) 一种保护软件项目的方法和装置
Kim et al. ScanDal: Static analyzer for detecting privacy leaks in android applications
CN104680039B (zh) 一种应用程序安装包的数据保护方法及装置
JP5818695B2 (ja) コード変換方法、プログラム及びシステム
CN105022936A (zh) 一种类class文件加密解密方法和装置
CN108932406A (zh) 虚拟化软件保护方法和装置
EP2323031A2 (en) Calling of late bound functions from an external program environment
CN110059456B (zh) 代码保护方法、代码保护装置、存储介质与电子设备
CN110414261A (zh) 一种数据脱敏方法、装置、设备及可读存储介质
CN111159662A (zh) 一种数据的处理方法和装置
US10380329B2 (en) Method and apparatus for preventing application from being deciphered
CN109614772B (zh) 基于应用安装包文件的代码转换方法及装置
CN110309630B (zh) 一种Java代码加密方法及装置
CN107871066B (zh) 基于安卓系统的代码编译方法及装置
CN113704706B (zh) 代码加固方法、装置
CN104298534A (zh) 基于Lua语言的编程方法和装置
CA3150187C (en) Method and apparatus for protecting web script codes
KR20180028666A (ko) 역공학 방지 방법 및 장치
CN117828556A (zh) 一种代码处理方法、装置、电子设备及可读存储介质
CN113849781B (zh) Go语言源代码混淆方法、系统、终端及存储介质
CN116257867A (zh) 秘钥加密方法及装置
CN115525902A (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