具有静态和动态分析功能的以太坊字节码反汇编程序

ethereum-dasm的Python项目详细描述


以太坊DASM

以太坊EVM字节码反汇编程序,具有静态和动态分析以及函数签名查找功能

[https://github.com/ethereum/][https://www.ethereum.org/]

windows

反汇编evm字节码

asciicast

将合同反编译为伪代码

asciicast

安装

#> python3 -m pip install -r requirements*.txt
#> python3 -m pip install ethereum-dasm[mythril,abidecoder]
#> python3 -m ethereum-dasm  # verify installation
#> python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf  # jusst to verify installation

用法

Usage: ethereum_dasm.py [options]

       example: ethereum_dasm.py [-L -F -v] <file_or_bytecode>
                ethereum_dasm.py [-L -F -v] # read from stdin
                ethereum_dasm.py [-L -F -a <address>] # fetch contract code from infura.io


Options:
  -h, --help            show this help message and exit
  -v VERBOSITY, --verbosity=VERBOSITY
                        available loglevels:
                        critical,fatal,error,warning,warn,info,debug,notset
                        [default: critical]
  -L, --listing         disables table mode, outputs assembly only
  -F, --no-online-lookup
                        disable online function signature lookup
  -a ADDRESS, --address=ADDRESS
                        fetch contract bytecode from address
  -C, --no-color        disable color mode (requires pip install colorama)
  -A, --guess-abi       guess the ABI for that contract
  -D, --no-dynamic-analysis
                        disable dynamic analysis / symolic execution
  -S, --no-static-analysis
                        disable static analysis
  -s, --simplify        simplify disassembly to human readable code
  -x, --simplify-show-asm
                        simplify: show or hide asm annotations in simplified
                        code
  -y, --simplify-show-unreachable
                        simplify: show or hide annotations for unreachable
                        instructions in simplified code
  -n NETWORK, --network=NETWORK
                        network for address lookup (default: mainnet, ropsten,
                        rinkeby, kovan
#> echo "0x12345678" | python3 -m ethereum_dasm
#> python3 -m ethereum_dasm 0x12345678
#> python3 -m ethereum_dasm ether_contract.evm
#> python3 -m ethereum_dasm -a <contract address>
#> python3 -m ethereum_dasm -a <contract address>  -A
#> python3 -m ethereum_dasm -a <contract address>  --simplify [--simplify-show-asm, --simplify-show-unreachable]

功能

  • 反汇编evm字节码
  • 将evm字节码反编译为伪码
  • 提供以太坊虚拟机字节码或字节码的路径作为evmdasm的参数。默认情况下尝试从stdin读取。
  • 回来了!=0(错误时)
  • 各种输出模式(-L从表格模式切换到列表模式)
  • 颜色模式
  • 无效操作码的前缀是UNKNOWN_
  • 指令用气量
  • 指令的返回值和参数
  • 基本跳转/外部参照分析
  • 基本锁定
  • 联机函数签名和方法名查找,操作数注释
  • 应付修饰语检测
  • 基于符号执行的动态分析(取决于mythril)
  • abi.json下载(从etherchain.org)
  • 从evm字节码的静态分析重构abi.json
  • 主界面Contract()

示例

abi联机查找或重建#>python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf -A

# [....][{'stateMutability':'nonpayable','constant':False,'type':'function','name':'enter','signature':'0x124c32a1','outputs':[{'type':'bool','name':''}],'inputs':[{'type':'bytes32','name':'_passcode'},{'type':'bytes8','name':'_gateKey'}],'payable':False},{'stateMutability':'pure','constant':True,'type':'function','name':'maxEntrants','signature':'0x60643652','outputs':[{'type':'uint8','name': ''}], 'inputs': [], 'payable': False}, {'stateMutability': 'view', 'constant': True, 'type': 'function', 'name': 'totalEntrants', 'signature': '0x694463a2', 'outputs': [{'type': 'uint8', 'name': ''}], 'inputs': [], 'payable': False}, {'stateMutability': 'nonpayable', 'constant': False, 'type': 'function', 'name': 'assignAll', 'signature': '0x90ae631d', 'outputs': [{'type': 'bool', 'name': ''}], 'inputs': [], 'payable': False}, {'inputs': [], 'stateMutability': 'nonpayable', 'payable': False, 'type': 'constructor'}]

ABI重建(如果ABI不可用) #> python3 -m ethereum_dasm -a 0x8f8bed23a644f3bbb4e227e28704c050e67c35be -A

[{'signature': '0x95d89b41', 'outputs': [], 'stateMutability': None, 'name': 'symbol', 'constant': None, 'inputs': [], 'payable': True, 'type': 'function', 'address': 598}, {'signature': '0x095ea7b3', 'outputs':
 [], 'stateMutability': None, 'name': 'approve', 'constant': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 328}, {'signature': '0x313ce567', 'outputs': [], 'stateMutab
ility': None, 'name': 'decimals', 'constant': None, 'inputs': [], 'payable': True, 'type': 'function', 'address': 486}, {'signature': '0xdd62ed3e', 'outputs': [], 'stateMutability': None, 'name': 'allowance', 'c
onstant': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 691}, {'signature': '0x66188463', 'outputs': [], 'stateMutability': None, 'name': 'decreaseApproval', 'constant
': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 529}, {'signature': '0x23b872dd', 'outputs': [], 'stateMutability': None, 'name': 'transferFrom', 'constant': None, 'i
nputs': ['bytes32', 'bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 423}, {'signature': '0x2ff2e9dc', 'outputs': [], 'stateMutability': None, 'name': 'INITIAL_SUPPLY', 'constant': None,
'inputs': [], 'payable': True, 'type': 'function', 'address': 465}, {'signature': '0x06fdde03', 'outputs': [], 'stateMutability': None, 'name': 'name', 'constant': None, 'inputs': [], 'payable': True, 'type': 'f
unction', 'address': 190}, {'signature': '0x18160ddd', 'outputs': [], 'stateMutability': None, 'name': 'totalSupply', 'constant': None, 'inputs': [], 'payable': True, 'type': 'function', 'address': 384}, {'signa
ture': '0x70a08231', 'outputs': [], 'stateMutability': None, 'name': 'balanceOf', 'constant': None, 'inputs': ['<bytes??>'], 'payable': True, 'type': 'function', 'address': 565}, {'signature': '0xa9059cbb', 'out
puts': [], 'stateMutability': None, 'name': 'transfer', 'constant': None, 'inputs': [{'type': 'address', 'name': 'arg0'}, {'type': 'uint256', 'name': 'arg1'}], 'payable': True, 'type': 'function', 'address': 619
}, {'signature': '0xd73dd623', 'outputs': [], 'stateMutability': None, 'name': 'increaseApproval', 'constant': None, 'inputs': ['bytes32', '<bytes??>'], 'payable': True, 'type': 'function', 'address': 655}]

详细列表

python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf -A --no-color

Instaddrhexgas|mnemonicoperandxrefsdescriptionretvalargs------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:loc_0x00[00x0000]3|PUSH10x60# Place 1 byte item on stack.                                         item1[20x0002]3|PUSH10x40# Place 1 byte item on stack.                                         item2[40x0004]3|MSTORE# Save word to memory.                                                                 value, offset3[50x0005]3|PUSH10x04# Place 1 byte item on stack.                                         item4[70x0007]2|CALLDATASIZE# Get size of input data in current environment.                      msg.data.length5[80x0008]3|LT# Lesser-than comparison                                              flag             a, b6[90x0009]3|PUSH20x0048# Place 2-byte item on stack.                                         item7[120x000c]10|JUMPI@0x48# Conditionally alter the program counter.                                             evm.pc, condition8[130x000d]3|PUSH40xffffffff# Place 4-byte item on stack.                                         item9[180x0012]3|PUSH10xe0# Place 1 byte item on stack.                                         item10[200x0014]3|PUSH10x02# Place 1 byte item on stack.                                         item11[220x0016]10|EXP# Exponential operation.                                              result           base, exponent12[230x0017]3|PUSH10x00# Place 1 byte item on stack.                                         item13[250x0019]3|CALLDATALOAD# Get input data of current environment.                              msg.data         unknown14[260x001a]5|DIV# Integer division operation.                                         result           a, b15[270x001b]3|AND# Bitwise AND operation.                                              result           a, b16[280x001c]3|PUSH40x124c32a1-->'function enter(bytes32,bytes8)'# Place 4-byte item on stack.                                         item17[330x0021]3|DUP2# Duplicate 2nd stack item.18[340x0022]3|EQ# Equality  comparison                                                flag             a, b19[350x0023]3|PUSH20x004d# Place 2-byte item on stack.                                         item20[380x0026]10|JUMPI@0x4d# Conditionally alter the program counter.                                             evm.pc, condition21[390x0027]3|DUP1# Duplicate 1st stack item.22[400x0028]3|PUSH40x60643652-->'function maxEntrants()'# Place 4-byte item on stack.                                         item23[450x002d]3|EQ# Equality  comparison                                                flag             a, b24[460x002e]3|PUSH20x0095# Place 2-byte item on stack.                                         item25[490x0031]10|JUMPI@0x95# Conditionally alter the program counter.                                             evm.pc, condition26[500x0032]3|DUP1# Duplicate 1st stack item.27[510x0033]3|PUSH40x694463a2-->'function totalEntrants()'# Place 4-byte item on stack.                                         item28[560x0038]3|EQ# Equality  comparison                                                flag             a, b29[570x0039]3|PUSH20x00be# Place 2-byte item on stack.                                         item30[600x003c]10|JUMPI@0xbe# Conditionally alter the program counter.                                             evm.pc, condition31[610x003d]3|DUP1# Duplicate 1st stack item.32[620x003e]3|PUSH40x90ae631d-->'function assignAll()'# Place 4-byte item on stack.                                         item33[670x0043]3|EQ# Equality  comparison                                                flag             a, b34[680x0044]3|PUSH20x00d1# Place 2-byte item on stack.                                         item35[710x0047]10|JUMPI@0xd1# Conditionally alter the program counter.                                             evm.pc, condition:loc_0x4836[720x0048]1|JUMPDESTJUMPI@0xc# Mark a valid destination for jumps.37[730x0049]3|PUSH10x00# Place 1 byte item on stack.                                         item38[750x004b]3|DUP1# Duplicate 1st stack item.39[760x004c]0|REVERT# throw an error                                                                       offset, size:loc_0x4d/*******************************************************************functionenter(bytes32,bytes8)payable:Falseinputs:(2)['bytes32','<bytes??>']potentialsignatures:['enter(bytes32,bytes8)']*******************************************************************/40[770x004d]1|JUMPDESTJUMPI@0x26# Mark a valid destination for jumps.41[780x004e]2|CALLVALUE# Get deposited value by the instruction/transaction responsible for  msg.valuethisexecution.42[790x004f]3|ISZERO# Simple not operator                                                 flag             a43[800x0050]3|PUSH20x0058# Place 2-byte item on stack.                                         item44[830x0053]10|JUMPI@0x58# Conditionally alter the program counter.                                             evm.pc, condition45[840x0054]3|PUSH10x00# Place 1 byte item on stack.                                         item46[860x0056]3|DUP1# Duplicate 1st stack item.47[870x0057]0|REVERT# throw an error                                                                       offset, size:loc_0x5848[880x0058]1|JUMPDESTJUMPI@0x53# Mark a valid destination for jumps.49[890x0059]3|PUSH20x0081# Place 2-byte item on stack.                                         item50[920x005c]3|PUSH10x04# Place 1 byte item on stack.                                         item51[940x005e]3|CALLDATALOAD# Get input data of current environment.                              msg.data         unknown52[950x005f]3|PUSH240xffffffffffffffffffffffffffffffffffffffffffffffff# Place 24-byte item on stack.                                        item53[1200x0078]3|NOT# Bitwise NOT operation.                                              result           a, b54[1210x0079]3|PUSH10x24# Place 1 byte item on stack.                                         item55[1230x007b]3|CALLDATALOAD# Get input data of current environment.                              msg.data         unknown56[1240x007c]3|AND# Bitwise AND operation.                                              result           a, b57[1250x007d]3|PUSH20x00e4# Place 2-byte item on stack.                                         item58[1280x0080]8|JUMP@0xe4# Alter the program counter.                                                           evm.pc:loc_0x8159[1290x0081]1|JUMPDEST# Mark a valid destination for jumps.60[1300x0082]3|PUSH10x40# Place 1 byte item on stack.                                         item61[1320x0084]3|MLOAD# Load word from memory.                                                               offset62[1330x0085]3|SWAP1# Exchange 1st and 2nd stack items.63[1340x0086]3|ISZERO# Simple not operator                                                 flag             a64[1350x0087]3|ISZERO# Simple not operator                                                 flag             a65[1360x0088]3|DUP2# Duplicate 2nd stack item.66[1370x0089]3|MSTORE# Save word to memory.                                                                 value, offset67[1380x008a]3|PUSH10x20# Place 1 byte item on stack.                                         item68[1400x008c]3|ADD# Addition operation.                                                 result           a, b69[1410x008d]3|PUSH10x40# Place 1 byte item on stack.                                         item70[1430x008f]3|MLOAD# Load word from memory.                                                               offset71[1440x0090]3|DUP1# Duplicate 1st stack item.72[1450x0091]3|SWAP2# Exchange 1st and 3rd stack items.73[1460x0092]3|SUB# Subtraction operation.                                              result           a, b74[1470x0093]3|SWAP1# Exchange 1st and 2nd stack items.75[1480x0094]0|RETURN# Halt execution returning output data.                                                offset, size:loc_0x95/*******************************************************************functionmaxEntrants()payable:Falseinputs:(0)[]potentialsignatures:['maxEntrants()']*******************************************************************/76[1490x0095]1|JUMPDESTJUMPI@0x31# Mark a valid destination for jumps.77[1500x0096]2|CALLVALUE# Get deposited value by the instruction/transaction responsible for  msg.valuethisexecution.78[1510x0097]3|ISZERO# Simple not operator                                                 flag             a79[1520x0098]3|PUSH20x00a0# Place 2-byte item on stack.                                         item80[1550x009b]10|JUMPI@0xa0# Conditionally alter the program counter.                                             evm.pc, condition81[1560x009c]3|PUSH10x00# Place 1 byte item on stack.                                         item82[1580x009e]3|DUP1# Duplicate 1st stack item.83[1590x009f]0|REVERT# throw an error                                                                       offset, size:loc_0xa084[1600x00a0]1|JUMPDESTJUMPI@0x9b# Mark a valid destination for jumps.85[1610x00a1]3|PUSH20x00a8# Place 2-byte item on stack.                                         item86[1640x00a4]3|PUSH20x0314# Place 2-byte item on stack.                                         item87[1670x00a7]8|JUMP@0x314# Alter the program counter.                                                           evm.pc:loc_0xa888[1680x00a8]1|JUMPDEST# Mark a valid destination for jumps.89[1690x00a9]3|PUSH10x40# Place 1 byte item on stack.                                         item90[1710x00ab]3|MLOAD# Load word from memory.                                                               offset91[1720x00ac]3|PUSH10xff# Place 1 byte item on stack.                                         item92[1740x00ae]3|SWAP1# Exchange 1st and 2nd stack items.93[1750x00af]3|SWAP2# Exchange 1st and 3rd stack items.94[1760x00b0]3|AND# Bitwise AND operation.                                              result           a, b95[1770x00b1]3|DUP2# Duplicate 2nd stack item.96[1780x00b2]3|MSTORE# Save word to memory.                                                                 value, offset97[1790x00b3]3|PUSH10x20# Place 1 byte item on stack.                                         item98[1810x00b5]3|ADD# Addition operation.                                                 result           a, b99[1820x00b6]3|PUSH10x40# Place 1 byte item on stack.                                         item100[1840x00b8]3|MLOAD# Load word from memory.                                                               offset101[1850x00b9]3|DUP1# Duplicate 1st stack item.102[1860x00ba]3|SWAP2# Exchange 1st and 3rd stack items.103[1870x00bb]3|SUB# Subtraction operation.                                              result           a, b104[1880x00bc]3|SWAP1# Exchange 1st and 2nd stack items.105[1890x00bd]0|RETURN# Halt execution returning output data.                                                offset, size:loc_0xbe/*******************************************************************functiontotalEntrants()payable:Falseinputs:(0)[]potentialsignatures:['totalEntrants()']*******************************************************************/106[1900x00be]1|JUMPDESTJUMPI@0x3c# Mark a valid destination for jumps.107[1910x00bf]2|CALLVALUE# Get deposited value by the instruction/transaction responsible for  msg.valuethisexecution.108[1920x00c0]3|ISZERO# Simple not operator                                                 flag             a109[1930x00c1]3|PUSH20x00c9# Place 2-byte item on stack.                                         item110[1960x00c4]10|JUMPI@0xc9# Conditionally alter the program counter.                                             evm.pc, condition111[1970x00c5]3|PUSH10x00# Place 1 byte item on stack.                                         item112[1990x00c7]3|DUP1# Duplicate 1st stack item.113[2000x00c8]0|REVERT# throw an error                                                                       offset, size:loc_0xc9114[2010x00c9]1|JUMPDESTJUMPI@0xc4# Mark a valid destination for jumps.115[2020x00ca]3|PUSH20x00a8# Place 2-byte item on stack.                                         item116[2050x00cd]3|PUSH20x031a# Place 2-byte item on stack.                                         item117[2080x00d0]8|JUMP@0x31a# Alter the program counter.                                                           evm.pc:loc_0xd1/*******************************************************************functionassignAll()payable:Falseinputs:(0)[]potentialsignatures:['assignAll()']*******************************************************************/118[2090x00d1]1|JUMPDESTJUMPI@0x47# Mark a valid destination for jumps.119[2100x00d2]2|CALLVALUE# Get deposited value by the instruction/transaction responsible for  msg.valuethisexecution.120[2110x00d3]3|ISZERO# Simple not operator                                                 flag             a121[2120x00d4]3|PUSH20x00dc# Place 2-byte item on stack.                                         item122[2150x00d7]10|JUMPI@0xdc# Conditionally alter the program counter.                                             evm.pc, condition123[2160x00d8]3|PUSH10x00# Place 1 byte item on stack.                                         item124[2180x00da]3|DUP1# Duplicate 1st stack item.125[2190x00db]0|REVERT# throw an error                                                                       offset, size:loc_0xdc126[2200x00dc]1|JUMPDESTJUMPI@0xd7# Mark a valid destination for jumps.127[2210x00dd]3|PUSH20x0081# Place 2-byte item on stack.                                         item128[2240x00e0]3|PUSH20x0320# Place 2-byte item on stack.                                         item129[2270x00e3]8|JUMP@0x320# Alter the program counter.                                                           evm.pc:loc_0xe4130[2280x00e4]1|JUMPDESTJUMP@0x80# Mark a valid destination for jumps.131[2290x00e5]3|PUSH10x00# Place 1 byte item on stack.                                         item132[2310x00e7]2|ORIGIN# Get execution origination address.                                  tx.origin133[2320x00e8]3|PUSH10x01# Place 1 byte item on stack.                                         item134[2340x00ea]3|PUSH10xa0# Place 1 byte item on stack.                                         item135[2360x00ec]3|PUSH10x02# Place 1 byte item on stack.                                         item136[2380x00ee]10|EXP# Exponential operation.                                              result           base, exponent137[2390x00ef]3|SUB# Subtraction operation.                                              result           a, b138[2400x00f0]3|AND# Bitwise AND operation.                                              result           a, b139[2410x00f1]2|CALLER# Get caller address.This is the address of the account that is       msg.senderdirectlyresponsibleforthisexecution.140[2420x00f2]3|PUSH10x01# Place 1 byte item on stack.                                         item141[2440x00f4]3|PUSH10xa0# Place 1 byte item on stack.                                         item142[2460x00f6]3|PUSH10x02# Place 1 byte item on stack.                                         item143[2480x00f8]10|EXP# Exponential operation.                                              result           base, exponent144[2490x00f9]3|SUB# Subtraction operation.                                              result           a, b145[2500x00fa]3|AND# Bitwise AND operation.                                              result           a, b146[2510x00fb]3|EQ# Equality  comparison                                                flag             a, b147[2520x00fc]3|ISZERO# Simple not operator                                                 flag             a148[2530x00fd]3|ISZERO# Simple not operator                                                 flag             a149[2540x00fe]3|ISZERO# Simple not operator                                                 flag             a150[2550x00ff]3|PUSH20x0107# Place 2-byte item on stack.                                         item151[2580x0102]10|JUMPI@0x107# Conditionally alter the program counter.                                             evm.pc, condition152[2590x0103]3|PUSH10x00# Place 1 byte item on stack.                                         item153[2610x0105]3|DUP1# Duplicate 1st stack item.154[2620x0106]0|REVERT# throw an error                                                                       offset, size[...]:loc_0x5d5954[14930x05d5]1|JUMPDESTJUMPI@0x5c9# Mark a valid destination for jumps.955[14940x05d6]2|POP# Remove item from stack.                                                              #dummy956[14950x05d7]3|SWAP1# Exchange 1st and 2nd stack items.957[14960x05d8]8|JUMP# Alter the program counter.                                                           evm.pc958[14970x05d9]0|STOP# Halts execution.959[14980x05da]750|LOG10x65# Append log record with one topic.                                                    start, size, topic1960[15000x05dc]3|PUSH30x7a7a72# Place 3-byte item on stack.                                         item961[15040x05e0]2|ADDRESS# Get address of currently executing account.                         this.address962[15050x05e1]2|PC# Get the value of the program counter prior to the increment.        evm.pc963[15060x05e2]30|SHA3# Compute Keccak-256 hash.                                            flag             offset, size964[15070x05e3]-1|UNKNOWN_0xf# Invalid opcode965[15080x05e4]3|SWAP4# Exchange 1st and 5th stack items.966[15090x05e5]3|SWAP14# Exchange 1st and 15th stack items.967[15100x05e6]2|CALLDATASIZE# Get size of input data in current environment.                      msg.data.length968[15110x05e7]-1|UNKNOWN_0xe1# Invalid opcode969[15120x05e8]-1|UNKNOWN_0xcb# Invalid opcode970[15130x05e9]3|PUSH220xc68ec825da862dc7082ea12aea89eb3783b2e0423cd2# Place 22-byte item on stack.                                        item971[15360x0600]30|SHA3# Compute Keccak-256 hash.                                            flag             offset, size972[15370x0601]-1|UNKNOWN_0x28# Invalid opcode973[15380x0602]3|PUSH160x0029# Place 16-byte item on stack.                                        item==============================reconstructedABI:[{'name':'enter','stateMutability':'nonpayable','signature':'0x124c32a1','payable':False,'inputs':[{'name':'_passcode','type':'bytes32'},{'name':'_gateKey','type':'bytes8'}],'constant':False,'type':'function','outputs':[{'name':'','type':'bool'}]},{'name':'maxEntrants','stateMutability':'pure','signature':'0x60643652','payable':False,'inputs':[],'constant':True,'type':'function','outputs':[{'name':'','type':'uint8'}]},{'name':'totalEntrants','stateMutability':'view','signature':'0x694463a2','payable':False,'inputs':[],'constant':True,'type':'function','outputs':[{'name':'','type':'uint8'}]},{'name':'assignAll','stateMutability':'nonpayable','signature':'0x90ae631d','payable':False,'inputs':[],'constant':False,'type':'function','outputs':[{'name':'','type':'bool'}]},{'stateMutability':'nonpayable','type':'constructor','payable':False,'inputs':[]}]

反编译为伪代码

python3 -m ethereum_dasm -a 0x44919b8026f38d70437a8eb3be47b06ab1c3e4bf --simplify #[--simplify-show-asm, --simplify-show-unreachable]

======================[simplified]

:init
        memory[0x40] = 0x60
        if (Not(ULE(0x4, 1_calldatasize))) goto LOC_0x48
        if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0xa1,
                If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x32,
                If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0x4c,
                If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x12)) goto function_enter (LOC_0x4d)
        if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0x52,
                If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x36,
                If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0x64,
                If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x60)) goto function_maxEntrants (LOC_0x95)
        if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0xa2,
                If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x63,
                If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0x44,
                If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x69)) goto function_totalEntrants (LOC_0xbe)
        if (And(If(1_calldatasize <= 0x3, 0x0, 1_calldata[0x3]) == 0x1d,
                If(1_calldatasize <= 0x2, 0x0, 1_calldata[0x2]) == 0x63,
                If(1_calldatasize <= 0x1, 0x0, 1_calldata[0x1]) == 0xae,
                If(1_calldatasize <= 0x0, 0x0, 1_calldata[0x0]) == 0x90)) goto function_assignAll (LOC_0xd1)

