diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-02-19 01:32:45 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-02-19 01:32:45 -0500 |
| commit | 584e4d244a9124f6ec403162994434ff085e9c5d (patch) | |
| tree | 1df2fd7d9f6f38f3217b596772c2866b2e12d606 | |
| parent | 3f36f01667138e248d030701b9c0c047c1c7f5d7 (diff) | |
Add APIs for accessing function information
| -rw-r--r-- | api.pro | 4 | ||||
| -rw-r--r-- | basicblock.cpp | 72 | ||||
| -rw-r--r-- | binaryninjaapi.h | 37 | ||||
| -rw-r--r-- | function.cpp | 41 |
4 files changed, 153 insertions, 1 deletions
@@ -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<Function> BasicBlock::GetFunction() const +{ + return new Function(BNGetBasicBlockFunction(m_block)); +} + + +Ref<Architecture> 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<uint8_t> BasicBlock::GetInstructionSizes() const +{ + size_t count; + uint8_t* array = BNGetBasicBlockInstructionSizes(m_block, &count); + + vector<uint8_t> result; + result.insert(result.end(), &array[0], &array[count]); + + BNFreeBasicBlockInstructionSizeList(array); + return result; +} + + +vector<BNBasicBlockEdge> BasicBlock::GetOutgoingEdges() const +{ + size_t count; + BNBasicBlockEdge* array = BNGetBasicBlockOutgoingEdges(m_block, &count); + + vector<BNBasicBlockEdge> 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<Function> GetFunction() const; + Ref<Architecture> GetArchitecture() const; + + uint64_t GetStart() const; + uint64_t GetEnd() const; + uint64_t GetLength() const; + + std::vector<uint8_t> GetInstructionSizes() const; + std::vector<BNBasicBlockEdge> GetOutgoingEdges() const; + }; + + class Function: public RefCountObject + { + BNFunction* m_func; + + public: + Function(BNFunction* func); + ~Function(); + + BNFunction* GetFunctionObject() const { return m_func; } + + Ref<Architecture> GetArchitecture() const; + uint64_t GetStart() const; + + std::vector<Ref<BasicBlock>> 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<Architecture> Function::GetArchitecture() const +{ + return new CoreArchitecture(BNGetFunctionArchitecture(m_func)); +} + + +uint64_t Function::GetStart() const +{ + return BNGetFunctionStart(m_func); +} + + +vector<Ref<BasicBlock>> Function::GetBasicBlocks() const +{ + size_t count; + BNBasicBlock** blocks = BNGetFunctionBasicBlockList(m_func, &count); + + vector<Ref<BasicBlock>> result; + for (size_t i = 0; i < count; i++) + result.push_back(new BasicBlock(BNNewBasicBlockReference(blocks[i]))); + + BNFreeBasicBlockList(blocks, count); + return result; +} |
