CN114611074A - Solidity语言源代码混淆方法、系统、设备及存储介质 - Google Patents

Solidity语言源代码混淆方法、系统、设备及存储介质 Download PDF

Info

Publication number
CN114611074A
CN114611074A CN202210230894.8A CN202210230894A CN114611074A CN 114611074 A CN114611074 A CN 114611074A CN 202210230894 A CN202210230894 A CN 202210230894A CN 114611074 A CN114611074 A CN 114611074A
Authority
CN
China
Prior art keywords
source code
expression
control flow
language
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.)
Pending
Application number
CN202210230894.8A
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.)
Hohai University HHU
Original Assignee
Hohai University HHU
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 Hohai University HHU filed Critical Hohai University HHU
Priority to CN202210230894.8A priority Critical patent/CN114611074A/zh
Publication of CN114611074A publication Critical patent/CN114611074A/zh
Pending legal-status Critical Current

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

Abstract

本发明提出了一种Solidity语言源代码混淆方法、系统、设备及存储介质。包括:读取源代码,构建抽象语法树和控制流图;替换源代码中的变量名、扰乱源代码布局并删除辅助信息;转换源代码中变量状态,将常量转换为函数调用或算术表达式,以修改智能合约中的数据字段;将全局代码控制流控制流、函数体内控制流以及循环或分支基本块通过switch‑case的方式扁平化,并在循环或分支语句基于结合Chebyshev和PWLCM的一维混沌映射CPM生成并引入混沌永真不透明谓词,以隐藏原始程序的内部逻辑;上述方法实现Solidity语言源代码混淆,生成混淆后的Solidity代码。本发明生成智能合约的源代码混淆版本,可以大大增加智能合约被反编译的成本,提高智能合约本身内容的安全性。

Description