:LOC_0x48 
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:function_enter (LOC_0x4d) 
  /*******************************************************************
    function enter(bytes32,bytes8)
    payable: False
    inputs: (2) ['bytes32', '<bytes??>']
    potential signatures: ['enter(bytes32,bytes8)']
  *******************************************************************/

        if (call_value1 == 0x0) goto LOC_0x58
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0x58 
        goto LOC_0xe4

:LOC_0x81 

:function_maxEntrants (LOC_0x95) 
  /*******************************************************************
    function maxEntrants()
    payable: False
    inputs: (0) []
    potential signatures: ['maxEntrants()']
  *******************************************************************/

        if (call_value1 == 0x0) goto LOC_0xa0
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0xa0 
        goto LOC_0x314

:LOC_0xa8 
        memory[0x60] = 0xfa
        RETURN(offset=0x60, size=0x20)
        /******* <<terminates execution>> *******/

:function_totalEntrants (LOC_0xbe) 
  /*******************************************************************
    function totalEntrants()
    payable: False
    inputs: (0) []
    potential signatures: ['totalEntrants()']
  *******************************************************************/

        if (call_value1 == 0x0) goto LOC_0xc9
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0xc9 
        goto LOC_0x31a

:function_assignAll (LOC_0xd1) 
  /*******************************************************************
    function assignAll()
    payable: False
    inputs: (0) []
    potential signatures: ['assignAll()']
  *******************************************************************/

        if (call_value1 == 0x0) goto LOC_0xdc
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0xdc 
        goto LOC_0x320

