in functions/functraceplus.py [0:0]
def hit_getprocaddress_or_ret_bp(self, bptea):
# hit breakpoint on GetProcAddress
if bptea == self.getproc_func_addr:
hmodule = self.get_func_args(1)
if hmodule in self.module_address_name:
module_name = self.module_address_name[hmodule]
get_proc_addr_ret_addr = self.get_func_args(0)
func_name_addr = self.get_func_args(2)
func_name_str = idc.get_strlit_contents(func_name_addr)
# print(f"func_name_str : {func_name_str.decode('utf-8')}")
# add a new module to module_funcs
if module_name not in self.module_funcs:
self.module_funcs[module_name] = []
if func_name_str != None:
self.module_funcs[module_name].append({"name":func_name_str.decode('utf-8')})
self.getproc_func_ret_addrs[get_proc_addr_ret_addr] = \
{
"module_name":module_name,
"func_name":func_name_str.decode("utf-8"),
"debug_info":f"hook function exec: {hex(get_proc_addr_ret_addr)} => kernel32!"
}
idc.add_bpt(get_proc_addr_ret_addr)
return True
# hit breakpoint on GetProcAddress return address
if bptea in self.getproc_func_ret_addrs:
_module_name = self.getproc_func_ret_addrs[bptea]["module_name"]
_func_name = self.getproc_func_ret_addrs[bptea]["func_name"]
_debug_info = self.getproc_func_ret_addrs[bptea]["debug_info"]
target_func_addr = self.get_register_value("AX")
if _debug_info != None:
_debug_info += f"GetProcAddress({_module_name},{_func_name}) = {hex(target_func_addr)}"
logging.debug(_debug_info)
for idx, func in enumerate(self.module_funcs[_module_name]):
if func["name"] == _func_name:
self.module_funcs[_module_name][idx]["va"] = target_func_addr
break
if _module_name in self.to_hook_func:
for idx, hook_func in enumerate(self.to_hook_func[_module_name]):
if hook_func["name"] == _func_name:
self.break_points[target_func_addr] = "%s!%s" % (_module_name, _func_name)
if ida_dbg.exist_bpt(target_func_addr) == False:
logging.debug("hook:%s!%s => %s" % (_module_name, hook_func["name"], hex(target_func_addr)))
idc.add_bpt(target_func_addr)
break
idc.del_bpt(bptea)
self.getproc_func_ret_addrs.pop(bptea)
return True
return False