针对区块链智能合约函数签名自动化恢复的方法及系统技术方案

技术编号:29488545 阅读:127 留言:0更新日期:2021-07-30 18:59
本发明专利技术公开了一种针对区块链智能合约函数签名自动化恢复的方法及系统,属于区块链智能合约技术领域,解决现有无法正确恢复智能合约函数签名,进而无法调用智能合约中的public和external函数的问题。本发明专利技术将智能合约的字节码文件进行反汇编,得到反汇编代码文件;扫描反汇编代码文件中的反汇编代码,将反汇编代码分割成代码块;对分割的代码块进行静态分析,识别出public/external函数的代码块,即获得function id;对识别出的函数代码块使用类型感知符号执行方法,即基于类型规则采用类型感知符号执行方法,得到每个public/external函数的参数的类型,得到智能合约的函数的参数的类型列表;基于上述内容,得到智能合约的函数签名。

【技术实现步骤摘要】
针对区块链智能合约函数签名自动化恢复的方法及系统
一种针对区块链智能合约函数签名自动化恢复的方法及系统,用于函数签名自动化恢复,属于区块链智能合约

技术介绍
以太坊是目前规模最大的支持智能合约的公链,目前已有超过3000万个智能合约部署在其上。以太坊智能合约由高级语言编写,并编译为以太坊虚拟机字节码,智能合约中的public和external函数能够被使用者调用。目前主流的以太坊智能合约编译器为Solidity和Vyper。调用智能合约中函数时,使用者需要知道其函数签名,函数签名包含了函数的functionid和函数的参数的类型列表,其中functionid由函数名进行哈希运算并取前4字节得到,调用函数所使用的参数保存在调用数据calldata中。函数签名对于智能合约的恶意攻击检测,模糊测试以及智能合约字节码逆向工程具有重要价值,然而,现有的方法都无法高效地从智能合约字节码中恢复函数签名。函数签名恢复工具Gigahorse,Eveem和OnlineSolidityDecompiler通过查询EthereumFunctionSi本文档来自技高网...

【技术保护点】
1.一种恢复函数参数类型的方法,其特征在于,包括如下步骤:/nA1:自动生成智能合约并将生成的智能合约编译为字节码,其中,智能合约包含一个类型为public函数或external的函数,函数包含一个随机类型的参数和访问该参数的语句;/nA2:收集各类型的参数的访问模式;/nA3:基于所有参数的访问模式提取公共访问模式;/nA4:基于公共访问模式生成参数的符号表达式;/nA5:基于参数的公共访问模式和参数的符号表达式获得函数的参数的类型规则。/n

【技术特征摘要】
1.一种恢复函数参数类型的方法,其特征在于,包括如下步骤:
A1:自动生成智能合约并将生成的智能合约编译为字节码,其中,智能合约包含一个类型为public函数或external的函数,函数包含一个随机类型的参数和访问该参数的语句;
A2:收集各类型的参数的访问模式;
A3:基于所有参数的访问模式提取公共访问模式;
A4:基于公共访问模式生成参数的符号表达式;
A5:基于参数的公共访问模式和参数的符号表达式获得函数的参数的类型规则。


2.根据权利要求1所述的一种恢复函数参数类型的方法,其特征在于,所述步骤A1中使用Solidity或Vyper编译器支持的语法生成一个智能合约。


3.根据权利要求2所述的一种恢复函数参数类型的方法,其特征在于,所述步骤A2的具体实现为:
将编译后的智能合约进行反编译,得到反编译后的以太坊虚拟机指令,得到指令后,对指令进行数据依赖和控制依赖分析,分析后,定位访问参数的指令序列,即将指令序列作为函数的参数的访问模式,其中,定位访问参数的指令序列具体为:从每个public或external函数的入口处开始,检查public函数或external函数的指令序列,即搜索CALLDATALOAD指令和CALLDATACOPY指令,以及对CALLDATALOAD指令和CALLDATACOPY指令读取的数据进行运算和存储的指令,其中,CALLDATALOAD指令和CALLDATACOPY指令为从栈顶获取读取位置,即从调用数据的读取位置读取参数到栈顶的指令。


4.根据权利要求3所述的一种恢复函数参数类型的方法,其特征在于,所述步骤A3的具体实现为:
对于基础类型相同,但位宽度不同的同系列类型的参数,将同系列类型的参数的访问模式中都出现的指令序列提取为该系列类型的参数的公共访问模式,其中,基础类型是指uint类型或int类型,根据不同的位宽度,分别有uint<M>类型和int<M>类型,M是8的倍数,包括uint8,uint16,uint32,…,uint128,uint256,以及int8,int16,int32,…,int128,int256;uint8,uint16,uint32,…,uint128,uint256为同系列类型的参数,int8,int16,int32,…,int128,int256为同系列类型的参数。


