From 0732c4d3e9b24382271139c6f796d1639efb1c5d Mon Sep 17 00:00:00 2001 From: Ryan Snyder Date: Fri, 28 May 2021 16:35:34 -0400 Subject: Improve calling convention support for variadic argument resolution --- python/callingconvention.py | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'python') diff --git a/python/callingconvention.py b/python/callingconvention.py index aaf86239..c29404aa 100644 --- a/python/callingconvention.py +++ b/python/callingconvention.py @@ -38,6 +38,7 @@ class CallingConvention(object): int_arg_regs = [] float_arg_regs = [] arg_regs_share_index = False + arg_regs_for_varargs = True stack_reserved_for_arg_regs = False stack_adjusted_on_return = False eligible_for_heuristics = True @@ -64,6 +65,7 @@ class CallingConvention(object): self._cb.getFloatArgumentRegisters = self._cb.getFloatArgumentRegisters.__class__(self._get_float_arg_regs) self._cb.freeRegisterList = self._cb.freeRegisterList.__class__(self._free_register_list) self._cb.areArgumentRegistersSharedIndex = self._cb.areArgumentRegistersSharedIndex.__class__(self._arg_regs_share_index) + self._cb.areArgumentRegistersUsedForVarArgs = self._cb.areArgumentRegistersUsedForVarArgs.__class__(self._arg_regs_used_for_varargs) self._cb.isStackReservedForArgumentRegisters = self._cb.isStackReservedForArgumentRegisters.__class__(self._stack_reserved_for_arg_regs) self._cb.isStackAdjustedOnReturn = self._cb.isStackAdjustedOnReturn.__class__(self._stack_adjusted_on_return) self._cb.isEligibleForHeuristics = self._cb.isEligibleForHeuristics.__class__(self._eligible_for_heuristics) @@ -83,6 +85,7 @@ class CallingConvention(object): self.arch = binaryninja.architecture.CoreArchitecture._from_cache(core.BNGetCallingConventionArchitecture(self.handle)) self.__dict__["name"] = core.BNGetCallingConventionName(self.handle) self.__dict__["arg_regs_share_index"] = core.BNAreArgumentRegistersSharedIndex(self.handle) + self.__dict__["arg_regs_for_varargs"] = core.BNAreArgumentRegistersUsedForVarArgs(self.handle) self.__dict__["stack_reserved_for_arg_regs"] = core.BNIsStackReservedForArgumentRegisters(self.handle) self.__dict__["stack_adjusted_on_return"] = core.BNIsStackAdjustedOnReturn(self.handle) self.__dict__["eligible_for_heuristics"] = core.BNIsEligibleForHeuristics(self.handle) @@ -257,6 +260,13 @@ class CallingConvention(object): log.log_error(traceback.format_exc()) return False + def _arg_regs_used_for_varargs(self, ctxt): + try: + return self.__class__.arg_regs_for_varargs + except: + log.log_error(traceback.format_exc()) + return False + def _stack_reserved_for_arg_regs(self, ctxt): try: return self.__class__.stack_reserved_for_arg_regs -- cgit v1.3.1