summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-12-10 00:25:25 -0500
committerRusty Wagner <rusty@vector35.com>2015-12-10 00:25:48 -0500
commit02f23d610975f4a26ecbbbbbc19aa731a43a9a8d (patch)
treea32011791b35da9dfb91fa50d42625eddafe30a3
parent0f6f924f277084429029ba69907d7d51770476e4 (diff)
Backend string finding and API to fetch string list
-rw-r--r--binaryninjaapi.h12
-rw-r--r--binaryview.cpp90
2 files changed, 102 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 7127eda8..0886a1cf 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -366,6 +366,8 @@ namespace BinaryNinja
static void FunctionAddedCallback(void* ctxt, BNBinaryView* data, BNFunction* func);
static void FunctionRemovedCallback(void* ctxt, BNBinaryView* data, BNFunction* func);
static void FunctionUpdatedCallback(void* ctxt, BNBinaryView* data, BNFunction* func);
+ static void StringFoundCallback(void* ctxt, BNBinaryView* data, BNStringType type, uint64_t offset, size_t len);
+ static void StringRemovedCallback(void* ctxt, BNBinaryView* data, BNStringType type, uint64_t offset, size_t len);
public:
BinaryDataNotification();
@@ -379,6 +381,8 @@ namespace BinaryNinja
virtual void OnAnalysisFunctionAdded(BinaryView* view, Function* func) { (void)view; (void)func; }
virtual void OnAnalysisFunctionRemoved(BinaryView* view, Function* func) { (void)view; (void)func; }
virtual void OnAnalysisFunctionUpdated(BinaryView* view, Function* func) { (void)view; (void)func; }
+ virtual void OnStringFound(BinaryView* data, BNStringType type, uint64_t offset, size_t len) { (void)data; (void)type; (void)offset; (void)len; }
+ virtual void OnStringRemoved(BinaryView* data, BNStringType type, uint64_t offset, size_t len) { (void)data; (void)type; (void)offset; (void)len; }
};
class FileAccessor
@@ -467,6 +471,7 @@ namespace BinaryNinja
virtual bool PerformIsOffsetReadable(uint64_t offset);
virtual bool PerformIsOffsetWritable(uint64_t offset);
virtual bool PerformIsOffsetExecutable(uint64_t offset);
+ virtual uint64_t PerformGetNextValidOffset(uint64_t offset);
virtual uint64_t PerformGetStart() const { return 0; }
virtual uint64_t PerformGetLength() const { return 0; }
virtual uint64_t PerformGetEntryPoint() const { return 0; }
@@ -491,6 +496,7 @@ namespace BinaryNinja
static bool IsOffsetReadableCallback(void* ctxt, uint64_t offset);
static bool IsOffsetWritableCallback(void* ctxt, uint64_t offset);
static bool IsOffsetExecutableCallback(void* ctxt, uint64_t offset);
+ static uint64_t GetNextValidOffsetCallback(void* ctxt, uint64_t offset);
static uint64_t GetStartCallback(void* ctxt);
static uint64_t GetLengthCallback(void* ctxt);
static uint64_t GetEntryPointCallback(void* ctxt);
@@ -544,6 +550,7 @@ namespace BinaryNinja
bool IsOffsetReadable(uint64_t offset) const;
bool IsOffsetWritable(uint64_t offset) const;
bool IsOffsetExecutable(uint64_t offset) const;
+ uint64_t GetNextValidOffset(uint64_t offset) const;
uint64_t GetStart() const;
uint64_t GetEnd() const;
@@ -586,7 +593,9 @@ namespace BinaryNinja
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>> GetSymbols(uint64_t start, uint64_t len);
std::vector<Ref<Symbol>> GetSymbolsOfType(BNSymbolType type);
+ std::vector<Ref<Symbol>> GetSymbolsOfType(BNSymbolType type, uint64_t start, uint64_t len);
void DefineAutoSymbol(Symbol* sym);
void UndefineAutoSymbol(Symbol* sym);
@@ -606,6 +615,9 @@ namespace BinaryNinja
bool SkipAndReturnValue(Architecture* arch, uint64_t addr, uint64_t value);
size_t GetInstructionLength(Architecture* arch, uint64_t addr);
+
+ std::vector<BNStringReference> GetStrings();
+ std::vector<BNStringReference> GetStrings(uint64_t start, uint64_t len);
};
class BinaryData: public BinaryView
diff --git a/binaryview.cpp b/binaryview.cpp
index e9bf3588..f2090185 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -55,6 +55,22 @@ void BinaryDataNotification::FunctionUpdatedCallback(void* ctxt, BNBinaryView* o
}
+void BinaryDataNotification::StringFoundCallback(void* ctxt, BNBinaryView* object, BNStringType type, uint64_t offset, size_t len)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new BinaryView(BNNewViewReference(object));
+ notify->OnStringFound(view, type, offset, len);
+}
+
+
+void BinaryDataNotification::StringRemovedCallback(void* ctxt, BNBinaryView* object, BNStringType type, uint64_t offset, size_t len)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new BinaryView(BNNewViewReference(object));
+ notify->OnStringRemoved(view, type, offset, len);
+}
+
+
BinaryDataNotification::BinaryDataNotification()
{
m_callbacks.context = this;
@@ -64,6 +80,8 @@ BinaryDataNotification::BinaryDataNotification()
m_callbacks.functionAdded = FunctionAddedCallback;
m_callbacks.functionRemoved = FunctionRemovedCallback;
m_callbacks.functionUpdated = FunctionUpdatedCallback;
+ m_callbacks.stringFound = StringFoundCallback;
+ m_callbacks.stringRemoved = StringRemovedCallback;
}
@@ -162,6 +180,7 @@ BinaryView::BinaryView(const std::string& typeName, FileMetadata* file)
view.isOffsetReadable = IsOffsetReadableCallback;
view.isOffsetWritable = IsOffsetWritableCallback;
view.isOffsetExecutable = IsOffsetExecutableCallback;
+ view.getNextValidOffset = GetNextValidOffsetCallback;
view.getStart = GetStartCallback;
view.getLength = GetLengthCallback;
view.getEntryPoint = GetEntryPointCallback;
@@ -258,6 +277,13 @@ bool BinaryView::IsOffsetExecutableCallback(void* ctxt, uint64_t offset)
}
+uint64_t BinaryView::GetNextValidOffsetCallback(void* ctxt, uint64_t offset)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->PerformGetNextValidOffset(offset);
+}
+
+
uint64_t BinaryView::GetStartCallback(void* ctxt)
{
BinaryView* view = (BinaryView*)ctxt;
@@ -333,6 +359,14 @@ bool BinaryView::PerformIsOffsetExecutable(uint64_t offset)
}
+uint64_t BinaryView::PerformGetNextValidOffset(uint64_t offset)
+{
+ if (offset < PerformGetStart())
+ return PerformGetStart();
+ return offset;
+}
+
+
BNEndianness BinaryView::PerformGetDefaultEndianness() const
{
Ref<Architecture> arch = GetDefaultArchitecture();
@@ -569,6 +603,12 @@ bool BinaryView::IsOffsetExecutable(uint64_t offset) const
}
+uint64_t BinaryView::GetNextValidOffset(uint64_t offset) const
+{
+ return BNGetNextValidOffset(m_view, offset);
+}
+
+
uint64_t BinaryView::GetStart() const
{
return BNGetStartOffset(m_view);
@@ -809,6 +849,20 @@ vector<Ref<Symbol>> BinaryView::GetSymbols()
}
+vector<Ref<Symbol>> BinaryView::GetSymbols(uint64_t start, uint64_t len)
+{
+ size_t count;
+ BNSymbol** syms = BNGetSymbolsInRange(m_view, start, len, &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;
@@ -823,6 +877,20 @@ vector<Ref<Symbol>> BinaryView::GetSymbolsOfType(BNSymbolType type)
}
+vector<Ref<Symbol>> BinaryView::GetSymbolsOfType(BNSymbolType type, uint64_t start, uint64_t len)
+{
+ size_t count;
+ BNSymbol** syms = BNGetSymbolsOfTypeInRange(m_view, type, start, len, &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());
@@ -907,6 +975,28 @@ size_t BinaryView::GetInstructionLength(Architecture* arch, uint64_t addr)
}
+vector<BNStringReference> BinaryView::GetStrings()
+{
+ size_t count;
+ BNStringReference* strings = BNGetStrings(m_view, &count);
+ vector<BNStringReference> result;
+ result.insert(result.end(), strings, strings + count);
+ BNFreeStringList(strings);
+ return result;
+}
+
+
+vector<BNStringReference> BinaryView::GetStrings(uint64_t start, uint64_t len)
+{
+ size_t count;
+ BNStringReference* strings = BNGetStringsInRange(m_view, start, len, &count);
+ vector<BNStringReference> result;
+ result.insert(result.end(), strings, strings + count);
+ BNFreeStringList(strings);
+ return result;
+}
+
+
BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetFileObject()))
{
}