33# Cross Platform and Multi Architecture Advanced Binary Emulation Framework
44
55import types
6+ from enum import IntEnum
67from typing import MutableMapping , MutableSequence
78
89from 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+
1016class QlArchEVMHooks :
1117 def __init__ (self ) -> None :
1218 self .hook_code_list : MutableSequence [Hook ] = []
@@ -15,37 +21,39 @@ def __init__(self) -> None:
1521
1622evm_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