diff options
| author | Peter LaFosse <peter@vector35.com> | 2018-09-20 16:51:14 -0400 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2018-09-20 16:51:14 -0400 |
| commit | f48203de0acafb1d981d56c79d0edff921102065 (patch) | |
| tree | 04e3a94f4756fc4c00e64346ceec660bf25fa4b0 | |
| parent | 74a8547853dd66fe62d2e75b93c1b723eb6f69cf (diff) | |
Adding NameSpace tokens and plumbing through some namespce apis
| -rw-r--r-- | binaryninjaapi.h | 172 | ||||
| -rw-r--r-- | binaryninjacore.h | 9 | ||||
| -rw-r--r-- | binaryview.cpp | 22 | ||||
| -rw-r--r-- | python/types.py | 9 | ||||
| -rw-r--r-- | type.cpp | 8 |
5 files changed, 131 insertions, 89 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 647d2677..81eb05bd 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -909,6 +909,92 @@ namespace BinaryNinja class Function; class BasicBlock; + class NameList + { + protected: + std::string m_join; + std::vector<std::string> m_name; + public: + NameList(const std::string& join); + NameList(const std::string& name, const std::string& join); + NameList(const std::vector<std::string>& name, const std::string& join); + NameList(const NameList& name, const std::string& join); + + virtual NameList& operator=(const std::string& name); + virtual NameList& operator=(const std::vector<std::string>& name); + virtual NameList& operator=(const NameList& name); + + virtual bool operator==(const NameList& other) const; + virtual bool operator!=(const NameList& other) const; + virtual bool operator<(const NameList& other) const; + + virtual NameList operator+(const NameList& other) const; + + virtual std::string& operator[](size_t i); + virtual const std::string& operator[](size_t i) const; + virtual std::vector<std::string>::iterator begin(); + virtual std::vector<std::string>::iterator end(); + virtual std::vector<std::string>::const_iterator begin() const; + virtual std::vector<std::string>::const_iterator end() const; + virtual std::string& front(); + virtual const std::string& front() const; + virtual std::string& back(); + virtual const std::string& back() const; + virtual void insert(std::vector<std::string>::iterator loc, const std::string& name); + virtual void insert(std::vector<std::string>::iterator loc, std::vector<std::string>::iterator b, + std::vector<std::string>::iterator e); + virtual void erase(std::vector<std::string>::iterator i); + virtual void clear(); + virtual void push_back(const std::string& name); + virtual size_t size() const; + virtual size_t StringSize() const; + + virtual std::string GetString() const; + virtual std::string GetJoinString() const { return m_join; } + virtual bool IsEmpty() const { return m_name.size() == 0; } + + BNNameList GetAPIObject() const; + static void FreeAPIObject(BNNameList* name); + static NameList FromAPIObject(BNNameList* name); + }; + + class QualifiedName: public NameList + { + public: + QualifiedName(); + QualifiedName(const std::string& name); + QualifiedName(const std::vector<std::string>& name); + QualifiedName(const QualifiedName& name); + + virtual QualifiedName& operator=(const std::string& name); + virtual QualifiedName& operator=(const std::vector<std::string>& name); + virtual QualifiedName& operator=(const QualifiedName& name); + virtual QualifiedName operator+(const QualifiedName& other) const; + + BNQualifiedName GetAPIObject() const; + static void FreeAPIObject(BNQualifiedName* name); + static QualifiedName FromAPIObject(BNQualifiedName* name); + }; + + class NameSpace: public NameList + { + public: + NameSpace(); + NameSpace(const std::string& name); + NameSpace(const std::vector<std::string>& name); + NameSpace(const NameSpace& name); + + virtual NameSpace& operator=(const std::string& name); + virtual NameSpace& operator=(const std::vector<std::string>& name); + virtual NameSpace& operator=(const NameSpace& name); + virtual NameSpace operator+(const NameSpace& other) const; + + virtual bool IsDefaultNameSpace() const; + BNNameSpace GetAPIObject() const; + static void FreeAPIObject(BNNameSpace* name); + static NameSpace FromAPIObject(const BNNameSpace* name); + }; + class Symbol: public CoreRefCountObject<BNSymbol, BNNewSymbolReference, BNFreeSymbol> { public: @@ -922,6 +1008,7 @@ namespace BinaryNinja std::string GetRawName() const; uint64_t GetAddress() const; bool IsAutoDefined() const; + NameSpace GetNameSpace() const; static Ref<Symbol> ImportedFunctionFromImportAddressSymbol(Symbol* sym, uint64_t addr); }; @@ -1275,7 +1362,7 @@ namespace BinaryNinja std::vector<Ref<Symbol>> GetSymbolsOfType(BNSymbolType type); std::vector<Ref<Symbol>> GetSymbolsOfType(BNSymbolType type, uint64_t start, uint64_t len); - void DefineAutoSymbol(Ref<Symbol> sym); + void DefineAutoSymbol(Ref<Symbol> sym, const NameSpace& nameSpace=NameSpace()); void DefineAutoSymbolAndVariableOrFunction(Ref<Platform> platform, Ref<Symbol> sym, Ref<Type> type); void UndefineAutoSymbol(Ref<Symbol> sym); @@ -2079,89 +2166,6 @@ namespace BinaryNinja Variable location; }; - class NameList - { - protected: - std::string m_join; - std::vector<std::string> m_name; - public: - NameList(const std::string& join); - NameList(const std::string& name, const std::string& join); - NameList(const std::vector<std::string>& name, const std::string& join); - NameList(const NameList& name, const std::string& join); - - virtual NameList& operator=(const std::string& name); - virtual NameList& operator=(const std::vector<std::string>& name); - virtual NameList& operator=(const NameList& name); - - virtual bool operator==(const NameList& other) const; - virtual bool operator!=(const NameList& other) const; - virtual bool operator<(const NameList& other) const; - - virtual NameList operator+(const NameList& other) const; - - virtual std::string& operator[](size_t i); - virtual const std::string& operator[](size_t i) const; - virtual std::vector<std::string>::iterator begin(); - virtual std::vector<std::string>::iterator end(); - virtual std::vector<std::string>::const_iterator begin() const; - virtual std::vector<std::string>::const_iterator end() const; - virtual std::string& front(); - virtual const std::string& front() const; - virtual std::string& back(); - virtual const std::string& back() const; - virtual void insert(std::vector<std::string>::iterator loc, const std::string& name); - virtual void insert(std::vector<std::string>::iterator loc, std::vector<std::string>::iterator b, - std::vector<std::string>::iterator e); - virtual void erase(std::vector<std::string>::iterator i); - virtual void clear(); - virtual void push_back(const std::string& name); - virtual size_t size() const; - virtual size_t StringSize() const; - - virtual std::string GetString() const; - - BNNameList GetAPIObject() const; - static void FreeAPIObject(BNNameList* name); - static NameList FromAPIObject(BNNameList* name); - }; - - class QualifiedName: public NameList - { - public: - QualifiedName(); - QualifiedName(const std::string& name); - QualifiedName(const std::vector<std::string>& name); - QualifiedName(const QualifiedName& name); - - virtual QualifiedName& operator=(const std::string& name); - virtual QualifiedName& operator=(const std::vector<std::string>& name); - virtual QualifiedName& operator=(const QualifiedName& name); - virtual QualifiedName operator+(const QualifiedName& other) const; - - BNQualifiedName GetAPIObject() const; - static void FreeAPIObject(BNQualifiedName* name); - static QualifiedName FromAPIObject(BNQualifiedName* name); - }; - - class NameSpace: public NameList - { - public: - NameSpace(); - NameSpace(const std::string& name); - NameSpace(const std::vector<std::string>& name); - NameSpace(const NameSpace& name); - - virtual NameSpace& operator=(const std::string& name); - virtual NameSpace& operator=(const std::vector<std::string>& name); - virtual NameSpace& operator=(const NameSpace& name); - virtual NameSpace operator+(const NameSpace& other) const; - - BNNameSpace GetAPIObject() const; - static void FreeAPIObject(BNNameSpace* name); - static NameSpace FromAPIObject(BNNameSpace* name); - }; - struct QualifiedNameAndType { QualifiedName name; diff --git a/binaryninjacore.h b/binaryninjacore.h index 984fb43b..7279b212 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -98,6 +98,9 @@ #define BN_MINIMUM_CONFIDENCE 1 #define BN_HEURISTIC_CONFIDENCE 192 +#define DEFAULT_INTERNAL_NAMESPACE "INTERNAL" +#define DEFAULT_EXTERNAL_NAMESPACE "EXTERNAL" + #ifdef __cplusplus extern "C" { @@ -228,7 +231,8 @@ extern "C" KeywordToken = 19, TypeNameToken = 20, FieldNameToken = 21, - + NameSpaceToken = 22, + NameSpaceSeparatorToken = 23, // The following are output by the analysis system automatically, these should // not be used directly by the architecture plugins CodeSymbolToken = 64, @@ -2821,6 +2825,7 @@ extern "C" BINARYNINJACOREAPI BNSymbol* BNNewSymbolReference(BNSymbol* sym); BINARYNINJACOREAPI void BNFreeSymbol(BNSymbol* sym); BINARYNINJACOREAPI BNSymbolType BNGetSymbolType(BNSymbol* sym); + BINARYNINJACOREAPI BNNameSpace BNGetSymbolNameSpace(BNSymbol* sym); BINARYNINJACOREAPI char* BNGetSymbolShortName(BNSymbol* sym); BINARYNINJACOREAPI char* BNGetSymbolFullName(BNSymbol* sym); BINARYNINJACOREAPI char* BNGetSymbolRawName(BNSymbol* sym); @@ -2837,7 +2842,7 @@ extern "C" uint64_t start, uint64_t len, size_t* count); BINARYNINJACOREAPI void BNFreeSymbolList(BNSymbol** syms, size_t count); - BINARYNINJACOREAPI void BNDefineAutoSymbol(BNBinaryView* view, BNSymbol* sym); + BINARYNINJACOREAPI void BNDefineAutoSymbol(BNBinaryView* view, BNSymbol* sym, const BNNameSpace* nameSpace); BINARYNINJACOREAPI void BNUndefineAutoSymbol(BNBinaryView* view, BNSymbol* sym); BINARYNINJACOREAPI void BNDefineUserSymbol(BNBinaryView* view, BNSymbol* sym); BINARYNINJACOREAPI void BNUndefineUserSymbol(BNBinaryView* view, BNSymbol* sym); diff --git a/binaryview.cpp b/binaryview.cpp index e9e8b377..1540e049 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -192,6 +192,13 @@ BNSymbolType Symbol::GetType() const } +NameSpace Symbol::GetNameSpace() const +{ + BNNameSpace name = BNGetSymbolNameSpace(m_object); + return NameSpace::FromAPIObject(&name); +} + + string Symbol::GetShortName() const { char* name = BNGetSymbolShortName(m_object); @@ -1274,6 +1281,7 @@ vector<Ref<Function>> BinaryView::GetAnalysisFunctionList() result.push_back(new Function(BNNewFunctionReference(list[i]))); BNFreeFunctionList(list, count); + return result; } @@ -1515,9 +1523,19 @@ vector<Ref<Symbol>> BinaryView::GetSymbolsOfType(BNSymbolType type, uint64_t sta } -void BinaryView::DefineAutoSymbol(Ref<Symbol> sym) +void BinaryView::DefineAutoSymbol(Ref<Symbol> sym, const NameSpace& nameSpace) { - BNDefineAutoSymbol(m_object, sym->GetObject()); + BNNameSpace ns; + ns.join = BNAllocString(nameSpace.GetJoinString().c_str()); + ns.name = new char*[nameSpace.size()]; + for (size_t i = 0; i < nameSpace.size(); i++) + ns.name[i] = BNAllocString(nameSpace[i].c_str()); + ns.nameCount = nameSpace.size(); + BNDefineAutoSymbol(m_object, sym->GetObject(), &ns); + BNFreeString(ns.join); + for (size_t i = 0; i < nameSpace.size(); i++) + BNFreeString(ns.name[i]); + delete[] ns.name; } diff --git a/python/types.py b/python/types.py index 38d7b846..f8ff279a 100644 --- a/python/types.py +++ b/python/types.py @@ -119,6 +119,10 @@ class QualifiedName(object): return QualifiedName(result) +class NameSpace(QualifiedName): + def __str__(self): + return ":".join(self.name) + class Symbol(object): """ Symbols are defined as one of the following types: @@ -164,6 +168,11 @@ class Symbol(object): return SymbolType(core.BNGetSymbolType(self.handle)) @property + def namespace(self): + """Symbol namespace (read-only)""" + return SymbolNameSpace(core.BNGetSymbolNameSpace(self.handle)) + + @property def name(self): """Symbol name (read-only)""" return core.BNGetSymbolRawName(self.handle) @@ -385,6 +385,12 @@ NameSpace NameSpace::operator+(const NameSpace& other) const } +bool NameSpace::IsDefaultNameSpace() const +{ + return ((GetString() == DEFAULT_INTERNAL_NAMESPACE) || (GetString() == DEFAULT_EXTERNAL_NAMESPACE)); +} + + BNNameSpace NameSpace::GetAPIObject() const { BNNameSpace result; @@ -406,7 +412,7 @@ void NameSpace::FreeAPIObject(BNNameSpace* name) } -NameSpace NameSpace::FromAPIObject(BNNameSpace* name) +NameSpace NameSpace::FromAPIObject(const BNNameSpace* name) { NameSpace result; for (size_t i = 0; i < name->nameCount; i++) |