5.根据权利要求4所述的一种恢复函数参数类型的方法,其特征在于,所述步骤A4的具体实现为:
将智能合约中的函数的调用数据视为符号,在获得的参数的访问模式上进行符号执行,执行后,获得函数的调用数据中每个变量的符号表达式,其中,函数的调用数据是指由函数的fucntionid和调用的函数传入的实参按照顺序和结构组织成的数据。


6.根据权利要求5所述的一种恢复函数参数类型的方法,其特征在于,所述步骤A5中基于参数的公共访问模式和参数的符号表达式获得31条参数的类型规则为,步骤A5的具体实现为:
R1:规则R1定义为x=CALLDATALOAD1(loc)∧y=CALLDATALOAD2(x+4),
其中,x=CALLDATALOAD1(loc)表示使用一条CALLDATALOAD指令从调用数据的loc位置读取32字节值,并赋值给x,实际上x为public函数或external函数中dynamicarray/bytes/string类型的参数的offset字段,由于参数num字段的位置为offset字段指示的位置再加上4个字节的fucntionid的长度,因此CALLDATALOAD读取参数的num字段,y=CALLDATALOAD2(x+4)表示使用一条CALLDATALOAD指令,从调用数据的x+4位置读取32字节值,并赋值给y,∧是一个逻辑运算符号,表示且,如果规则R1被满足,表明当前的指令序列读取的参数的类型为dynamicarray/bytes/string;
R2:规则R2定义为


其中,exp(loc)◇(offset+)表示CALLDATALOAD指令要读取调用数据的loc位置需要通过offset字段相加得出,exp(loc)◇(32×)表示loc位置的符号表达式中包含32的乘法,表示依赖于,L表示在执行CALLDATALOAD(loc)之前,需要先执行n个LT比较指令,CALLDATALOAD(loc)表示CALLDATALOAD指令从调用数据的loc位置读取数据,in,numn为LT比较指令的两个操作数,in表示array元素在第n维的下标,numn表示array第n维的长度,LT比较指令是比较in是否小于numn,即做边界检查,查看CALLDATALOAD读取的位置是否越界,exp(loc)表示将一个loc位置要符合的规则用一个式子表示出来,◇表示包含,∧是一个逻辑运算符号,表示且,如果规则R2被满足,表明该指令序列读取的参数的类型为external函数的n-维dynamicarray;
R3:规则R3定义为


其中,表示读取调用数据的loc位置不由offset计算出,表示在执行CALLDATALOAD(loc)之前,需要先执行n个LT比较指令,表示取反,exp(loc)、◇、in、numn、和∧的含义同规则R2中的含义相同,如果规则R3被满足,则表明函数的参数的类型为n-维staticarray;
R4:规则R4定义为x=CALLDATALOAD(loc),在R1、R2和R3都不满足时,将参数看作为uint256类型,R4表示在缺乏更多有效线索的情况下,只能获知x的长度为32字节,因此将x看作uint256类型,后续将使用其他规则将参数的类型进一步细化为特定类型;
R5:R5在R1满足后使用,规则R5定义为其中,x在规则R1中定义,规则R5表示CALLDATACOPY指令不在以LT比较指令为嵌套循环条件的循环中,即指CALLDATACOPY指令从调用数据的offsetm位置开始,读取len长度的数据,复制到内存的x+36位置,表示不存在,表示依赖于,如果规则R5被满足,则这条CALLDATACOPY读取的函数的参数的类型为1维dynamicarray/bytes/string,其中,嵌套循环条件就是指LT比较指令的执行结果,执行结果为真或假,结果为假,则退出循环,即CALLDATACOPY指令不在循环中,结果为真,继续循环;
R6:规则R6定义为其中,规则R6表示CALLDATACOPY指令从调用数据的offsetm位置开始,读取len长度的数据,复制到内存的ffsetc位置,且CALLDATACOPY指令不在以LT比较指令为嵌套循环条件的循环中,表示不存在,表示依赖于,其中,m和c为位置变量,如果规则R6被满足,表明函数的参数的类型为public函数的1维staticarray;
R7:规则R7在规则R5满足的前提下使用,定义为len==32×y,其中,len和y在规则R5和R1中定义,规则R7表示CALLDATACOPY指定的操作数len长度包含y与32的乘法,表明CALLDATACOPY指令从调用数据读取的数据为一个array,且array的每个元素都被扩展为32字节,因此,如果规则R7被满足,该CALLDATACOPY指令读取的参数的类型为1维dynamicarray类型;
R8:规则R8在R5被满足后使用,规则R8定义为其中,len和y在规则R5和R1中定义,的表示对y/32进行四舍五入,由于bytes/string类型在存入调用数据时需要扩展为32字节的整数倍,因此,如果规则R8被满足,则函数的参数的类型为public函数的bytes/string类型;
R9:规则R9定义为其中,num1,...numn均为常数,in、numn和的含义同规则R2中的含义相同,CALLDATACOPY(offsetm,offsetc,len)表示CALLDATACOPY指令从调用数据的offsetm位置开始,读取len长度的数据,复制到内存的ffsetc位置,规则R9表示CALLDATACOPY指令执行前,执行了n条LT比较指令,即CALLDATACOPY指令位于一个n层嵌套循环条件中,如果规则R9被满足,函数的参数的类型为public函数中的n+1维staticarray;
R10:规则R10在规则R1被满足后使用,R10被定义为

