Структура для анализа высокого уровня Ethereum Bytecode. Ethir создает полный и звучный CFG байтереума и генерирует представление на основе правил (RBR) программы. Это высокоуровневое представление позволяет применять существующие анализы высокого уровня, чтобы вывести свойства кода EVM.
Загрузите источник папки, который содержит статический исполняемый файл компилятора Solidity.
Добавьте его к пути и проверьте, что он установлен.
sudo cp source/solc* /usr/bin/
sudo chmod 755 /usr/bin/solc*
solc --version
solcv5 --version
solcv6 --version
Если вы хотите установить последнюю версию:
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
Статический исполняемый файл приведен в источнике папки.
Добавьте OT в путь и проверьте, что он установлен.
sudo cp source/evm* /usr/bin/
sudo chmod 755 /usr/bin/evm*
evm --version
Если вы хотите установить последнюю версию:
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
Загрузите папку исходного кода.
Распаковывать папку и установить ее.
unzip z3-z3-4.5.0.zip
cd z3-z3-4.5.0
python scripts/mk_make.py --python
cd build
make
sudo make install
Используйте команду pip install для установки Six, запрашивает библиотеки Python.
pip install six
pip install requests
Вышеуказанные команды могут выйти из строя в зависимости от версии PIP. Если это так, запустите следующую команду вместо предыдущих.
python -m pip install six
python -m pip install requests
Чтобы проверить версию запустить команду pip -V .
Чтобы выполнить этир, запустите одну из следующих команд внутри папки Ethir :
./oyente-ethir -s file_name.sol
./oyente-ethir -s file_name.evm -b
./oyente-ethir -s file_name.disasm -disasm
Команда ./oyente-ethir -h отображает список со всеми доступными параметрами Ethir. Некоторые из наиболее актуальных:
./oyente-ethir -s filename -cfg
./oyente-ethir -s filename -saco
./oyente-ethir -s filename -d
Все файлы, сгенерированные Ethir во время его выполнения, хранятся в Direcrtory/TMP/Costabs/.
После установки Ethir, предположим, что мы хотим сгенерировать RBR от блокировки файлов разборки. Evm.disasm, доступные в примерах папки. Во -первых, мы должны перейти в каталог Ethir и выполнить команду ./oyente-ethir -s ../examples/blockking.evm.disasm -disasm там.
Во время исполнения Ethir создал каталог /TMP/Costabs/ где он хранит RBR, связанный с файлом блокировки . Evm.disasm. Если мы проверим этот каталог, мы найдем файл с именем RBR.RBR , который содержит RBR. Если мы откроем файл с любым общим редактором (GEDIT, EMACS), мы увидим генерируемый RBR. Ниже приведен Scecth of RBR, сгенерированный для блокировки .
block0(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(8), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), calldatasize, calldataload, gas, caller, callvalue, number, gasprice, balance)=>
s(0) = 96
s(1) = 64
l(0) = s(0)
s(0) = calldatasize
call(jump0(s(0),g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(8), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), calldatasize, calldataload, gas, caller, callvalue, number, gasprice, balance))
jump0(s(0), g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, calldatasize, caller, callvalue, gas, gasprice, number)=>
eq(s(0), 0)
call(block174(g(11), g(8), g(4), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), caller, callvalue, gas, gasprice, number))
jump0(s(0), g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, calldatasize, caller, callvalue, gas, gasprice, number)=>
neq(s(0), 0)
call(block11(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number))
block11(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number)=>
s(0) = 224
s(1) = 2
s(0) = s(1)^s(0)
s(1) = 0
s(1) = calldataload
s(0) = s(1)/s(0)
s(1) = 607252836
s(2) = s(0)
call(jump11(s(2),s(1),s(0),g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number))
Если мы выполняем команду ./oyente-ethir -s ../examples/blockking.evm.disasm -disasm -eop Ниже приведен эскиз RBR с аннотациями NOPS, сгенерированными для блокировки. Evm.disasm :
block0(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(8), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), calldatasize, calldataload, gas, caller, callvalue, number, gasprice, balance)=>
s(0) = 96
nop(PUSH1)
s(1) = 64
nop(PUSH1)
l(0) = s(0)
nop(MSTORE)
s(0) = calldatasize
nop(CALLDATASIZE)
call(jump0(s(0),g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(8), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), calldatasize, calldataload, gas, caller, callvalue, number, gasprice, balance))
nop(ISZERO)
nop(PUSH2)
nop(JUMPI)
jump0(s(0), g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, calldatasize, caller, callvalue, gas, gasprice, number)=>
eq(s(0), 0)
call(block174(g(11), g(8), g(4), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), caller, callvalue, gas, gasprice, number))
jump0(s(0), g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, calldatasize, caller, callvalue, gas, gasprice, number)=>
neq(s(0), 0)
call(block11(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number))
block11(g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number)=>
s(0) = 224
nop(PUSH1)
s(1) = 2
nop(PUSH1)
s(0) = s(1)^s(0)
nop(EXP)
s(1) = 0
nop(PUSH1)
s(1) = calldataload
nop(CALLDATALOAD)
s(0) = s(1)/s(0)
nop(DIV)
s(1) = 607252836
nop(PUSH4)
s(2) = s(0)
nop(DUP2)
call(jump11(s(2),s(1),s(0),g(11), g(10), g(9), g(8), g(7), g(6), g(5), g(4), g(3), g(2), g(1), g(0), l(7), l(6), l(5), l(4), l(3), l(2), l(1), l(0), balance, calldataload, caller, callvalue, gas, gasprice, number))
nop(EQ)
nop(PUSH2)
nop(JUMPI)
Эфир также позволяет нам хранить CFG анализируемого файла. В этом случае мы должны выполнить команду ./oyente-ethir -s ../examples/blockking.evm.disasm -disasm -cfg . Ethir сохраняет CFG в файле с расширением .cfg в каталоге /TMP/Costabs/ .
Обратите внимание, что файл может содержать более одного смарт -контракта. В этом случае Ethir генерирует один файл на каждый контракт RBR0.RBR, RBR1.RBR, ... RBRN.RBR.
Примеры папок содержит запущенные примеры для тестирования инструмента. Существуют как прочность, EVM, так и файлы разборки.
Большинство примеров, таких как Bloccking.evm.disasm, реклама. Sol, valloken.sol или Cryptophoenix.sol-это реальные контракты, полученные из блокчейна, в то время как другие, такие как Loop1.sol и Sum.sol, являются специальными примерами, где легче понять процесс декомпиляции.
SACO является статическим анализатором для параллельных объектов, которые могут вывести, среди прочих свойств, верхних границ на количество итераций петель. Обратите внимание, что это первый важный шаг, чтобы вывести потребление газа интеллектуальных контрактов.
Внутреннее представление SACO соответствует грамматике RBR, генерируемой ETHIR после незначительных синтаксических переводов. Благодаря этому он может доказать прекращение петель, которые некоторые из примеров содержат, и создает линейную границу для этих петель. Вот некоторые из границ петли, выведенных SACO для некоторых умных контрактов, содержащихся в примерах папки:
| Умный контракт | Граница | Умный контракт | Граница |
|---|---|---|---|
| Блоккинг | Nat (G8/10)*36+8934493 | Cryptophoenix | NAT (G3)*228409344+4113285485 |
| Loop1 | Nat (A)*25+234 | Элигма | Nat (_numberOfReturns)*2628+134 |
| Лотерея | 159 | Blocksquareseriea | 286 |
| Анклавы | 268 | Auctusether | 264 |
| Реклама | инф | Validtoken | инф |
Saco делает линейную границу для первых четырех интеллектуальных контрактов, показанных в таблице выше. Границы интеллектуальных контрактов блокируют и криптофеникс зависят от значения одной из их полей (восьмой и третий соответственно). Для интеллектуальных контрактов Loop1 и Eligma, полученные границы, полагаются на аргументы некоторых из его функций (A и _numberFreturns). В случае, если интеллектуальные контракты не содержат какого -либо петли в качестве лотереи, блокировки квадрат, анклавов или auctusether, Saco делает постоянную связь.
Обратите внимание, что из-за точных ограничений SACO (у него нет битовых операций и модели для функции SHA3), анализатор забывает информацию о битовых переменных. Из -за этого фактора Saco не может вывести связанную с некоторыми из интеллектуальных контрактов, таких как Validtoken или реклама и возврат Inf .
Другие анализаторы высокого уровня, которые работают над промежуточными формами, такими как интеллектуальные переходные системы или положения рога (например, Appove, T2, SolroningMax, Cofloco), также могут быть легко адаптированы для работы над программами, переведенными RBR, произведенными EthIR.
Если вам интересно использовать этир совместно с SACO Contact Developers Saco через проводник или новую проблему.
Вы можете попробовать первый прототип здесь. Гастап делает верхнюю часть газа, участвующего в каждой транзакции.