summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <dontpanic@binaryninja.com>2015-03-18 22:41:42 -0400
committerRusty Wagner <dontpanic@binaryninja.com>2015-03-18 22:41:42 -0400
commit8788b2a15003aba8040e27d73a33760b0b8da06b (patch)
tree14d8bd6a999d97b93ec191fe1f7eb794541d329d
parent955658b598fac5236ae9ab8adebbd068205a886e (diff)
Add a symbol management API
-rw-r--r--binaryninjaapi.h31
-rw-r--r--binaryview.cpp141
2 files changed, 172 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 113ecfc7..1c5db1f1 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -310,6 +310,25 @@ namespace BinaryNinja
class Function;
class BasicBlock;
+ class Symbol: public RefCountObject
+ {
+ BNSymbol* m_sym;
+
+ public:
+ Symbol(BNSymbolType type, const std::string& shortName, const std::string& fullName,
+ const std::string& rawName, uint64_t addr);
+ Symbol(BNSymbol* sym);
+ virtual ~Symbol();
+
+ BNSymbol* GetSymbolObject() const { return m_sym; }
+
+ BNSymbolType GetType() const;
+ std::string GetShortName() const;
+ std::string GetFullName() const;
+ std::string GetRawName() const;
+ uint64_t GetAddress() const;
+ };
+
class BinaryView: public RefCountObject
{
protected:
@@ -406,6 +425,18 @@ namespace BinaryNinja
Ref<BasicBlock> GetRecentBasicBlockForAddress(uint64_t addr);
std::vector<Ref<BasicBlock>> GetBasicBlocksForAddress(uint64_t addr);
+
+ Ref<Symbol> GetSymbolByAddress(uint64_t addr);
+ Ref<Symbol> GetSymbolByRawName(const std::string& name);
+ std::vector<Ref<Symbol>> GetSymbolsByName(const std::string& name);
+ std::vector<Ref<Symbol>> GetSymbols();
+ std::vector<Ref<Symbol>> GetSymbolsOfType(BNSymbolType type);
+
+ void DefineAutoSymbol(Symbol* sym);
+ void UndefineAutoSymbol(Symbol* sym);
+
+ void DefineSymbol(Symbol* sym);
+ void UndefineSymbol(Symbol* sym);
};
class BinaryData: public BinaryView
diff --git a/binaryview.cpp b/binaryview.cpp
index 82fcdc6d..c091a6b1 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -37,6 +37,63 @@ BinaryDataNotification::BinaryDataNotification()
}
+Symbol::Symbol(BNSymbolType type, const string& shortName, const string& fullName, const string& rawName, uint64_t addr)
+{
+ m_sym = BNCreateSymbol(type, shortName.c_str(), fullName.c_str(), rawName.c_str(), addr);
+}
+
+
+Symbol::Symbol(BNSymbol* sym)
+{
+ m_sym = sym;
+}
+
+
+Symbol::~Symbol()
+{
+ BNFreeSymbol(m_sym);
+}
+
+
+BNSymbolType Symbol::GetType() const
+{
+ return BNGetSymbolType(m_sym);
+}
+
+
+string Symbol::GetShortName() const
+{
+ char* name = BNGetSymbolShortName(m_sym);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+string Symbol::GetFullName() const
+{
+ char* name = BNGetSymbolFullName(m_sym);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+string Symbol::GetRawName() const
+{
+ char* name = BNGetSymbolRawName(m_sym);
+ string result = name;
+ BNFreeString(name);
+ return result;
+}
+
+
+uint64_t Symbol::GetAddress() const
+{
+ return BNGetSymbolAddress(m_sym);
+}
+
+
BinaryView::BinaryView(FileMetadata* file)
{
BNCustomBinaryView view;
@@ -432,6 +489,90 @@ vector<Ref<BasicBlock>> BinaryView::GetBasicBlocksForAddress(uint64_t addr)
}
+Ref<Symbol> BinaryView::GetSymbolByAddress(uint64_t addr)
+{
+ BNSymbol* sym = BNGetSymbolByAddress(m_view, addr);
+ if (!sym)
+ return nullptr;
+ return new Symbol(sym);
+}
+
+
+Ref<Symbol> BinaryView::GetSymbolByRawName(const string& name)
+{
+ BNSymbol* sym = BNGetSymbolByRawName(m_view, name.c_str());
+ if (!sym)
+ return nullptr;
+ return new Symbol(sym);
+}
+
+
+vector<Ref<Symbol>> BinaryView::GetSymbolsByName(const string& name)
+{
+ size_t count;
+ BNSymbol** syms = BNGetSymbolsByName(m_view, name.c_str(), &count);
+
+ vector<Ref<Symbol>> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new Symbol(BNNewSymbolReference(syms[i])));
+
+ BNFreeSymbolList(syms, count);
+ return result;
+}
+
+
+vector<Ref<Symbol>> BinaryView::GetSymbols()
+{
+ size_t count;
+ BNSymbol** syms = BNGetSymbols(m_view, &count);
+
+ vector<Ref<Symbol>> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new Symbol(BNNewSymbolReference(syms[i])));
+
+ BNFreeSymbolList(syms, count);
+ return result;
+}
+
+
+vector<Ref<Symbol>> BinaryView::GetSymbolsOfType(BNSymbolType type)
+{
+ size_t count;
+ BNSymbol** syms = BNGetSymbolsOfType(m_view, type, &count);
+
+ vector<Ref<Symbol>> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new Symbol(BNNewSymbolReference(syms[i])));
+
+ BNFreeSymbolList(syms, count);
+ return result;
+}
+
+
+void BinaryView::DefineAutoSymbol(Symbol* sym)
+{
+ BNDefineAutoSymbol(m_view, sym->GetSymbolObject());
+}
+
+
+void BinaryView::UndefineAutoSymbol(Symbol* sym)
+{
+ BNUndefineAutoSymbol(m_view, sym->GetSymbolObject());
+}
+
+
+void BinaryView::DefineSymbol(Symbol* sym)
+{
+ BNDefineSymbol(m_view, sym->GetSymbolObject());
+}
+
+
+void BinaryView::UndefineSymbol(Symbol* sym)
+{
+ BNUndefineSymbol(m_view, sym->GetSymbolObject());
+}
+
+
BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetFileObject()))
{
}