:LOC_0xe4 
        if (Not(Extract(159, 0, origin1) ==
                0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef)) goto LOC_0x107
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0x107 
        if (True) goto LOC_0x114

:LOC_0x114 
        if (bvurem_i(1_gas, 0x1fff) == 0x0) goto LOC_0x11f
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0x11f 
        if (And(If(1_calldatasize <= 0x29, 0x0, 1_calldata[0x29]) == 0x0,
                If(1_calldatasize <= 0x28, 0x0, 1_calldata[0x28]) == 0x0)) goto LOC_0x154
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0x154 
        if (Not(And(If(1_calldatasize <= 0x27, 0x0, 1_calldata[0x27]) ==
                    0x0,
                    If(1_calldatasize <= 0x26, 0x0, 1_calldata[0x26]) ==
                    0x0,
                    If(1_calldatasize <= 0x25, 0x0, 1_calldata[0x25]) ==
                    0x0,
                    If(1_calldatasize <= 0x24, 0x0, 1_calldata[0x24]) ==
                    0x0))) goto LOC_0x18f
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0x18f 
        if (And(Extract(7, 0, origin1) ==
                If(1_calldatasize <= 0x2b, 0x0, 1_calldata[0x2b]),
                Extract(15, 8, origin1) ==
                If(1_calldatasize <= 0x2a, 0x0, 1_calldata[0x2a]),
                If(1_calldatasize <= 0x29, 0x0, 1_calldata[0x29]) == 0x0,
                If(1_calldatasize <= 0x28, 0x0, 1_calldata[0x28]) == 0x0)) goto LOC_0x1c0
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0x1c0 
        if (True) goto LOC_0x1d1