Solidity语言源代码混淆方法、系统、设备及存储介质
技术领域
本发明涉及一种Solidity语言源代码混淆方法、系统、设备及存储介质,针对以太坊智能合约,属于区块链安全领域。
背景技术
以太坊(Ethereum)是一个开源的有智能合约功能的公共区块链平台,它解决了比特币网络拓展性不足的问题。智能合约是在区块链平台上运行的自主程序。它们通常用Solidity语言开发,然后编译生成二进制文件。将智能合约部署到相应区块链中后,任何人都可以公开查阅该智能合约的二进制文件的内容,通过调用的方式执行智能合约,但是无法修改智能合约。因此,如何保证部署后的智能合约有着足够的复杂度,从而很好地抵制逆向破解是一件很值得关注的问题。
Solidity语言是专门面向智能合约开发的静态强类型、编译型,支持继承、支持各种库和用户自定义类型的高级语言。非常适合用来开发类似于投票,众筹,拍卖,多重签名钱包等各种功能。因为Solidity是编译型语言,编译后的二进制文件存在着丰富的源代码信息,二进制文件中使用的字符串和符号信息,都可以为逆向工程师破解程序提供帮助。
与其他语言对比,比如解释型语言Python、JavaScript、PHP、Shell、MATLAB等,它们编写的程序在一边执行一边转换的过程,存在着中间字节码转换。针对这些语言使用的混淆相关技术是对中间字节码进行混淆,而Solidity作为编译型语言并不存在中间字节码部分,混淆失去了作用。而对于其他编译型语言包括C、C++、Go等语言来说,它们的语法结构与Solidity语言截然不同,并没有诸如合约,转账等特殊结构,因此对于C、C++、Go等语言的混淆技术无法应用在Solidity语言上。
发明内容
发明目的:针对上述现有技术的不足,本发明目的是提供一种Solidity语言源代码混淆方法,通过使代码难以阅读、修改智能合约的数据字段和隐藏智能合约的内部逻辑等相关技术达到生成混淆后智能合约的目的,提升智能合约抵制逆向破解的能力。
技术方案:为实现上述发明目的,本发明所述的一种Solidity语言源代码混淆方法,包括如下步骤:
步骤1:读取源代码,构建所述源代码的抽象语法树和控制流图;
步骤2:替换源代码中的变量名、扰乱源代码布局并删除辅助信息;
步骤3:转换源代码中变量状态,将常量转换为函数调用或算术表达式,以修改智能合约中的数据字段;
步骤4:将全局代码控制流控制流、函数体内控制流以及循环或分支基本块通过switch-case的方式扁平化,并在循环或分支语句基于结合Chebyshev和PWLCM(分段线性混沌映射)的一维混沌映射(Chebyshev-PWLCM Map,CPM)生成并引入混沌永真不透明谓词,以隐藏原始程序的内部逻辑;
步骤5:判断智能合约混淆前后功能是否一致,在功能一致的前提下,完成Solidity语言的源代码混淆。
作为优选,所述步骤2进一步包括:
步骤21:寻找源代码中每个变量的名字和对应位置,使用加密算法生成对应的加密值后进行替换;
步骤22:使用正则表达式,将换行、空格字符替换为‘’,并且将连续空白替换为单个空白;
步骤23:使用正则表达式,将源代码中的单行注释和多行注释全都替换为‘’,删除源代码中的辅助信息。
作为优选,所述步骤3进一步包括:
步骤31:寻找源代码中的所有被声明的本地变量,用新声明的全局变量替换找到的本地变量。
步骤32:寻找源代码中的所有类型常量的位置和数值,根据常量值声明数组,然后将常量替换为对应的函数调用,实现静态数据转为动态生成;
步骤33:寻找源代码中的所有布尔变量,若布尔变量为真,使用“或”运算符与后续表达式相连接;若布尔变量为假,使用“与”运算符与后续表达式相连接;所述后续表达式是一个布尔运算表达式或是一个算术表达式,或其组合。
步骤34:寻找源代码中所有状态变量,将它们集中在一个结构体中,通过结构体成员变量的方式调用它们,从而将标量转为向量。
作为优选,所述步骤4中全局代码控制流扁平化和函数体内控制流扁平化的代码实现是一样的,都是通过switch-case的方式进行扁平化操作,只是函数体内控制流扁平化多了函数外壳抽取的步骤。循环或分支基本块扁平化则是更进一步需要解析循环或者分支语句中的表达式,根据表达式的的真值状态进行扁平化,若表达式的真值为真,则生成一个switch-case分支,若表达式的真值为假,则生成另一个swith-case分支。
为了让不透明谓词插入到智能合约中达到良好的混淆效果,挑选合适的混沌系统这一过程更多地是注重混沌系统的敏感性、随机性和时效性。
生成不透明谓词的方法是:结合了Chebyshev和PWLCM混沌映射,提出了一种改进的一维混沌映射(Chebyshev-PWLCM Map,CPM)。CPM的主要设计方向是保留Chebyshev和PWLCM混沌映射良好的敏感性和不确定性,同时尽可能削弱和去除Chebyshev混沌映射混沌范围较小和PWLCM混沌映射存在断点的问题,增加了改进后混沌映射的安全性、连续性和分布均匀性。改进后混沌映射的定义如下:
Figure BDA0003538315950000031
其中,给定一个初始值x0,根据x0迭代出x1,随之得出xn,xn∈[-1,1],由xn生成xn+1;μ,p均为该混沌映射的控制参数,μ∈Z*,p∈(0,0.5);F为该一维混沌映射的迭代公式,当0.5≤xn<1时,函数中的变量xn=1-xn,其余参数μ,p不变;当μ≥2,p∈(0,0.5)时,CPM混沌映射处于混沌状态;M属于该混沌映射中密钥的部分组成,是该混沌映射的扰动参数。CPM混沌映射在保留Chebyshev和PWLCM混沌映射良好的初值敏感性和随机性的同时,也去除了PWLCM的零点问题,扩大了混沌范围,增加了混沌映射的安全性和连续性。除此之外,CPM更进一步地将混沌轨迹地更加均匀地混合,提高了混沌映射的性能。
引入不透明谓词的方法是:先选定不透明谓词将要插入的表达式Exp,观察其结构并且按照规则进行分解,然后根据分解结果生成若干数目不透明谓词P,将生成的不透明谓词和分解结果进行合并,若生成为永真不透明谓词则为Exp&P,若生成为永假不透明谓词则为Exp||P并且平移,生成新的表达式,增加了混淆过程的复杂度。
作为优选,所述步骤2至4中如果存在失败,则跳过失败部分,进行下一步混淆,返回错误报告并且生成相应Solidity源代码。如果上述功能中不存在失败,返回成功信息并且生成相应Solidity源代码。
基于相同的发明构思,本发明提供一种Solidity语言源代码混淆系统,包括以下部分:
目标构建单元,用于读取源代码,构建所述源代码的抽象语法树和控制流图;
第一处理单元,用于替换源代码中的变量名、扰乱源代码布局并删除辅助信息;
第二处理单元,用于转换源代码中变量状态、将常量转换为函数调用或算术表达式以修改智能合约中的数据字段;
第三处理单元,用于将全局代码控制流控制流、函数体内控制流以及循环或分支基本块通过switch-case的方式扁平化,并在循环或分支语句基于结合Chebyshev和PWLCM的一维混沌映射CPM生成并引入混沌永真不透明谓词,以隐藏原始程序的内部逻辑;
目标生成单元,用于判断智能合约混淆前后功能是否一致,在功能一致的前提下,完成Solidity语言的源代码混淆。
基于相同的发明构思,本发明提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述计算机程序被加载至处理器时实现所述的Solidity语言源代码混淆方法。
基于相同的发明构思,本发明提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现所述的Solidity语言源代码混淆方法。
有益效果:本发明提供了一种Solidity语言源代码混淆方法,针对使用Solidity语言开发的以太坊智能合约,本方法的输入为使用Solidity语言开发的以太坊智能合约。利用源代码中的变量名替换、扰乱源代码布局和删除辅助信息技术让攻击者更加难以阅读和理解代码;利用转换源代码中变量状态、类型技术从而修改智能合约中的数据字段;利用代码扁平化和改进的不透明谓词生成与引入技术隐藏了原始程序的内部逻辑;利用难以阅读的代码、修改智能合约的数据字段和隐藏智能合约的内部逻辑,在智能合约混淆前后功能一致的前提下,实现Solidity语言的源代码混淆。本发明极大地增加了Solidity语言开发的以太坊智能合约的复杂度,有效地增强了智能合约抵制逆向破解的能力,提高了智能合约的安全性,避免不必要的财产损失。
附图说明
图1为本发明实施例的整体步骤流程图。
图2为本发明具体示例的方法流程图。
图3是本发明一个实施例的系统的示意性框图。
具体实施方式
下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
考虑区块链上的数据具有不可修改的特性以及以太坊智能合约大多涉及到金钱交易,所以智能合约被逆向破解成功而造成的损失相较于其他领域要严重得多。本发明实施例提供一种Solidity语言源代码混淆方法,如图1所示,主要包括5个步骤:
步骤1:读取源代码,构建所述源代码的抽象语法树和控制流图;
步骤2:替换源代码中的变量名、扰乱源代码布局并删除辅助信息;
步骤3:转换源代码中变量状态,将常量转换为函数调用或算术表达式,以修改智能合约中的数据字段;
步骤4:将全局代码控制流控制流、函数体内控制流以及循环或分支基本块通过switch-case的方式扁平化,并在循环或分支语句基于改进一维混沌映射CPM生成并引入混沌永真不透明谓词,以隐藏原始程序的内部逻辑;
步骤5:判断智能合约混淆前后功能是否一致,在功能一致的前提下,完成Solidity语言的源代码混淆。
如图2所示,本发明实施例以从以太坊浏览器上任意一份公开的、以Solidity语言编写的以太坊智能合约为例,说明本发明实施例公开的一种Solidity语言源代码混淆方法的详细步骤,具体如下:
所述步骤1中的以太坊智能合约源代码需要是使用以太坊智能合约高级编程语言Solidity编写的,在本步骤中对读取源代码,构建所述源代码的抽象语法树和控制流图,所述步骤1进一步叙述为:
步骤11:从以太坊浏览器官网(https://etherscan.io/verifiedContracts/)选择任意一份使用Solidity语言编写的以太坊智能合约,复制合约的源代码,将其保存到本地,保存为.sol格式的文件。
步骤12:利用Solidity命令行编译器,即solc对源代码进行读取,使用solc-ooutputDirectory--ast sourceFile.sol命令解析源代码,如果源代码存在错误则返回错误信息;如果对于源代码的解析成功,返回抽象语法树的结构,以文件形式返回,所述抽象语法树结构包含包的详细信息、在当前编译环境中的详细路径、每个语法节点的结构信息。
步骤13:逐行读入生成的抽象语法树文件,将抽象语法树的内容存储于一个字符串数组中。逐行遍历数组,为了尽可能地复用抽象语法树中的内容创建基本块对象,将一个基本块中的所有抽象语法树节点收集到数组中,比如说将抽象语法树中的“name”为“block”进行定位并且记录作为基本块组成,并且记录控制流图的入边和出边,比如使用抽象语法树中的“FunctionDefinition”和“FunctionCall”产生函数的调用关系,“IfStatement”,“WhileStatement”等作为分支和循环语句关键词圈定循环体的范围;创建控制流图边对象表示控制流图的边,用于连接源和目标基本块,并且记录下跳转目标的条件,比如使用“BinaryOperation”确定条件的范围,“operator”确定运算符,在条件范围上下的“attributes”中找到左右的操作数;创建数据流对象记录变量的赋值,每个数据流对象只记录一个变量的一次赋值。
步骤14:综合基本块对象、控制流图边对象和数据流对象,从而生成一个完整的控制流图,使用图形绘图工具Graphviz,以基本块为节点和相应的控制流图边生成相应的控制流图,命名规则为“原文件名_ControlFlow.dot”。
所述步骤2利用源代码中的变量名替换、扰乱源代码布局和删除辅助信息技术让攻击者更加难以阅读和理解代码,所述步骤2进一步叙述为:
步骤21:寻找源代码中每个变量的名字和对应位置,使用加密算法生成对应的加密值后进行替换。
步骤22:使用正则表达式“\\s*|\t|\r|\n”,将换行、空格字符替换为‘’,并且将连续空白替换为单个空白,达到扰乱源代码布局的作用;
步骤23:使用正则表达式“\\/\\/[^\\n]*|\\/\\*([^\\*^\\/]*|[\\*^\\/*]*|[^\\**\\/]*)*\\*+\\/”,将源代码中的单行注释和多行注释全都替换为‘’,删除源代码中的辅助信息。
在步骤3中,我们使用步骤2后完成信息扰乱,通过解析抽象语法树来转换源代码中变量状态、类型技术从而修改智能合约中的数据字段,步骤3可进一步分为:
步骤31:寻找源代码中的所有被声明的本地变量,然后处理可能存在的同名本地变量。记录本地变量出现在源代码中的位置,用新声明的全局变量逐个替换找到的本地变量。比如通过解析抽象语法树文件,确定“VariableDeclaration”,“referencedDeclaration”等元素位置,根据它们的“src”中的作用域,确立替换范围。将本地变量重新声明并且替换。
步骤32:Solidity中存在四种常量——整型、布尔型、字符串型和十六进制字符串型,即“attributes”中的“type”的类型。通过解析抽象语法树文件,获取前三种类型常量的存在位置和对应值(最后一种类型无法获取其值)。然后根据常量的值声明数组,将常量值声明在数组中。然后插入函数,用于返回不同数组的不同索引对应元素。最后,将常量替换为对应的函数调用。
此外,对于整型常量也可替换为表达式。寻找源代码中的所有整型常量,即“attributes”中的“type=uint256或其他位数”。根据它们的“src”中的作用域,记录该常量存在位置。将其转换为较为复杂的算术表达式,该算术表达式可以生成原值。受限于Solidity语言不支持浮点数,生成的算术表达式中不包含浮点数也不使用除法。
步骤33:寻找源代码中的所有布尔变量,即“attributes”中的“type=bool”。根据它们的“src”中的作用域,记录该常量存在位置。若布尔变量为真,使用“或”运算符与后续表达式相连接。若布尔变量为假,使用“与”运算符与后续表达式相连接。后续表达式可能是一个布尔运算表达式,也可能是一个算术表达式。比如说,对于布尔变量b,若该变量为真,则拆分b=b||q;若该变量为假,则拆分b=b&&q,其中q可能是布尔表达式,也可能是一个算术表达式。
步骤34:寻找源代码中所有状态变量即“attributes”中的“stateVariable”,将它们集中在一个结构体中,通过结构体成员变量的方式调用它们,即“attributes”中的“MemberAccess”,调用的位置由它们的“src”中的作用域所确立。从而将标量转为向量。
在步骤4中,我们使用步骤3后完成数据修改,利用代码扁平化和不透明谓词技术隐藏了原始程序的内部逻辑,步骤4可进一步分为:
步骤41:源代码的控制流图信息首先被输入,然后判断输入参数的完整性。如果参数丢失,下面的混淆步骤就不能进行。下面的混淆步骤不能执行。如果参数形式是正确的,则生成和插入不透明的谓词以及控制流的扁平化。不透明的谓词的生成和插入以及控制流的扁平化将被执行。
步骤42:根据构建的控制流图,寻找代码中循环语句、分支语句和顺序语句。因为基本块在运行中都是顺序执行的,因此可以将控制流的扁平化分为三类:全局代码控制流扁平化、函数体内控制流扁平化和循环或分支基本块扁平化。具体扁平化如下代码所示:
Figure BDA0003538315950000091
其中全局代码控制流扁平化和函数体内控制流扁平化的代码实现是一样的,都是通过switch-case的方式进行扁平化操作,只是函数体内控制流扁平化多了函数外壳抽取的步骤。循环或分支基本块扁平化则是更进一步需要解析循环或者分支语句中的表达式,根据表达式的真值状态进行扁平化,若表达式的真值为真,则生成一个switch-case分支,若表达式的真值为假,则生成另一个swith-case分支,
步骤43:生成不透明谓词的方法是:结合了Chebyshev和PWLCM混沌映射,提出了一种改进的一维混沌映射(Chebyshev-PWLCM Map,CPM)。CPM的主要设计方向是保留Chebyshev和PWLCM混沌映射良好的敏感性和不确定性,同时尽可能削弱和去除Chebyshev混沌映射混沌范围较小和PWLCM混沌映射存在断点的问题,增加了改进后混沌映射的安全性、连续性和分布均匀性。改进后混沌映射的定义如下:
Figure BDA0003538315950000101
其中,给定一个初始值x0,根据x0迭代出x1,随之得出xn,xn∈[-1,1],由xn生成xn+1;μ,p均为该混沌映射的控制参数,μ∈Z*,p∈(0,0.5);F为该一维混沌映射的迭代公式,当0.5≤xn<1时,函数中的变量xn=1-xn,其余参数μ,p不变;当μ≥2,p∈(0,0.5)时,CPM混沌映射处于混沌状态;M属于该混沌映射中密钥的部分组成,是该混沌映射的扰动参数。CPM混沌映射在保留Chebyshev和PWLCM混沌映射良好的初值敏感性和随机性的同时,也去除了PWLCM的零点问题,扩大了混沌范围,增加了混沌映射的安全性和连续性。除此之外,CPM更进一步地将混沌轨迹地更加均匀地混合,提高了混沌映射的性能。
步骤44:插入不透明谓词方法:第一步:定位将要插入不透明谓词的表达式Exp并且分解,分解规则为:若Exp中存在逻辑运算符lp,以lp为界进行分解为Exp_1、lp、Exp_2;若不存在,则进行第二步;第二步:若存在逻辑运算符lp,对每个子表达式单独分解,以Exp_1为例,设比较运算符op为界,分解为Exp_11、op、Exp_12,若不存在逻辑运算符lp,则将表达式Exp认为子表达式Exp_1,进行上述操作;第三步:统计子表达式的个数N,生成不透明谓词P。生成基于CPM混沌映射永真不透明谓词的个数为2N,永假不透明谓词的个数为N,如P_1和P_2为永真不透明谓词,P_3为永假不透明谓词;第四步:结合不透明谓词P与分解的表达式Exp,构造新的谓词,若生成为永真不透明谓词则为Exp&P,若生成为永假不透明谓词则为Exp||P,并且将谓词平移。
因为P_1和P_2为永真不透明谓词,P_3为永假不透明谓词,新谓词的真值完全依赖于Exp的输入值,因此,其真值表和Exp的真值表完全相同,表达式地复杂化,一方面逆向工程中难以定位不透明谓词的插入位置,另一方面也增加了破解不透明谓词的难度,得到了更好的混淆效果,增加逆向工程的成本。
所述步骤5利用难以阅读的代码、修改智能合约的数据字段和隐藏智能合约的内部逻辑,在智能合约混淆前后功能一致的前提下,实现Solidity语言的源代码混淆。如果步骤2-4中存在失败,则跳过失败部分,进行下一步混淆,返回错误报告并且生成相应Solidity源代码。如果上述功能中不存在失败,返回成功信息并且生成相应Solidity源代码。
为了验证本发明方法的有效性,可以使用本发明方法生成混淆后的以太坊智能合约。首先,将原始的智能合约与混淆后的智能合约进行审查,确保混淆前后智能合约的功能并没有改变;其次,使用智能合约逆向工具对混淆前后的智能合约进行反编译,对比混淆前后的智能合约抵制逆向破解的能力,评估本发明方法的混淆效果。
混淆后的智能合约可以为智能合约的开发者提供有着一定复杂度的含有漏洞的智能合约测试用例,使其开发的工具面对复杂智能合约时候有着良好的表现,并且很好地补充了智能合约测试数据集内的数据数量。
基于相同的发明构思,本发明实施例提供一种Solidity语言源代码混淆系统,包括:目标构建单元,用于读取源代码,构建所述源代码的抽象语法树和控制流图;第一处理单元,用于替换源代码中的变量名、扰乱源代码布局并删除辅助信息;第二处理单元,用于转换源代码中变量状态、将常量转换为函数调用或算术表达式以修改智能合约中的数据字段;第三处理单元,用于将全局代码控制流控制流、函数体内控制流以及循环或分支基本块通过switch-case的方式扁平化,并在循环或分支语句基于改进一维混沌映射CPM生成并引入混沌永真不透明谓词,以隐藏原始程序的内部逻辑;以及,目标生成单元,用于判断智能合约混淆前后功能是否一致,在功能一致的前提下,完成Solidity语言的源代码混淆。
本领域技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的各单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。所述单元的划分仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元可以结合或者可以集成到另一个系统。
基于相同的发明构思,本发明实施例提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述计算机程序被加载至处理器时实现所述的Solidity语言源代码混淆方法。
本领域技术人员可以理解的是,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台电子设备(可以是个人计算机,服务器,或者网络设备等)执行本发明实施例所述方法的全部或部分步骤。存储介质包括:U盘、移动硬盘、只读存储器ROM、随机存取存储器RAM、磁碟或者光盘等各种可以存储计算机程序的介质。
基于相同的发明构思,本发明实施例还提供一种计算机可读存储介质,其中,该计算机可读存储介质可存储有程序,该程序执行时可包括本发明提供的各实施例中的部分或全部步骤。

Claims (10)

1.一种Solidity语言源代码混淆方法,其特征在于,包括如下步骤:
步骤1:读取源代码,构建所述源代码的抽象语法树和控制流图;
步骤2:替换源代码中的变量名、扰乱源代码布局并删除辅助信息;
步骤3:转换源代码中变量状态,将常量转换为函数调用或算术表达式,以修改智能合约中的数据字段;
步骤4:将全局代码控制流控制流、函数体内控制流以及循环或分支基本块通过switch-case的方式扁平化,并在循环或分支语句基于结合Chebyshev和PWLCM的一维混沌映射CPM生成并引入混沌永真不透明谓词,以隐藏原始程序的内部逻辑;
步骤5:判断智能合约混淆前后功能是否一致,在功能一致的前提下,完成Solidity语言的源代码混淆。
2.根据权利要求1所述的一种Solidity语言源代码混淆方法,其特征在于,所述步骤2,包括如下步骤:
步骤21:寻找源代码中每个变量的名字和对应位置,使用加密算法生成对应的加密值后进行替换;
步骤22:使用正则表达式,将换行、空格字符替换为‘’,并且将连续空白替换为单个空白;
步骤23:使用正则表达式,将源代码中的单行注释和多行注释全都替换为‘’,删除源代码中的辅助信息。
3.根据权利要求1所述的一种Solidity语言源代码混淆方法,其特征在于,所述步骤3包括如下步骤:
步骤31:寻找源代码中的所有被声明的本地变量,用新声明的全局变量替换找到的本地变量;
步骤32:寻找源代码中的所有类型常量的位置和数值,根据常量值声明数组,然后将常量替换为对应的函数调用,实现静态数据转为动态生成;
步骤33:寻找源代码中的所有布尔变量,若布尔变量为真,使用“或”运算符与后续表达式相连接;若布尔变量为假,使用“与”运算符与后续表达式相连接;所述后续表达式是一个布尔运算表达式或是一个算术表达式,或其组合;
步骤34:寻找源代码中所有状态变量,将它们集中在一个结构体中,通过结构体成员变量的方式调用它们,从而将标量转为向量。
4.根据权利要求1所述的一种Solidity语言源代码混淆方法,其特征在于,所述步骤4中全局代码控制流扁平化和函数体内控制流扁平化的代码实现是一样的,都是通过switch-case的方式进行扁平化操作,只是函数体内控制流扁平化多了函数外壳抽取的步骤;循环或分支基本块扁平化则是更进一步需要解析循环或者分支语句中的表达式,根据表达式的真值状态进行扁平化,若表达式的真值为真,则生成一个switch-case分支,若表达式的真值为假,则生成另一个swith-case分支。
5.根据权利要求1所述的一种Solidity语言源代码混淆方法,其特征在于,改进后一维混沌映射的定义如下:
Figure FDA0003538315940000021
其中,给定一个初始值x0,根据x0迭代出x1,随之得出xn,xn∈[-1,1],由xn生成xn+1;μ,p均为该混沌映射的控制参数,μ∈Z*,p∈(0,0.5);F为该一维混沌映射的迭代公式,当0.5≤xn<1时,函数中的变量xn=1-xn,其余参数μ,p不变;当μ≥2,p∈(0,0.5)时,CPM混沌映射处于混沌状态;M属于该混沌映射中密钥的部分组成,是该混沌映射的扰动参数。
6.根据权利要求1所述的一种Solidity语言源代码混淆方法,其特征在于,选定不透明谓词将要插入的表达式Exp,观察其结构并且按照规则进行分解,然后根据分解结果生成若干数目不透明谓词P,将生成的不透明谓词和分解结果进行合并,若生成为永真不透明谓词则为Exp&P,若生成为永假不透明谓词则为Exp||P并且平移,生成新的表达式,增加了混淆过程的复杂度。
7.根据权利要求1所述的一种Solidity语言源代码混淆方法,其特征在于,
所述步骤2至4中如果存在失败,则跳过失败部分,进行下一步混淆,返回错误报告并且生成相应Solidity源代码;如果不存在失败,返回成功信息并且生成相应Solidity源代码。
8.一种Solidity语言源代码混淆系统,其特征在于,包括:
目标构建单元,用于读取源代码,构建所述源代码的抽象语法树和控制流图;
第一处理单元,用于替换源代码中的变量名、扰乱源代码布局并删除辅助信息;
第二处理单元,用于转换源代码中变量状态、将常量转换为函数调用或算术表达式以修改智能合约中的数据字段;
第三处理单元,用于将全局代码控制流控制流、函数体内控制流以及循环或分支基本块通过switch-case的方式扁平化,并在循环或分支语句基于结合Chebyshev和PWLCM的一维混沌映射CPM生成并引入混沌永真不透明谓词,以隐藏原始程序的内部逻辑;
目标生成单元,用于判断智能合约混淆前后功能是否一致,在功能一致的前提下,完成Solidity语言的源代码混淆。
9.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述计算机程序被加载至处理器时实现根据权利要求1-7任一项所述的Solidity语言源代码混淆方法。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现根据权利要求1-7任一项所述的Solidity语言源代码混淆方法。
CN202210230894.8A 2022-03-09 2022-03-09 Solidity语言源代码混淆方法、系统、设备及存储介质 Pending CN114611074A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210230894.8A CN114611074A (zh) 2022-03-09 2022-03-09 Solidity语言源代码混淆方法、系统、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210230894.8A CN114611074A (zh) 2022-03-09 2022-03-09 Solidity语言源代码混淆方法、系统、设备及存储介质

Publications (1)

Publication Number Publication Date
CN114611074A true CN114611074A (zh) 2022-06-10

Family

ID=81860623

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210230894.8A Pending CN114611074A (zh) 2022-03-09 2022-03-09 Solidity语言源代码混淆方法、系统、设备及存储介质

Country Status (1)

Country Link
CN (1) CN114611074A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115203652A (zh) * 2022-09-15 2022-10-18 中电信数智科技有限公司 一种基于源混淆的ios端安全加密控制方法
CN117574334A (zh) * 2023-08-17 2024-02-20 广东工业大学 一种结合md5与序列到序列模型的代码混淆方法及系统
WO2024055437A1 (zh) * 2022-09-14 2024-03-21 蚂蚁区块链科技(上海)有限公司 一种检测合约升级的兼容性的方法和装置

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024055437A1 (zh) * 2022-09-14 2024-03-21 蚂蚁区块链科技(上海)有限公司 一种检测合约升级的兼容性的方法和装置
CN115203652A (zh) * 2022-09-15 2022-10-18 中电信数智科技有限公司 一种基于源混淆的ios端安全加密控制方法
CN115203652B (zh) * 2022-09-15 2022-12-13 中电信数智科技有限公司 一种基于源混淆的ios端安全加密控制方法
CN117574334A (zh) * 2023-08-17 2024-02-20 广东工业大学 一种结合md5与序列到序列模型的代码混淆方法及系统

Similar Documents

Publication Publication Date Title
CN112100054B (zh) 一种面向数据管控的程序静态分析方法和系统
Tratt Model transformations and tool integration
Reps et al. Weighted pushdown systems and their application to interprocedural dataflow analysis
CN114611074A (zh) Solidity语言源代码混淆方法、系统、设备及存储介质
Liskov et al. Programming with abstract data types
Kuncak et al. Role analysis
Sheard Languages of the future
Guo et al. Shape analysis with inductive recursion synthesis
JP2010507165A (ja) ソースコード内のセキュリティ脆弱性の検出
Gui et al. Cross-language binary-source code matching with intermediate representations
CN108563561B (zh) 一种程序隐性约束提取方法及系统
Wu et al. Foundational proof checkers with small witnesses
CN110673852A (zh) 一种基于编译器前端实现控制流平坦的方法、系统及设备
CN113031931A (zh) 一种基于脚本交叉编译的Python安全扩展方法
Wang et al. Learning program representations with a tree-structured transformer
CN114003868A (zh) 一种处理软件代码的方法和电子设备
Lim et al. Visualizing JIT compiler graphs
He Modeling and analyzing smart contracts using predicate transition nets
Pop The SSA representation framework: semantics, analyses and GCC implementation
Mista et al. Deriving compositional random generators
CN113946804B (zh) 一种源代码的混淆方法和装置
Klyuchnikov Towards effective two-level supercompilation
Lim et al. Visualizing The Intermediate Representation of Just-in-Time Compilers
Banerjee et al. Stackability in the simply-typed call-by-value lambda calculus
Vivekananthan et al. Dynamic Watermarking Using Python AST

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