From f3040b9ef97f6dc521a14fa7a12c4a8d9b953e21 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Mon, 7 May 2018 16:03:13 -0400 Subject: Refactor supporting calling convention like approach --- relocationhandler.cpp | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 relocationhandler.cpp (limited to 'relocationhandler.cpp') diff --git a/relocationhandler.cpp b/relocationhandler.cpp new file mode 100644 index 00000000..2f0cbbde --- /dev/null +++ b/relocationhandler.cpp @@ -0,0 +1,114 @@ +// Copyright (c) 2015-2017 Vector 35 LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +#include "binaryninjaapi.h" + +using namespace std; +using namespace BinaryNinja; + + +RelocationHandler::RelocationHandler(BNRelocationHandler* handler) +{ + m_object = handler; +} + + +RelocationHandler::RelocationHandler() +{ + BNCustomRelocationHandler handler; + handler.context = this; + handler.freeObject = FreeCallback; + handler.getRelocationInfo = GetRelocationInfoCallback; + handler.applyRelocation = ApplyRelocationCallback; + + AddRefForRegistration(); + m_object = BNCreateRelocationHandler(&handler); +} + + +void RelocationHandler::FreeCallback(void* ctxt) +{ + RelocationHandler* handler = (RelocationHandler*)ctxt; + handler->ReleaseForRegistration(); +} + + +bool RelocationHandler::GetRelocationInfoCallback(void* ctxt, BNBinaryView* view, BNArchitecture* arch, + BNRelocationInfo* result, size_t resultCount) +{ + RelocationHandler* handler = (RelocationHandler*)ctxt; + Ref viewObj = new BinaryView(BNNewViewReference(view)); + Ref archObj = new CoreArchitecture(arch); + if (!result) + return false; + vector resultVector(&result[0], &result[resultCount]); + bool success = handler->GetRelocationInfo(viewObj, archObj, resultVector); + for (size_t i = 0; i < resultCount; i++) + result[i] = resultVector[i]; + return success; +} + + +bool RelocationHandler::ApplyRelocationCallback(void* ctxt, BNBinaryView* view, BNArchitecture* arch, BNRelocation* reloc, + uint8_t* dest, size_t len) +{ + RelocationHandler* handler = (RelocationHandler*)ctxt; + Ref archObj = new CoreArchitecture(arch); + Ref viewObj = new BinaryView(BNNewViewReference(view)); + Ref relocObj = new Relocation(BNNewRelocationReference(reloc)); + return handler->ApplyRelocation(viewObj, archObj, relocObj, dest, len); +} + + +bool RelocationHandler::GetRelocationInfo(Ref view, Ref arch, std::vector& result) +{ + return false; +} + + +bool RelocationHandler::ApplyRelocation(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); +} + +CoreRelocationHandler::CoreRelocationHandler(BNRelocationHandler* handler) : RelocationHandler(handler) +{ +} + + +bool CoreRelocationHandler::ApplyRelocation(Ref view, Ref arch, Ref reloc, uint8_t* dest, + size_t len) +{ + return BNRelocationHandlerApplyRelocation(m_object, view->GetObject(), arch->GetObject(), BNNewRelocationReference(reloc->GetObject()), dest, len); +} + + +bool CoreRelocationHandler::GetRelocationInfo(Ref view, Ref arch, std::vector& result) +{ + BNRelocationInfo* results = new BNRelocationInfo[result.size()]; + for (size_t i = 0; i < result.size(); i++) + results[i] = result[i]; + bool status = BNRelocationHandlerGetRelocationInfo(m_object, view->GetObject(), arch->GetObject(), results, + result.size()); + for (size_t i = 0; i < result.size(); i++) + result[i] = results[i]; + return status; +} \ No newline at end of file -- cgit v1.3.1