:LOC_0x1d1 
        memory[0x0] = 0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef
        memory[0x20] = 0x3
        if (True) goto LOC_0x1f7

:LOC_0x1f7 
        memory[0x0] = Concat(0x0, Extract(159, 0, origin1))
        memory[0x20] = 0x3
        if (True) goto LOC_0x21d

:LOC_0x21d 
        memory[0x60] = Concat(If(1_calldatasize <= 0x4, 0x0, 1_calldata[0x4]),
                   If(1_calldatasize <= 0x5, 0x0, 1_calldata[0x5]),
                   If(1_calldatasize <= 0x6, 0x0, 1_calldata[0x6]),
                   If(1_calldatasize <= 0x7, 0x0, 1_calldata[0x7]),
                   If(1_calldatasize <= 0x8, 0x0, 1_calldata[0x8]),
                   If(1_calldatasize <= 0x9, 0x0, 1_calldata[0x9]),
                   If(1_calldatasize <= 0xa, 0x0, 1_calldata[0xa]),
                   If(1_calldatasize <= 0xb, 0x0, 1_calldata[0xb]),
                   If(1_calldatasize <= 0xc, 0x0, 1_calldata[0xc]),
                   If(1_calldatasize <= 0xd, 0x0, 1_calldata[0xd]),
                   If(1_calldatasize <= 0xe, 0x0, 1_calldata[0xe]),
                   If(1_calldatasize <= 0xf, 0x0, 1_calldata[0xf]),
                   If(1_calldatasize <= 0x10, 0x0, 1_calldata[0x10]),
                   If(1_calldatasize <= 0x11, 0x0, 1_calldata[0x11]),
                   If(1_calldatasize <= 0x12, 0x0, 1_calldata[0x12]),
                   If(1_calldatasize <= 0x13, 0x0, 1_calldata[0x13]),
                   If(1_calldatasize <= 0x14, 0x0, 1_calldata[0x14]),
                   If(1_calldatasize <= 0x15, 0x0, 1_calldata[0x15]),
                   If(1_calldatasize <= 0x16, 0x0, 1_calldata[0x16]),
                   If(1_calldatasize <= 0x17, 0x0, 1_calldata[0x17]),
                   If(1_calldatasize <= 0x18, 0x0, 1_calldata[0x18]),
                   If(1_calldatasize <= 0x19, 0x0, 1_calldata[0x19]),
                   If(1_calldatasize <= 0x1a, 0x0, 1_calldata[0x1a]),
                   If(1_calldatasize <= 0x1b, 0x0, 1_calldata[0x1b]),
                   If(1_calldatasize <= 0x1c, 0x0, 1_calldata[0x1c]),
                   If(1_calldatasize <= 0x1d, 0x0, 1_calldata[0x1d]),
                   If(1_calldatasize <= 0x1e, 0x0, 1_calldata[0x1e]),
                   If(1_calldatasize <= 0x1f, 0x0, 1_calldata[0x1f]),
                   If(1_calldatasize <= 0x20, 0x0, 1_calldata[0x20]),
                   If(1_calldatasize <= 0x21, 0x0, 1_calldata[0x21]),
                   If(1_calldatasize <= 0x22, 0x0, 1_calldata[0x22]),
                   If(1_calldatasize <= 0x23, 0x0, 1_calldata[0x23]))
        memory[0x0] = KECCAC[If(1_calldatasize_<=_0x4,_0x0,_1_calldata[0x4])]
        memory[0x20] = 0x4
        if (False) goto LOC_0x257
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0x257 

