diff options
| author | Peter LaFosse <peter@vector35.com> | 2018-05-07 16:03:13 -0400 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2018-05-07 16:03:13 -0400 |
| commit | f3040b9ef97f6dc521a14fa7a12c4a8d9b953e21 (patch) | |
| tree | de2ef3beb56bca7a185bf1efbbd8c085757096b6 /relocationhandler.cpp | |
| parent | 0ee4eae0a56ecbf949c0661058483b40e81a3d84 (diff) | |
Refactor supporting calling convention like approach
Diffstat (limited to 'relocationhandler.cpp')
| -rw-r--r-- | relocationhandler.cpp | 114 |
1 files changed, 114 insertions, 0 deletions
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<BinaryView> viewObj = new BinaryView(BNNewViewReference(view)); + Ref<Architecture> archObj = new CoreArchitecture(arch); + if (!result) + return false; + vector<BNRelocationInfo> 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<Architecture> archObj = new CoreArchitecture(arch); + Ref<BinaryView> viewObj = new BinaryView(BNNewViewReference(view)); + Ref<Relocation> relocObj = new Relocation(BNNewRelocationReference(reloc)); + return handler->ApplyRelocation(viewObj, archObj, relocObj, dest, len); +} + + +bool RelocationHandler::GetRelocationInfo(Ref<BinaryView> view, Ref<Architecture> arch, std::vector<BNRelocationInfo>& result) +{ + return false; +} + + +bool RelocationHandler::ApplyRelocation(Ref<BinaryView> view, Ref<Architecture> arch, Ref<Relocation> 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<BinaryView> view, Ref<Architecture> arch, Ref<Relocation> reloc, uint8_t* dest, + size_t len) +{ + return BNRelocationHandlerApplyRelocation(m_object, view->GetObject(), arch->GetObject(), BNNewRelocationReference(reloc->GetObject()), dest, len); +} + + +bool CoreRelocationHandler::GetRelocationInfo(Ref<BinaryView> view, Ref<Architecture> arch, std::vector<BNRelocationInfo>& 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 |
