基于智能合约字节码特征的合约代码混淆平台和混淆方法与流程

文档序号:22256557发布日期:2020-09-18 13:47阅读:283来源:国知局
基于智能合约字节码特征的合约代码混淆平台和混淆方法与流程

本发明涉及智能合约领域,尤其涉及一种基于智能合约字节码特征的合约代码混淆平台和混淆方法。



背景技术:

智能合约是1990年代由尼克萨博提出的理念,几乎与互联网同龄。由于缺少可信的执行环境,智能合约并没有被应用到实际产业中,自比特币诞生后,人们认识到比特币的底层技术区块链天生可以为智能合约提供可信的执行环境。智能合约是编程在区块链上的汇编语言。通常人们不会自己编写字节码,但是会从更高级的语言来编译它。

由于区块链是一个公开的分布式账本,其上的信息所有人都公开可见,时常有代码被复用的情况,而由于链上存储的合约是字节码形式,对人来说是难以阅读的,因此为了了解一个没有公布源代码的合约,人们通常会采用各种分析手段去了解这个合约如何运作以达到不同的目的。对于一个不愿意轻易让别人抄袭甚至找到漏洞攻击自己合约的合约开发者来说,这样的环境是非常恶劣的。



技术实现要素:

本发明的目的在于针对现有链上合约代码能够轻易地被各种分析工具解析的情况,提供一个智能合约代码混淆平台,合约开发者可以在部署合约之前通过这个平台重写合约代码以避免这样的情况。

本发明的目的是通过以下技术方案来实现的:

一种基于智能合约字节码特征的合约代码混淆平台,其特征在于,该平台包括:

字节码/指令转换器,用于接收原始字节码,并根据目标混淆方法将所述的原始字节码转换成指令序列,以表示出可执行段;

信息提取器,用于根据混淆方法,提取出注入所述的指令序列和跳转目标重解析所需要的信息,包括需要改写的指令位置和原始跳转目标地址,并将其保存下来,并将需要改写的指令位置发送给字节码注入器,将原始跳转目标地址发送给跳转目标重解析器;

字节码注入器,根据混淆方法生成插入指令,并在指令序列相应位置上插入,形成新的指令序列,并发送给跳转目标重解析器;

跳转目标重解析器,用于更正新的指令序列的跳转地址,使其与正确的跳转目标相对应;

指令/字节码转换器,用于将更正后的指令序列转换成字节码,即为混淆后的字节码,并将其输出。

一种基于智能合约字节码特征的合约代码混淆方法,该方法具体包括如下步骤:

s1:合约开发者通过智能合约编译器生成原始的字节码;

s2:将所述的原始字节码输入合约代码混淆平台,并选择希望使用的混淆方法;

s3:所述的合约代码混淆平台将所述的原始字节码转换成指令序列,并根据所述的混淆方法,提取出需要改写的指令位置和原始跳转目标地址,然后生成插入指令并在指令序列相应位置上插入所述的插入指令,然后再更正指令序列的跳转地址,使其与正确的跳转地址相对应,最后将更正后的指令序列转换成字节码,即得到混淆后的字节码,并将其输出。

进一步地,所述的s3具体包括如下的子步骤:

s3.1:线性扫描所述的原始字节码,在这个过程中通过合约编译器给出的默认合约初始化代码段和swarm哈希始末特征码识别出合约初始化代码段和swarm哈希段;

s3.2:将所述的原始字节码反编译成以太坊虚拟机的指令和立即数,并用这些信息创建出一个合约副本;

s3.3:通过维持模拟栈,所述的合约代码混淆平台一步步执行合约代码,遍历所有能够走到的分支,期间识别出合约的函数选择器段、合约函数段和数据段,将合约副本中的跳转指令与跳转指令所用到的值标记出来;

s3.4:根据标记的指令,生成并插入所述的混淆方法对应的指令序列;

s3.5:将指令中错位的跳转地址更正,完成混淆。

进一步地,所述的混淆方法选择如下方法中的任一种:

(1)通过加入一条push指令让工具在线性扫描字节码的时候找到误识别出两个合约初始化代码起始特征,导致工具识别出错误的合约主体代码;

(2)通过改写swarm哈希段中的字节码,并且改写合约中的跳转指令附近指令,使得原合约中的所有跳转指令都会经由swarm哈希段跳转去各自的目标地址,将合约的控制流图扁平化;

(3)通过打断函数选择器的特征序列阻止合约分析工具获取合约中存有的函数签名;

(4)通过插入大量jumpdest指令,让使用了符号执行和模拟执行的分析工具被迫维持大量的基本块入口状态,进而使工具运行缓慢甚至崩溃;

