diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-12-10 00:25:25 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-12-10 00:25:48 -0500 |
| commit | 02f23d610975f4a26ecbbbbbc19aa731a43a9a8d (patch) | |
| tree | a32011791b35da9dfb91fa50d42625eddafe30a3 /binaryview.cpp | |
| parent | 0f6f924f277084429029ba69907d7d51770476e4 (diff) | |
Backend string finding and API to fetch string list
Diffstat (limited to 'binaryview.cpp')
| -rw-r--r-- | binaryview.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
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())) { } |
