1616logger = logging .getLogger (__name__ )
1717
1818class Hook :
19- def __init__ (self , emulator ):
19+ amd64_argument_regs = (UC_X86_REG_RCX , UC_X86_REG_RDX , UC_X86_REG_R8 , UC_X86_REG_R9 )
20+ def __init__ (self , emulator , arch ):
2021 self .emulator = emulator
22+ self .arch = arch
2123 self .uc = emulator .uc
2224 self .trace_target_modules = ['ntdll' , 'kernel32' , 'kernelbase' ]
2325 self .last_code_information = {}
@@ -31,20 +33,34 @@ def return_function(self, uc, return_address, arg_count, return_value):
3133 uc .reg_write (self .emulator .register .get_by_name ("sp" ), esp + 4 * (arg_count + 1 ))
3234 uc .reg_write (self .emulator .register .get_by_name ("ax" ), return_value )
3335
34- def callback (self , uc , address , size , user_data ):
35- self .emulator .instruction .dump_disassembly (address , size , find_symbol = True )
36+ def get_arguments (self , count ):
37+ arguments = []
38+
39+ stack_argument_count = count
40+ if self .arch == 'AMD64' :
41+ reg_argument_count = min (count , len (self .amd64_argument_regs ))
42+ stack_argument_count -= reg_argument_count
43+ for i in range (0 , reg_argument_count , 1 ):
44+ arguments .append (self .uc .reg_read (self .amd64_argument_regs [i ]))
45+
46+ if stack_argument_count > 0 :
47+ arguments += self .emulator .memory .get_stack (stack_argument_count )
3648
49+ return arguments
50+
51+ def callback (self , uc , address , size , user_data ):
3752 code = uc .mem_read (address , size )
3853 try :
3954 name = self .emulator .debugger .find_symbol (address )
4055 except :
4156 name = ''
57+ self .emulator .instruction .dump_disassembly (address , size , find_symbol = True )
4258
43- print ('callback: %s (%x)' % (name , address ))
59+ sp = self .uc .reg_read (self .emulator .register .get_by_name ("sp" ))
60+ print ('%x: %s (%x)' % (sp , name , address ))
4461 if name == 'kernel32!WinExec' :
45- rcx = uc .reg_read (UC_X86_REG_RCX )
46- print ('rcx: %x' % rcx )
47- command = self .emulator .memory .read_string (rcx )
62+ arguments = self .get_arguments (2 )
63+ command = self .emulator .memory .read_string (arguments [0 ])
4864 print ('command: %s' % command )
4965
5066 elif name == 'ntdll!LdrLoadDll' :
0 commit comments