in、numn、和CALLDATACOPY(offsetm,offsetc,len)的含义同规则R9中的含义相同,规则R10表示CALLDATACOPY指令执行前,执行了n条LT比较指令,即CALLDATACOPY指令在n层嵌套循环条件中,如果规则R10被满足,则CALLDATACOPY指令读取的函数的参数的类型为public函数的n+1维dynamicarray;
R11:规则R11定义为AND(op1,op2),且op1的类型为uint256,op2的大端是k个0字节,k的范围在0到32之间,AND指令接受从栈顶读取的两个操作数op1,op2,作用是按位进行与操作,每位相等为1,不等为0,如果规则R11被满足,则将op1的参数的类型从uint256细化为uint<256-8×k>;
R12:规则R12定义为AND(op1,op2),且op1的类型为uint256,op2的小端是k个0字节,k的范围在0到32之间,AND指令接受从栈顶读取的两个操作数op1,op2,作用是按位进行与操作,每位相等为1,不等为0,由于bytes类型的参数的小端进行了0填充,读取时使用小端为0的数进行掩码操作,因此,如果规则R12被满足,则op1的参数的类型从uint256细化为bytes;
R13:规则R13定义为SIGEXTEND(op,m),且op的类型为uint256,0<m<32,op,m分别表示从栈顶读取的操作数,由于SIGEXTEND指令的功能为扩展有符号数类型参数的长度,因此,如果规则R13被满足,则将op的类型从uint256细化为int<(m+1)×8>;
R14:规则R14定义为x=ISZERO(op)∧y=ISZERO(x),且op的类型为uint256,x和y为本规则中定义的变量,x=ISZERO(op)表示检查op的值是否为0,如果为0,将1赋值给x,如果不为0,将0赋值给x,y=ISZERO(x)表示检查×的值是否为0,如果为0,将1赋值给y,如果不为0,将0赋值给y,规则R14表示使用两条ISZERO指令对op进行掩码操作,因此,如果规则R14被满足,将op的类型从uint256细化为bool;
R15:规则R15定义为SDIV/SMOD/SLT/SGT(op1,op2),且op1的类型为uint256,由于SDIV/SMOD/SLT/SGT分别表示SDIV指令、SMOD指令、SLT指令和SGT指令,SDIV指令、SMOD指令、SLT指令和SGT指令分别用于有符号数除法、有符号数取模、有符号数小于比较和有符号数大于比较,op1,op2分别表示从栈顶读取的操作数,因此,如果规则R15被满足,则将op1的类型由uint256细化为int256,对op2的类型不做要求;
R16:规则R16定义为op1,op1表示从栈顶读取的操作数,未被任何数学运算指令使用,且op1的类型为uint160,由于address类型的长度为160位,且不能使用数学运算指令处理address类型,因此,如果规则R16被满足,则op1的类型从uint160细化位address类型;
R17:规则R17定义为BYTE/MSTORE(op),且op的类型为bytes/string,op表示从栈顶读取的操作数,BYTE/MSTORE指令分别表示BYTE指令和STORE指令,都用于读取op的单个字节,由于bytes类型支持单个字节访问而string类型不支持,因此,如果规则R17被满足,则将op的类型细化为bytes;
R18:规则R18定义为BYTE(op),且op的类型为uint256,op表示从栈顶读取的操作数,BYTE指令用于读取op的单个字节,由于bytes类型支持使用该指令单个字节访问...

【专利技术属性】
技术研发人员:陈厅李子豪罗夏朴王晓峰王挺贺哲远房可昭张愉菲朱航李洪伟程岩张小松周健飞
申请(专利权)人:电子科技大学
类型:发明
国别省市:四川;51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1