From 584e4d244a9124f6ec403162994434ff085e9c5d Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Thu, 19 Feb 2015 01:32:45 -0500 Subject: Add APIs for accessing function information --- api.pro | 4 +++- basicblock.cpp | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ binaryninjaapi.h | 37 +++++++++++++++++++++++++++++ function.cpp | 41 ++++++++++++++++++++++++++++++++ 4 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 basicblock.cpp create mode 100644 function.cpp diff --git a/api.pro b/api.pro index 8cd9642c..8dfd78bd 100644 --- a/api.pro +++ b/api.pro @@ -20,7 +20,9 @@ SOURCES += \ binaryreader.cpp \ binarywriter.cpp \ transform.cpp \ - architecture.cpp + architecture.cpp \ + basicblock.cpp \ + function.cpp HEADERS += binaryninjaapi.h unix { diff --git a/basicblock.cpp b/basicblock.cpp new file mode 100644 index 00000000..6fc72992 --- /dev/null +++ b/basicblock.cpp @@ -0,0 +1,72 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +BasicBlock::BasicBlock(BNBasicBlock* block): m_block(block) +{ +} + + +BasicBlock::~BasicBlock() +{ + BNFreeBasicBlock(m_block); +} + + +Ref BasicBlock::GetFunction() const +{ + return new Function(BNGetBasicBlockFunction(m_block)); +} + + +Ref BasicBlock::GetArchitecture() const +{ + return new CoreArchitecture(BNGetBasicBlockArchitecture(m_block)); +} + + +uint64_t BasicBlock::GetStart() const +{ + return BNGetBasicBlockStart(m_block); +} + + +uint64_t BasicBlock::GetEnd() const +{ + return BNGetBasicBlockEnd(m_block); +} + + +uint64_t BasicBlock::GetLength() const +{ + return BNGetBasicBlockLength(m_block); +} + + +vector BasicBlock::GetInstructionSizes() const +{ + size_t count; + uint8_t* array = BNGetBasicBlockInstructionSizes(m_block, &count); + + vector result; + result.insert(result.end(), &array[0], &array[count]); + + BNFreeBasicBlockInstructionSizeList(array); + return result; +} + + +vector BasicBlock::GetOutgoingEdges() const +{ + size_t count; + BNBasicBlockEdge* array = BNGetBasicBlockOutgoingEdges(m_block, &count); + + vector result; + for (size_t i = 0; i < count; i++) + result.push_back(array[i]); + + BNFreeBasicBlockOutgoingEdgeList(array); + return result; +} diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 331fa1fb..891dcda0 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -611,4 +611,41 @@ namespace BinaryNinja CoreArchitecture(BNArchitecture* arch); virtual bool GetInstructionInfo(BinaryView* view, uint64_t addr, InstructionInfo& result) override; }; + + class Function; + + class BasicBlock: public RefCountObject + { + BNBasicBlock* m_block; + + public: + BasicBlock(BNBasicBlock* block); + ~BasicBlock(); + + Ref GetFunction() const; + Ref GetArchitecture() const; + + uint64_t GetStart() const; + uint64_t GetEnd() const; + uint64_t GetLength() const; + + std::vector GetInstructionSizes() const; + std::vector GetOutgoingEdges() const; + }; + + class Function: public RefCountObject + { + BNFunction* m_func; + + public: + Function(BNFunction* func); + ~Function(); + + BNFunction* GetFunctionObject() const { return m_func; } + + Ref GetArchitecture() const; + uint64_t GetStart() const; + + std::vector> GetBasicBlocks() const; + }; } diff --git a/function.cpp b/function.cpp new file mode 100644 index 00000000..db99b97d --- /dev/null +++ b/function.cpp @@ -0,0 +1,41 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +Function::Function(BNFunction* func): m_func(func) +{ +} + + +Function::~Function() +{ + BNFreeFunction(m_func); +} + + +Ref Function::GetArchitecture() const +{ + return new CoreArchitecture(BNGetFunctionArchitecture(m_func)); +} + + +uint64_t Function::GetStart() const +{ + return BNGetFunctionStart(m_func); +} + + +vector> Function::GetBasicBlocks() const +{ + size_t count; + BNBasicBlock** blocks = BNGetFunctionBasicBlockList(m_func, &count); + + vector> result; + for (size_t i = 0; i < count; i++) + result.push_back(new BasicBlock(BNNewBasicBlockReference(blocks[i]))); + + BNFreeBasicBlockList(blocks, count); + return result; +} -- cgit v1.3.1