Skip to content

Commit 599f701

Browse files
committed
Added api.Hook.get_arguments
1 parent b70f5f0 commit 599f701

2 files changed

Lines changed: 25 additions & 8 deletions

File tree

shellcode_emulator/api.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
logger = logging.getLogger(__name__)
1717

1818
class 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':

shellcode_emulator/run.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def start(self, start, end):
5353

5454
class ShellcodeEmulator:
5555
def __init__(self, shellcode_filename, shellcode_bytes = '', dump_filename = '', arch = 'AMD64', exhaustive_loop_dump_frequency = 0x10000):
56+
self.arch = arch
5657
self.shellcode_filename = shellcode_filename
5758
self.shellcode_bytes = shellcode_bytes
5859
self.exhaustive_loop_dump_frequency = exhaustive_loop_dump_frequency
@@ -102,7 +103,7 @@ def run(self, trace_self_modification = False, print_first_instructions = False)
102103
self.emulator.add_unicorn_hook(UC_HOOK_CODE, self.instruction_callback, None, self.code_start, self.code_start+1)
103104

104105
self.emulator.memory.hook_unmapped_memory_access()
105-
api_hook = shellcode_emulator.api.Hook(self.emulator)
106+
api_hook = shellcode_emulator.api.Hook(self.emulator, self.arch)
106107
api_hook.start()
107108

108109
self.emulator.instruction.set_code_range(self.code_start, self.code_start+self.code_length)

0 commit comments

Comments
 (0)