(5)通过将用于跳转的立即数改换为一系列立即数的运算结果,使得默认跳转目标地址一定是立即数的工具无法解析合约中的跳转地址;

(6)通过将用于跳转的目标地址放入内存并通过调用预编译合约的方式取回,让静态分析工具误以为调用了一个链上的合约,从而丢失跳转目标地址信息。

本发明的有益效果如下:

针对可能有人用已有的分析工具解析智能合约字节码这样的情况,合约开发者可以采用本发明的混淆装置和混淆方法为合约加一层混淆,加强自己合约字节码的不可读性,从而加强对合约代码的保护。

附图说明

图1为基于智能合约字节码特征的合约代码混淆平台的示意图;

图2是基于智能合约字节码特征的合约代码混淆方法的流程图。

具体实施方式

下面根据附图和优选实施例详细描述本发明,本发明的目的和效果将变得更加明白,应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

如图1所示,本发明的基于智能合约字节码特征的合约代码混淆平台包括:

字节码/指令转换器,用于接收原始字节码,并根据目标混淆方法将所述的原始字节码转换成指令序列,以表示出可执行段;

信息提取器,用于根据混淆方法,提取出注入所述的指令序列和跳转目标重解析所需要的信息,包括需要改写的指令位置和原始跳转目标地址,并将其保存下来,并将需要改写的指令位置发送给字节码注入器,将原始跳转目标地址发送给跳转目标重解析器;

字节码注入器,根据混淆方法生成插入指令,并在指令序列相应位置上插入,形成新的指令序列,并发送给跳转目标重解析器;由于此举会改变原始字节码的大小,导致原本的跳转地址不再对应正确的跳转目标,所以会需要将新的指令序列发送给跳转目标重解析器将这些错位的跳转地址更正过来。

跳转目标重解析器,用于更正新的指令序列的跳转地址,使其与正确的跳转目标相对应;

指令/字节码转换器,用于将更正后的指令序列转换成字节码,即为混淆后的字节码,并将其输出。

如图2所示,本发明的基于智能合约字节码特征的合约代码混淆方法,具体包括如下步骤:

s1:合约开发者通过智能合约编译器生成原始的字节码;

s2:将所述的原始字节码输入合约代码混淆平台,并选择希望使用的混淆方法;

s3:所述的合约代码混淆平台将所述的原始字节码转换成指令序列,并根据所述的混淆方法,提取出需要改写的指令位置和原始跳转目标地址,然后生成插入指令并在指令序列相应位置上插入所述的插入指令,然后再更正指令序列的跳转地址,使其与正确的跳转地址相对应,最后将更正后的指令序列转换成字节码,即得到混淆后的字节码,并将其输出。具体过程如下:

s3.1:线性扫描所述的原始字节码,在这个过程中通过合约编译器给出的默认合约初始化代码段和swarm哈希始末特征码识别出合约初始化代码段和swarm哈希段;

s3.2:将所述的原始字节码反编译成以太坊虚拟机的指令和立即数,并用这些信息创建出一个合约副本;

s3.3:通过维持模拟栈,所述的合约代码混淆平台一步步执行合约代码,遍历所有能够走到的分支,期间识别出合约的函数选择器段、合约函数段和数据段,将合约副本中的跳转指令与跳转指令所用到的值标记出来;

s3.4:根据标记的指令,生成并插入所述的混淆方法对应的指令序列;

s3.5:将指令中错位的跳转地址更正,完成混淆。

特别地,在这里用到的混淆方法有六种:

(1)通过加入一条push指令让工具在线性扫描字节码的时候找到误识别出两个合约初始化代码起始特征,导致工具识别出错误的合约主体代码。

(2)通过改写swarm哈希段中的字节码,并且改写合约中的跳转指令附近指令,使得原合约中的所有跳转指令都会经由swarm哈希段跳转去各自的目标地址,将合约的控制流图扁平化。

(3)通过打断函数选择器的特征序列阻止合约分析工具获取合约中存有的函数签名。

(4)通过插入大量jumpdest指令,让使用了符号执行和模拟执行的分析工具被迫维持大量的基本块入口状态,进而使工具运行缓慢甚至崩溃。

(5)通过将用于跳转的立即数改换为一系列立即数的运算结果,使得默认跳转目标地址一定是立即数的工具无法解析合约中的跳转地址。

(6)通过将用于跳转的目标地址放入内存并通过调用预编译合约的方式取回,让静态分析工具误以为调用了一个链上的合约(也就是智能合约场景下的动态信息,静态分析工具认为这样的信息无从得知),丢失跳转目标地址信息。

本领域普通技术人员可以理解,以上所述仅为发明的优选实例而已,并不用于限制发明,尽管参照前述实例对发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在发明的精神和原则之内,所做的修改、等同替换等均应包含在发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1