summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2018-09-20 16:51:14 -0400
committerPeter LaFosse <peter@vector35.com>2018-09-20 16:51:14 -0400
commitf48203de0acafb1d981d56c79d0edff921102065 (patch)
tree04e3a94f4756fc4c00e64346ceec660bf25fa4b0
parent74a8547853dd66fe62d2e75b93c1b723eb6f69cf (diff)
Adding NameSpace tokens and plumbing through some namespce apis
-rw-r--r--binaryninjaapi.h172
-rw-r--r--binaryninjacore.h9
-rw-r--r--binaryview.cpp22
-rw-r--r--python/types.py9
-rw-r--r--type.cpp8
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)
diff --git a/type.cpp b/type.cpp
index 37b8f131..8ac6ded4 100644
--- a/type.cpp
+++ b/type.cpp
@@ -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++)