From fe925b01df7934785aa5dc67d23c577f13ad42e6 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Sun, 26 Aug 2018 15:31:12 -0400 Subject: Add support for new constant type EXTERN_PTR --- relocationhandler.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'relocationhandler.cpp') diff --git a/relocationhandler.cpp b/relocationhandler.cpp index cda9bf0d..b077a82d 100644 --- a/relocationhandler.cpp +++ b/relocationhandler.cpp @@ -37,6 +37,7 @@ RelocationHandler::RelocationHandler() handler.freeObject = FreeCallback; handler.getRelocationInfo = GetRelocationInfoCallback; handler.applyRelocation = ApplyRelocationCallback; + handler.getOperandForExternalRelocation = GetOperandForExternalRelocationCallback; AddRefForRegistration(); m_object = BNCreateRelocationHandler(&handler); @@ -77,6 +78,16 @@ bool RelocationHandler::ApplyRelocationCallback(void* ctxt, BNBinaryView* view, } +size_t RelocationHandler::GetOperandForExternalRelocationCallback(void* ctxt, const uint8_t* data, uint64_t addr, + size_t length, BNLowLevelILFunction* il, BNRelocation* reloc) +{ + RelocationHandler* handler = (RelocationHandler*)ctxt; + Ref func(new LowLevelILFunction(BNNewLowLevelILFunctionReference(il))); + Ref relocObj = new Relocation(BNNewRelocationReference(reloc)); + return handler->GetOperandForExternalRelocation(data, addr, length, func, relocObj); +} + + bool RelocationHandler::GetRelocationInfo(Ref view, Ref arch, std::vector& result) { (void)view; @@ -89,9 +100,18 @@ bool RelocationHandler::GetRelocationInfo(Ref view, Ref view, Ref arch, Ref reloc, uint8_t* dest, size_t len) { - return BNRelocationHandlerDefaultApplyRelocation(m_object, view->GetObject(), arch->GetObject(), BNNewRelocationReference(reloc->GetObject()), dest, len); + return BNRelocationHandlerDefaultApplyRelocation(m_object, view->GetObject(), arch->GetObject(), + BNNewRelocationReference(reloc->GetObject()), dest, len); } + +size_t RelocationHandler::GetOperandForExternalRelocation(const uint8_t* data, uint64_t addr, size_t length, + Ref il, Ref relocation) +{ + return BN_INVALID_OPERAND; +} + + CoreRelocationHandler::CoreRelocationHandler(BNRelocationHandler* handler) : RelocationHandler(handler) { } @@ -114,4 +134,12 @@ bool CoreRelocationHandler::GetRelocationInfo(Ref view, Ref il, Ref relocation) +{ + return BNRelocationHandlerGetOperandForExternalRelocation(m_object, data, addr, length, il->GetObject(), + relocation->GetObject()); } \ No newline at end of file -- cgit v1.3.1