def hit_getprocaddress_or_ret_bp()

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