Skip to content

Commit 512a6e7

Browse files
committed
Tidy up EVM hooks (round 2)
1 parent bafc859 commit 512a6e7

File tree

1 file changed

+19
-30
lines changed

1 file changed

+19
-30
lines changed

qiling/arch/evm/hooks.py

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@
33
# Cross Platform and Multi Architecture Advanced Binary Emulation Framework
44

55
import types
6+
from enum import IntEnum
67
from typing import MutableMapping, MutableSequence
78

89
from qiling.core_hooks_types import Hook, HookAddr, HookIntr, HookRet
910

11+
class EVM_HOOK(IntEnum):
12+
CODE = (1 << 0)
13+
ADDR = (1 << 1)
14+
INSN = (1 << 2)
15+
1016
class QlArchEVMHooks:
1117
def __init__(self) -> None:
1218
self.hook_code_list: MutableSequence[Hook] = []
@@ -15,37 +21,39 @@ def __init__(self) -> None:
1521

1622
evm_hooks_info = QlArchEVMHooks()
1723

18-
19-
def evm_hook_code(ql, callback, user_data=None, begin=1, end=0, *args):
24+
def __evm_hook_code(ql, callback, user_data=None, begin=1, end=0):
2025
h = Hook(callback, user_data, begin, end)
2126
evm_hooks_info.hook_code_list.append(h)
2227

23-
return HookRet(ql, 'HOOK_CODE', h)
28+
return HookRet(ql, EVM_HOOK.CODE, h)
2429

25-
def evm_hook_insn(ql, callback, intno, user_data=None, begin=1, end=0):
30+
def __evm_hook_insn(ql, callback, intno, user_data=None, begin=1, end=0):
2631
h = HookIntr(callback, intno, user_data)
2732
evm_hooks_info.hook_insn_list.append(h)
2833

29-
return HookRet(ql, 'HOOK_INSN', h)
34+
return HookRet(ql, EVM_HOOK.INSN, h)
3035

31-
def evm_hook_address(ql, callback, address, user_data):
36+
def __evm_hook_address(ql, callback, address, user_data=None):
3237
h = HookAddr(callback, address, user_data)
3338

3439
if address not in evm_hooks_info.hook_addr_dict:
3540
evm_hooks_info.hook_addr_dict[address] = []
3641

3742
evm_hooks_info.hook_addr_dict[address].append(h)
3843

39-
return HookRet(ql, 'HOOK_ADDR', h)
44+
return HookRet(ql, EVM_HOOK.ADDR, h)
45+
46+
def __evm_hook_del(ql, hret):
47+
h = hret.obj
48+
hook_type = hret.type
4049

41-
def evm_hook_del(hook_type, h):
42-
if hook_type == "HOOK_CODE":
50+
if hook_type == EVM_HOOK.CODE:
4351
evm_hooks_info.hook_code_list.remove(h)
4452

45-
elif hook_type == "HOOK_INSN":
53+
elif hook_type == EVM_HOOK.INSN:
4654
evm_hooks_info.hook_insn_list.remove(h)
4755

48-
elif hook_type == 'HOOK_ADDR':
56+
elif hook_type == EVM_HOOK.ADDR:
4957
if h.addr in evm_hooks_info.hook_addr_dict:
5058
hooks_list = evm_hooks_info.hook_addr_dict[h.addr]
5159

@@ -59,25 +67,6 @@ def monkeypath_core_hooks(ql):
5967
"""Monkeypath core hooks for evm
6068
"""
6169

62-
def __evm_hook_code(self, callback, user_data=None, begin=1, end=0):
63-
return evm_hook_code(self, callback, user_data, begin, end)
64-
65-
def __evm_hook_address(self, callback, address, user_data=None):
66-
return evm_hook_address(self, callback, address, user_data)
67-
68-
def __evm_hook_insn(self, callback, arg1, user_data=None, begin=1, end=0):
69-
return evm_hook_insn(self, callback, arg1, user_data, begin, end)
70-
71-
def __evm_hook_del(self, *args):
72-
if len(args) != 1 and len(args) != 2:
73-
return
74-
75-
if isinstance(args[0], HookRet):
76-
args[0].remove()
77-
return
78-
79-
return evm_hook_del(*args)
80-
8170
ql.hook_code = types.MethodType(__evm_hook_code, ql)
8271
ql.hook_address = types.MethodType(__evm_hook_address, ql)
8372
ql.hook_insn = types.MethodType(__evm_hook_insn, ql)

0 commit comments

Comments
 (0)