:LOC_0x275 

:LOC_0x2d6 

:LOC_0x314 

:LOC_0x317 
        goto LOC_0xa8

:LOC_0x31a 
        goto LOC_0xa8

:LOC_0x320 
        if (False) goto LOC_0x338
        REVERT(offset=0x0, size=0x0)
        /******* <<terminates execution>> *******/

:LOC_0x338 

:LOC_0x347 

:LOC_0x3a8 

:LOC_0x3b9 

:LOC_0x3d8 

:LOC_0x3e0 

:LOC_0x3f5 

:LOC_0x459 

:LOC_0x46a 

:LOC_0x4de 

:LOC_0x541 

:LOC_0x552 

:LOC_0x556 

:LOC_0x55e 

:LOC_0x588 

:LOC_0x592 

:LOC_0x5b6 

:LOC_0x5bb 

:LOC_0x5c1 

:LOC_0x5d5 

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Java中使用BufferedReader类读取文本文件的子字符串   java如何在JSP页面上包含来自另一台服务器的动态JSP   使用单表策略的java持久化Hibernate继承映射   java报告状态失败达600秒。谋杀!报告hadoop的进展   java将字符串解析为形状   使用JTable的java ClassCastException?   java在Spring引导中关闭数据库   java Android Studio调试错误(Ubuntu)   java如何区分apache beam中KV实例中的两个键?   java将RealmObjectChangeListener添加到异步下载的RealmObject   java匹配模式之前的所有内容,包括新行和/或回车   java使用JAXB在XML中动态更改元素序列   java如何在MACOS中找到动态库(.dylib文件)的版本   Android中的java Nanohttpd服务器   java libGDX:3d动画不工作