diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-02-12 14:34:50 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-02-12 14:34:50 -0500 |
| commit | 83b01dd50407731d14938ac96894c3a4d9065295 (patch) | |
| tree | 2e3ded7103b51aef0d5cd22434e35f4461aeaeba | |
| parent | 6b431b32e32f00f9203ba2a4ca07cc962cdb22aa (diff) | |
Place API code with the associated class
| -rw-r--r-- | api.pro | 10 | ||||
| -rw-r--r-- | binaryninjaapi.cpp | 1433 | ||||
| -rw-r--r-- | binaryreader.cpp | 248 | ||||
| -rw-r--r-- | binaryview.cpp | 332 | ||||
| -rw-r--r-- | binaryviewtype.cpp | 112 | ||||
| -rw-r--r-- | binarywriter.cpp | 214 | ||||
| -rw-r--r-- | databuffer.cpp | 103 | ||||
| -rw-r--r-- | fileaccessor.cpp | 63 | ||||
| -rw-r--r-- | filemetadata.cpp | 148 | ||||
| -rw-r--r-- | transform.cpp | 242 |
10 files changed, 1471 insertions, 1434 deletions
@@ -10,7 +10,15 @@ TARGET = binaryninjaapi TEMPLATE = lib CONFIG += staticlib -SOURCES += binaryninjaapi.cpp +SOURCES += \ + databuffer.cpp \ + filemetadata.cpp \ + fileaccessor.cpp \ + binaryview.cpp \ + binaryviewtype.cpp \ + binaryreader.cpp \ + binarywriter.cpp \ + transform.cpp HEADERS += binaryninjaapi.h unix { diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp deleted file mode 100644 index 677c7c27..00000000 --- a/binaryninjaapi.cpp +++ /dev/null @@ -1,1433 +0,0 @@ -#include "binaryninjaapi.h" - -using namespace BinaryNinja; -using namespace std; - - -DataBuffer::DataBuffer() -{ - m_buffer = BNCreateDataBuffer(nullptr, 0); -} - - -DataBuffer::DataBuffer(size_t len) -{ - m_buffer = BNCreateDataBuffer(nullptr, len); -} - - -DataBuffer::DataBuffer(const DataBuffer& buf) -{ - m_buffer = BNDuplicateDataBuffer(buf.m_buffer); -} - - -DataBuffer::DataBuffer(BNDataBuffer* buf) -{ - m_buffer = buf; -} - - -DataBuffer::~DataBuffer() -{ - BNFreeDataBuffer(m_buffer); -} - - -DataBuffer& DataBuffer::operator=(const DataBuffer& buf) -{ - BNFreeDataBuffer(m_buffer); - m_buffer = BNDuplicateDataBuffer(buf.m_buffer); - return *this; -} - - -void* DataBuffer::GetData() -{ - return BNGetDataBufferContents(m_buffer); -} - - -const void* DataBuffer::GetData() const -{ - return BNGetDataBufferContents(m_buffer); -} - - -void* DataBuffer::GetDataAt(size_t offset) -{ - return BNGetDataBufferContentsAt(m_buffer, offset); -} - - -size_t DataBuffer::GetLength() const -{ - return BNGetDataBufferLength(m_buffer); -} - - -void DataBuffer::SetSize(size_t len) -{ - BNSetDataBufferLength(m_buffer, len); -} - - -void DataBuffer::Append(const void* data, size_t len) -{ - BNAppendDataBufferContents(m_buffer, data, len); -} - - -void DataBuffer::Append(const DataBuffer& buf) -{ - BNAppendDataBuffer(m_buffer, buf.m_buffer); -} - - -DataBuffer DataBuffer::GetSlice(size_t start, size_t len) -{ - BNDataBuffer* result = BNGetDataBufferSlice(m_buffer, start, len); - return DataBuffer(result); -} - - -uint8_t& DataBuffer::operator[](size_t offset) -{ - return ((uint8_t*)GetData())[offset]; -} - - -const uint8_t& DataBuffer::operator[](size_t offset) const -{ - return ((const uint8_t*)GetData())[offset]; -} - - -char* NavigationHandler::GetCurrentViewCallback(void* ctxt) -{ - NavigationHandler* handler = (NavigationHandler*)ctxt; - string result = handler->GetCurrentView(); - return BNAllocString(result.c_str()); -} - - -uint64_t NavigationHandler::GetCurrentOffsetCallback(void* ctxt) -{ - NavigationHandler* handler = (NavigationHandler*)ctxt; - return handler->GetCurrentOffset(); -} - - -bool NavigationHandler::NavigateCallback(void* ctxt, const char* view, uint64_t offset) -{ - NavigationHandler* handler = (NavigationHandler*)ctxt; - return handler->Navigate(view, offset); -} - - -NavigationHandler::NavigationHandler() -{ - m_callbacks.context = this; - m_callbacks.getCurrentView = GetCurrentViewCallback; - m_callbacks.getCurrentOffset = GetCurrentOffsetCallback; - m_callbacks.navigate = NavigateCallback; -} - - -void UndoAction::UndoCallback(void* ctxt) -{ - UndoAction* action = (UndoAction*)ctxt; - action->Undo(); -} - - -void UndoAction::RedoCallback(void* ctxt) -{ - UndoAction* action = (UndoAction*)ctxt; - action->Redo(); -} - - -void UndoAction::Add(BNFileMetadata* file) -{ - BNAddUndoAction(file, this, UndoCallback, RedoCallback); -} - - -FileMetadata::FileMetadata() -{ - m_file = BNCreateFileMetadata(); -} - - -FileMetadata::FileMetadata(BNFileMetadata* file) -{ - m_file = file; -} - - -FileMetadata::~FileMetadata() -{ - BNFreeFileMetadata(m_file); -} - - -void FileMetadata::SetNavigationHandler(NavigationHandler* handler) -{ - BNSetFileMetadataNavigationHandler(m_file, handler->GetCallbacks()); -} - - -bool FileMetadata::IsModified() const -{ - return BNIsFileModified(m_file); -} - - -void FileMetadata::MarkFileModified() -{ - BNMarkFileModified(m_file); -} - - -void FileMetadata::MarkFileSaved() -{ - BNMarkFileSaved(m_file); -} - - -void FileMetadata::BeginUndoActions() -{ - BNBeginUndoActions(m_file); -} - - -void FileMetadata::AddUndoAction(UndoAction* action) -{ - action->Add(m_file); -} - - -void FileMetadata::CommitUndoActions() -{ - BNCommitUndoActions(m_file); -} - - -bool FileMetadata::Undo() -{ - return BNUndo(m_file); -} - - -bool FileMetadata::Redo() -{ - return BNRedo(m_file); -} - - -string FileMetadata::GetCurrentView() -{ - char* view = BNGetCurrentView(m_file); - string result = view; - BNFreeString(view); - return result; -} - - -uint64_t FileMetadata::GetCurrentOffset() -{ - return BNGetCurrentOffset(m_file); -} - - -bool FileMetadata::Navigate(const string& view, uint64_t offset) -{ - return BNNavigate(m_file, view.c_str(), offset); -} - - -void BinaryDataNotification::DataWrittenCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len) -{ - BinaryDataNotification* notify = (BinaryDataNotification*)ctxt; - Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object)); - notify->OnBinaryDataWritten(view, offset, len); -} - - -void BinaryDataNotification::DataInsertedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len) -{ - BinaryDataNotification* notify = (BinaryDataNotification*)ctxt; - Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object)); - notify->OnBinaryDataInserted(view, offset, len); -} - - -void BinaryDataNotification::DataRemovedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, uint64_t len) -{ - BinaryDataNotification* notify = (BinaryDataNotification*)ctxt; - Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object)); - notify->OnBinaryDataRemoved(view, offset, len); -} - - -BinaryDataNotification::BinaryDataNotification() -{ - m_callbacks.context = this; - m_callbacks.dataWritten = DataWrittenCallback; - m_callbacks.dataInserted = DataInsertedCallback; - m_callbacks.dataRemoved = DataRemovedCallback; -} - - -uint64_t FileAccessor::GetLengthCallback(void* ctxt) -{ - FileAccessor* file = (FileAccessor*)ctxt; - return file->GetLength(); -} - - -size_t FileAccessor::ReadCallback(void* ctxt, void* dest, uint64_t offset, size_t len) -{ - FileAccessor* file = (FileAccessor*)ctxt; - return file->Read(dest, offset, len); -} - - -size_t FileAccessor::WriteCallback(void* ctxt, uint64_t offset, const void* src, size_t len) -{ - FileAccessor* file = (FileAccessor*)ctxt; - return file->Write(offset, src, len); -} - - -FileAccessor::FileAccessor() -{ - m_callbacks.context = this; - m_callbacks.getLength = GetLengthCallback; - m_callbacks.read = ReadCallback; - m_callbacks.write = WriteCallback; -} - - -FileAccessor::FileAccessor(BNFileAccessor* accessor): m_callbacks(*accessor) -{ -} - - -CoreFileAccessor::CoreFileAccessor(BNFileAccessor* accessor): FileAccessor(accessor) -{ -} - - -uint64_t CoreFileAccessor::GetLength() const -{ - return m_callbacks.getLength(m_callbacks.context); -} - - -size_t CoreFileAccessor::Read(void* dest, uint64_t offset, size_t len) -{ - return m_callbacks.read(m_callbacks.context, dest, offset, len); -} - - -size_t CoreFileAccessor::Write(uint64_t offset, const void* src, size_t len) -{ - return m_callbacks.write(m_callbacks.context, offset, src, len); -} - - -BinaryView::BinaryView(FileMetadata* file) -{ - BNCustomBinaryView view; - view.context = this; - view.read = ReadCallback; - view.write = WriteCallback; - view.insert = InsertCallback; - view.remove = RemoveCallback; - view.getModification = GetModificationCallback; - view.getStart = GetStartCallback; - view.getLength = GetLengthCallback; - view.isExecutable = IsExecutableCallback; - view.save = SaveCallback; - - m_file = file; - m_view = BNCreateCustomBinaryView(m_file->GetFileObject(), &view); -} - - -BinaryView::BinaryView(BNBinaryView* view) -{ - m_view = view; - m_file = new FileMetadata(BNNewFileReference(BNGetFileForView(m_view))); -} - - -BinaryView::~BinaryView() -{ - BNFreeBinaryView(m_view); -} - - -size_t BinaryView::ReadCallback(void* ctxt, void* dest, uint64_t offset, size_t len) -{ - BinaryView* view = (BinaryView*)ctxt; - return view->Read(dest, offset, len); -} - - -size_t BinaryView::WriteCallback(void* ctxt, uint64_t offset, const void* src, size_t len) -{ - BinaryView* view = (BinaryView*)ctxt; - return view->Write(offset, src, len); -} - - -size_t BinaryView::InsertCallback(void* ctxt, uint64_t offset, const void* src, size_t len) -{ - BinaryView* view = (BinaryView*)ctxt; - return view->Insert(offset, src, len); -} - - -size_t BinaryView::RemoveCallback(void* ctxt, uint64_t offset, uint64_t len) -{ - BinaryView* view = (BinaryView*)ctxt; - return view->Remove(offset, len); -} - - -BNModificationStatus BinaryView::GetModificationCallback(void* ctxt, uint64_t offset) -{ - BinaryView* view = (BinaryView*)ctxt; - return view->GetModification(offset); -} - - -uint64_t BinaryView::GetStartCallback(void* ctxt) -{ - BinaryView* view = (BinaryView*)ctxt; - return view->GetStart(); -} - - -uint64_t BinaryView::GetLengthCallback(void* ctxt) -{ - BinaryView* view = (BinaryView*)ctxt; - return view->GetLength(); -} - - -bool BinaryView::IsExecutableCallback(void* ctxt) -{ - BinaryView* view = (BinaryView*)ctxt; - return view->IsExecutable(); -} - - -bool BinaryView::SaveCallback(void* ctxt, BNFileAccessor* file) -{ - BinaryView* view = (BinaryView*)ctxt; - CoreFileAccessor accessor(file); - return view->Save(&accessor); -} - - -bool BinaryView::IsModified() const -{ - return m_file->IsModified(); -} - - -void BinaryView::BeginUndoActions() -{ - m_file->BeginUndoActions(); -} - - -void BinaryView::AddUndoAction(UndoAction* action) -{ - m_file->AddUndoAction(action); -} - - -void BinaryView::CommitUndoActions() -{ - m_file->CommitUndoActions(); -} - - -bool BinaryView::Undo() -{ - return m_file->Undo(); -} - - -bool BinaryView::Redo() -{ - return m_file->Redo(); -} - - -string BinaryView::GetCurrentView() -{ - return m_file->GetCurrentView(); -} - - -uint64_t BinaryView::GetCurrentOffset() -{ - return m_file->GetCurrentOffset(); -} - - -bool BinaryView::Navigate(const string& view, uint64_t offset) -{ - return m_file->Navigate(view, offset); -} - - -DataBuffer BinaryView::ReadBuffer(uint64_t offset, size_t len) -{ - BNDataBuffer* result = BNReadViewBuffer(m_view, offset, len); - return DataBuffer(result); -} - - -size_t BinaryView::WriteBuffer(uint64_t offset, const DataBuffer& data) -{ - return BNWriteViewBuffer(m_view, offset, data.GetBufferObject()); -} - - -size_t BinaryView::InsertBuffer(uint64_t offset, const DataBuffer& data) -{ - return BNInsertViewBuffer(m_view, offset, data.GetBufferObject()); -} - - -vector<BNModificationStatus> BinaryView::GetModification(uint64_t offset, size_t len) -{ - BNModificationStatus* mod = new BNModificationStatus[len]; - len = BNGetModificationArray(m_view, offset, mod, len); - - vector<BNModificationStatus> result; - for (size_t i = 0; i < len; i++) - result.push_back(mod[i]); - - delete[] mod; - return result; -} - - -uint64_t BinaryView::GetEnd() const -{ - return BNGetEndOffset(m_view); -} - - -bool BinaryView::Save(const string& path) -{ - return BNSaveToFilename(m_view, path.c_str()); -} - - -void BinaryView::RegisterNotification(BinaryDataNotification* notify) -{ - BNRegisterDataNotification(m_view, notify->GetCallbacks()); -} - - -void BinaryView::UnregisterNotification(BinaryDataNotification* notify) -{ - BNUnregisterDataNotification(m_view, notify->GetCallbacks()); -} - - -CoreBinaryView::CoreBinaryView(BNBinaryView* view): BinaryView(view) -{ -} - - -size_t CoreBinaryView::Read(void* dest, uint64_t offset, size_t len) -{ - return BNReadViewData(m_view, dest, offset, len); -} - - -size_t CoreBinaryView::Write(uint64_t offset, const void* data, size_t len) -{ - return BNWriteViewData(m_view, offset, data, len); -} - - -size_t CoreBinaryView::Insert(uint64_t offset, const void* data, size_t len) -{ - return BNInsertViewData(m_view, offset, data, len); -} - - -size_t CoreBinaryView::Remove(uint64_t offset, uint64_t len) -{ - return BNRemoveViewData(m_view, offset, len); -} - - -BNModificationStatus CoreBinaryView::GetModification(uint64_t offset) -{ - return BNGetModification(m_view, offset); -} - - -uint64_t CoreBinaryView::GetStart() const -{ - return BNGetStartOffset(m_view); -} - - -uint64_t CoreBinaryView::GetLength() const -{ - return BNGetViewLength(m_view); -} - - -bool CoreBinaryView::IsExecutable() const -{ - return BNIsExecutableView(m_view); -} - - -bool CoreBinaryView::Save(FileAccessor* file) -{ - return BNSaveToFile(m_view, file->GetCallbacks()); -} - - -BinaryData::BinaryData(FileMetadata* file): CoreBinaryView(BNCreateBinaryDataView(file->GetFileObject())) -{ -} - - -BinaryData::BinaryData(FileMetadata* file, const DataBuffer& data): - CoreBinaryView(BNCreateBinaryDataViewFromBuffer(file->GetFileObject(), data.GetBufferObject())) -{ -} - - -BinaryData::BinaryData(FileMetadata* file, const void* data, size_t len): - CoreBinaryView(BNCreateBinaryDataViewFromData(file->GetFileObject(), data, len)) -{ -} - - -BinaryData::BinaryData(FileMetadata* file, const string& path): - CoreBinaryView(BNCreateBinaryDataViewFromFilename(file->GetFileObject(), path.c_str())) -{ -} - - -BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor): - CoreBinaryView(BNCreateBinaryDataViewFromFile(file->GetFileObject(), accessor->GetCallbacks())) -{ -} - - -BNBinaryView* BinaryViewType::CreateCallback(void* ctxt, BNBinaryView* data) -{ - BinaryViewType* type = (BinaryViewType*)ctxt; - Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data)); - Ref<BinaryView> result = type->Create(view); - return BNNewViewReference(result->GetViewObject()); -} - - -bool BinaryViewType::IsValidCallback(void* ctxt, BNBinaryView* data) -{ - BinaryViewType* type = (BinaryViewType*)ctxt; - Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data)); - return type->IsTypeValidForData(view); -} - - -BinaryViewType::BinaryViewType(BNBinaryViewType* type): m_type(type) -{ -} - - -BinaryViewType::BinaryViewType(const string& name, const string& longName): - m_type(nullptr), m_nameForRegister(name), m_longNameForRegister(longName) -{ -} - - -BinaryViewType::~BinaryViewType() -{ - BNFreeBinaryViewType(m_type); -} - - -void BinaryViewType::Register(BinaryViewType* type) -{ - BNCustomBinaryViewType callbacks; - callbacks.context = type; - callbacks.create = CreateCallback; - callbacks.isValidForData = IsValidCallback; - - type->m_type = BNRegisterBinaryViewType(type->m_nameForRegister.c_str(), - type->m_longNameForRegister.c_str(), &callbacks); -} - - -Ref<BinaryViewType> BinaryViewType::GetByName(const string& name) -{ - BNBinaryViewType* type = BNGetBinaryViewTypeByName(name.c_str()); - if (!type) - return nullptr; - return new CoreBinaryViewType(type); -} - - -vector<Ref<BinaryViewType>> BinaryViewType::GetViewTypesForData(BinaryView* data) -{ - BNBinaryViewType** types; - size_t count; - types = BNGetBinaryViewTypesForData(data->GetViewObject(), &count); - - vector<Ref<BinaryViewType>> result; - for (size_t i = 0; i < count; i++) - result.push_back(new CoreBinaryViewType(BNNewViewTypeReference(types[i]))); - - BNFreeBinaryViewTypeList(types, count); - return result; -} - - -string BinaryViewType::GetName() -{ - char* contents = BNGetBinaryViewTypeName(m_type); - string result = contents; - BNFreeString(contents); - return result; -} - - -string BinaryViewType::GetLongName() -{ - char* contents = BNGetBinaryViewTypeLongName(m_type); - string result = contents; - BNFreeString(contents); - return result; -} - - -CoreBinaryViewType::CoreBinaryViewType(BNBinaryViewType* type): BinaryViewType(type) -{ -} - - -BinaryView* CoreBinaryViewType::Create(BinaryView* data) -{ - BNBinaryView* view = BNCreateBinaryViewOfType(m_type, data->GetViewObject()); - if (!view) - return nullptr; - return new CoreBinaryView(view); -} - - -bool CoreBinaryViewType::IsTypeValidForData(BinaryView* data) -{ - return BNIsBinaryViewTypeValidForData(m_type, data->GetViewObject()); -} - - -BinaryReader::BinaryReader(BinaryView* data, BNEndianness endian): m_view(data) -{ - m_stream = BNCreateBinaryReader(data->GetViewObject()); - BNSetBinaryReaderEndianness(m_stream, endian); -} - - -BinaryReader::~BinaryReader() -{ - BNFreeBinaryReader(m_stream); -} - - -BNEndianness BinaryReader::GetEndianness() const -{ - return BNGetBinaryReaderEndianness(m_stream); -} - - -void BinaryReader::SetEndianness(BNEndianness endian) -{ - BNSetBinaryReaderEndianness(m_stream, endian); -} - - -void BinaryReader::Read(void* dest, size_t len) -{ - if (!BNReadData(m_stream, dest, len)) - throw ReadException(); -} - - -DataBuffer BinaryReader::Read(size_t len) -{ - DataBuffer result(len); - Read(result.GetData(), len); - return result; -} - - -string BinaryReader::ReadString(size_t len) -{ - DataBuffer result = Read(len); - return string((const char*)result.GetData(), len); -} - - -uint8_t BinaryReader::Read8() -{ - uint8_t result; - if (!BNRead8(m_stream, &result)) - throw ReadException(); - return result; -} - - -uint16_t BinaryReader::Read16() -{ - uint16_t result; - if (!BNRead16(m_stream, &result)) - throw ReadException(); - return result; -} - - -uint32_t BinaryReader::Read32() -{ - uint32_t result; - if (!BNRead32(m_stream, &result)) - throw ReadException(); - return result; -} - - -uint64_t BinaryReader::Read64() -{ - uint64_t result; - if (!BNRead64(m_stream, &result)) - throw ReadException(); - return result; -} - - -uint16_t BinaryReader::ReadLE16() -{ - uint16_t result; - if (!BNReadLE16(m_stream, &result)) - throw ReadException(); - return result; -} - - -uint32_t BinaryReader::ReadLE32() -{ - uint32_t result; - if (!BNReadLE32(m_stream, &result)) - throw ReadException(); - return result; -} - - -uint64_t BinaryReader::ReadLE64() -{ - uint64_t result; - if (!BNReadLE64(m_stream, &result)) - throw ReadException(); - return result; -} - - -uint16_t BinaryReader::ReadBE16() -{ - uint16_t result; - if (!BNReadBE16(m_stream, &result)) - throw ReadException(); - return result; -} - - -uint32_t BinaryReader::ReadBE32() -{ - uint32_t result; - if (!BNReadBE32(m_stream, &result)) - throw ReadException(); - return result; -} - - -uint64_t BinaryReader::ReadBE64() -{ - uint64_t result; - if (!BNReadBE64(m_stream, &result)) - throw ReadException(); - return result; -} - - -bool BinaryReader::TryRead(void* dest, size_t len) -{ - return BNReadData(m_stream, dest, len); -} - - -bool BinaryReader::TryRead(DataBuffer& dest, size_t len) -{ - dest.SetSize(len); - return TryRead(dest.GetData(), len); -} - - -bool BinaryReader::TryReadString(string& dest, size_t len) -{ - DataBuffer result(len); - if (!TryRead(result.GetData(), len)) - return false; - dest = string((const char*)result.GetData(), len); - return true; -} - - -bool BinaryReader::TryRead8(uint8_t& result) -{ - return BNRead8(m_stream, &result); -} - - -bool BinaryReader::TryRead16(uint16_t& result) -{ - return BNRead16(m_stream, &result); -} - - -bool BinaryReader::TryRead32(uint32_t& result) -{ - return BNRead32(m_stream, &result); -} - - -bool BinaryReader::TryRead64(uint64_t& result) -{ - return BNRead64(m_stream, &result); -} - - -bool BinaryReader::TryReadLE16(uint16_t& result) -{ - return BNReadLE16(m_stream, &result); -} - - -bool BinaryReader::TryReadLE32(uint32_t& result) -{ - return BNReadLE32(m_stream, &result); -} - - -bool BinaryReader::TryReadLE64(uint64_t& result) -{ - return BNReadLE64(m_stream, &result); -} - - -bool BinaryReader::TryReadBE16(uint16_t& result) -{ - return BNReadBE16(m_stream, &result); -} - - -bool BinaryReader::TryReadBE32(uint32_t& result) -{ - return BNReadBE32(m_stream, &result); -} - - -bool BinaryReader::TryReadBE64(uint64_t& result) -{ - return BNReadBE64(m_stream, &result); -} - - -uint64_t BinaryReader::GetOffset() const -{ - return BNGetReaderPosition(m_stream); -} - - -void BinaryReader::Seek(uint64_t offset) -{ - BNSeekBinaryReader(m_stream, offset); -} - - -void BinaryReader::SeekRelative(int64_t offset) -{ - BNSeekBinaryReaderRelative(m_stream, offset); -} - - -bool BinaryReader::IsEndOfFile() const -{ - return BNIsEndOfFile(m_stream); -} - - -BinaryWriter::BinaryWriter(BinaryView* data, BNEndianness endian): m_view(data) -{ - m_stream = BNCreateBinaryWriter(data->GetViewObject()); - BNSetBinaryWriterEndianness(m_stream, endian); -} - - -BinaryWriter::~BinaryWriter() -{ - BNFreeBinaryWriter(m_stream); -} - - -BNEndianness BinaryWriter::GetEndianness() const -{ - return BNGetBinaryWriterEndianness(m_stream); -} - - -void BinaryWriter::SetEndianness(BNEndianness endian) -{ - BNSetBinaryWriterEndianness(m_stream, endian); -} - - -void BinaryWriter::Write(const void* src, size_t len) -{ - if (!BNWriteData(m_stream, src, len)) - throw WriteException(); -} - - -void BinaryWriter::Write(const DataBuffer& buf) -{ - Write(buf.GetData(), buf.GetLength()); -} - - -void BinaryWriter::Write(const string& str) -{ - Write(str.c_str(), str.size()); -} - - -void BinaryWriter::Write8(uint8_t val) -{ - if (!BNWrite8(m_stream, val)) - throw WriteException(); -} - - -void BinaryWriter::Write16(uint16_t val) -{ - if (!BNWrite16(m_stream, val)) - throw WriteException(); -} - - -void BinaryWriter::Write32(uint32_t val) -{ - if (!BNWrite32(m_stream, val)) - throw WriteException(); -} - - -void BinaryWriter::Write64(uint64_t val) -{ - if (!BNWrite64(m_stream, val)) - throw WriteException(); -} - - -void BinaryWriter::WriteLE16(uint16_t val) -{ - if (!BNWriteLE16(m_stream, val)) - throw WriteException(); -} - - -void BinaryWriter::WriteLE32(uint32_t val) -{ - if (!BNWriteLE32(m_stream, val)) - throw WriteException(); -} - - -void BinaryWriter::WriteLE64(uint64_t val) -{ - if (!BNWriteLE64(m_stream, val)) - throw WriteException(); -} - - -void BinaryWriter::WriteBE16(uint16_t val) -{ - if (!BNWriteBE16(m_stream, val)) - throw WriteException(); -} - - -void BinaryWriter::WriteBE32(uint32_t val) -{ - if (!BNWriteBE32(m_stream, val)) - throw WriteException(); -} - - -void BinaryWriter::WriteBE64(uint64_t val) -{ - if (!BNWriteBE64(m_stream, val)) - throw WriteException(); -} - - -bool BinaryWriter::TryWrite(const void* src, size_t len) -{ - return BNWriteData(m_stream, src, len); -} - - -bool BinaryWriter::TryWrite(const DataBuffer& buf) -{ - return TryWrite(buf.GetData(), buf.GetLength()); -} - - -bool BinaryWriter::TryWrite(const string& str) -{ - return TryWrite(str.c_str(), str.size()); -} - - -bool BinaryWriter::TryWrite8(uint8_t val) -{ - return BNWrite8(m_stream, val); -} - - -bool BinaryWriter::TryWrite16(uint16_t val) -{ - return BNWrite16(m_stream, val); -} - - -bool BinaryWriter::TryWrite32(uint32_t val) -{ - return BNWrite32(m_stream, val); -} - - -bool BinaryWriter::TryWrite64(uint64_t val) -{ - return BNWrite64(m_stream, val); -} - - -bool BinaryWriter::TryWriteLE16(uint16_t val) -{ - return BNWriteLE16(m_stream, val); -} - - -bool BinaryWriter::TryWriteLE32(uint32_t val) -{ - return BNWriteLE32(m_stream, val); -} - - -bool BinaryWriter::TryWriteLE64(uint64_t val) -{ - return BNWriteLE64(m_stream, val); -} - - -bool BinaryWriter::TryWriteBE16(uint16_t val) -{ - return BNWriteBE16(m_stream, val); -} - - -bool BinaryWriter::TryWriteBE32(uint32_t val) -{ - return BNWriteBE32(m_stream, val); -} - - -bool BinaryWriter::TryWriteBE64(uint64_t val) -{ - return BNWriteBE64(m_stream, val); -} - - -uint64_t BinaryWriter::GetOffset() const -{ - return BNGetWriterPosition(m_stream); -} - - -void BinaryWriter::Seek(uint64_t offset) -{ - BNSeekBinaryWriter(m_stream, offset); -} - - -void BinaryWriter::SeekRelative(int64_t offset) -{ - BNSeekBinaryWriterRelative(m_stream, offset); -} - - -Transform::Transform(BNTransform* xform): m_xform(xform) -{ -} - - -Transform::Transform(BNTransformType type, const string& name, const string& longName): - m_xform(nullptr), m_typeForRegister(type), m_nameForRegister(name), m_longNameForRegister(longName) -{ -} - - -BNTransformParameterInfo* Transform::GetParametersCallback(void* ctxt, size_t* count) -{ - Transform* xform = (Transform*)ctxt; - vector<TransformParameter> params = xform->GetParameters(); - *count = params.size(); - BNTransformParameterInfo* result = new BNTransformParameterInfo[params.size()]; - - for (size_t i = 0; i < params.size(); i++) - { - result[i].name = BNAllocString(params[i].name.c_str()); - result[i].longName = BNAllocString(params[i].longName.c_str()); - result[i].fixedLength = params[i].fixedLength; - } - - return result; -} - - -void Transform::FreeParametersCallback(BNTransformParameterInfo* params, size_t count) -{ - for (size_t i = 0; i < count; i++) - { - BNFreeString(params[i].name); - BNFreeString(params[i].longName); - } - delete[] params; -} - - -bool Transform::DecodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount) -{ - map<string, DataBuffer> paramMap; - for (size_t i = 0; i < paramCount; i++) - paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value)); - - DataBuffer inputBuf(BNDuplicateDataBuffer(input)); - DataBuffer outputBuf; - - Transform* xform = (Transform*)ctxt; - bool result = xform->Decode(inputBuf, outputBuf, paramMap); - BNAssignDataBuffer(output, outputBuf.GetBufferObject()); - return result; -} - - -bool Transform::EncodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount) -{ - map<string, DataBuffer> paramMap; - for (size_t i = 0; i < paramCount; i++) - paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value)); - - DataBuffer inputBuf(BNDuplicateDataBuffer(input)); - DataBuffer outputBuf; - - Transform* xform = (Transform*)ctxt; - bool result = xform->Encode(inputBuf, outputBuf, paramMap); - BNAssignDataBuffer(output, outputBuf.GetBufferObject()); - return result; -} - - -vector<TransformParameter> Transform::EncryptionKeyParameters(size_t fixedKeyLength) -{ - vector<TransformParameter> params; - TransformParameter key; - key.name = "key"; - key.longName = "Encryption key"; - key.fixedLength = fixedKeyLength; - params.push_back(key); - return params; -} - - -vector<TransformParameter> Transform::EncryptionKeyAndIVParameters(size_t fixedKeyLength, size_t fixedIVLength) -{ - vector<TransformParameter> params; - TransformParameter key, iv; - key.name = "key"; - key.longName = "Encryption key"; - key.fixedLength = fixedKeyLength; - iv.name = "iv"; - iv.longName = "Initialization vector"; - iv.fixedLength = fixedIVLength; - params.push_back(key); - params.push_back(iv); - return params; -} - - -void Transform::Register(Transform* xform) -{ - BNCustomTransform callbacks; - callbacks.context = xform; - callbacks.getParameters = GetParametersCallback; - callbacks.freeParameters = FreeParametersCallback; - callbacks.decode = DecodeCallback; - callbacks.encode = EncodeCallback; - xform->m_xform = BNRegisterTransformType(xform->m_typeForRegister, xform->m_nameForRegister.c_str(), - xform->m_longNameForRegister.c_str(), &callbacks); -} - - -Ref<Transform> Transform::GetByName(const string& name) -{ - BNTransform* result = BNGetTransformByName(name.c_str()); - if (!result) - return nullptr; - return new CoreTransform(result); -} - - -vector<Ref<Transform>> Transform::GetTransformTypes() -{ - size_t count; - BNTransform** list = BNGetTransformTypeList(&count); - - vector<Ref<Transform>> result; - for (size_t i = 0; i < count; i++) - result.push_back(new CoreTransform(BNNewTransformReference(list[i]))); - - BNFreeTransformTypeList(list, count); - return result; -} - - -BNTransformType Transform::GetType() const -{ - return BNGetTransformType(m_xform); -} - - -string Transform::GetName() const -{ - char* name = BNGetTransformName(m_xform); - string result = name; - BNFreeString(name); - return result; -} - - -string Transform::GetLongName() const -{ - char* name = BNGetTransformLongName(m_xform); - string result = name; - BNFreeString(name); - return result; -} - - -vector<TransformParameter> Transform::GetParameters() const -{ - return vector<TransformParameter>(); -} - - -bool Transform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params) -{ - if (GetType() == InvertingTransform) - return Encode(input, output, params); - return false; -} - - -bool Transform::Encode(const DataBuffer&, DataBuffer&, const map<string, DataBuffer>&) -{ - return false; -} - - -CoreTransform::CoreTransform(BNTransform* xform): Transform(xform) -{ -} - - -vector<TransformParameter> CoreTransform::GetParameters() const -{ - size_t count; - BNTransformParameterInfo* list = BNGetTransformParameterList(m_xform, &count); - - vector<TransformParameter> result; - for (size_t i = 0; i < count; i++) - { - TransformParameter param; - param.name = list[i].name; - param.longName = list[i].longName; - param.fixedLength = list[i].fixedLength; - } - - BNFreeTransformParameterList(list, count); - return result; -} - - -bool CoreTransform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params) -{ - BNTransformParameter* list = new BNTransformParameter[params.size()]; - size_t idx = 0; - for (auto i : params) - { - list[idx].name = i.first.c_str(); - list[idx].value = i.second.GetBufferObject(); - } - - bool result = BNDecode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx); - - delete[] list; - return result; -} - - -bool CoreTransform::Encode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params) -{ - BNTransformParameter* list = new BNTransformParameter[params.size()]; - size_t idx = 0; - for (auto i : params) - { - list[idx].name = i.first.c_str(); - list[idx].value = i.second.GetBufferObject(); - } - - bool result = BNEncode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx); - - delete[] list; - return result; -} diff --git a/binaryreader.cpp b/binaryreader.cpp new file mode 100644 index 00000000..b30a64b0 --- /dev/null +++ b/binaryreader.cpp @@ -0,0 +1,248 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +BinaryReader::BinaryReader(BinaryView* data, BNEndianness endian): m_view(data) +{ + m_stream = BNCreateBinaryReader(data->GetViewObject()); + BNSetBinaryReaderEndianness(m_stream, endian); +} + + +BinaryReader::~BinaryReader() +{ + BNFreeBinaryReader(m_stream); +} + + +BNEndianness BinaryReader::GetEndianness() const +{ + return BNGetBinaryReaderEndianness(m_stream); +} + + +void BinaryReader::SetEndianness(BNEndianness endian) +{ + BNSetBinaryReaderEndianness(m_stream, endian); +} + + +void BinaryReader::Read(void* dest, size_t len) +{ + if (!BNReadData(m_stream, dest, len)) + throw ReadException(); +} + + +DataBuffer BinaryReader::Read(size_t len) +{ + DataBuffer result(len); + Read(result.GetData(), len); + return result; +} + + +string BinaryReader::ReadString(size_t len) +{ + DataBuffer result = Read(len); + return string((const char*)result.GetData(), len); +} + + +uint8_t BinaryReader::Read8() +{ + uint8_t result; + if (!BNRead8(m_stream, &result)) + throw ReadException(); + return result; +} + + +uint16_t BinaryReader::Read16() +{ + uint16_t result; + if (!BNRead16(m_stream, &result)) + throw ReadException(); + return result; +} + + +uint32_t BinaryReader::Read32() +{ + uint32_t result; + if (!BNRead32(m_stream, &result)) + throw ReadException(); + return result; +} + + +uint64_t BinaryReader::Read64() +{ + uint64_t result; + if (!BNRead64(m_stream, &result)) + throw ReadException(); + return result; +} + + +uint16_t BinaryReader::ReadLE16() +{ + uint16_t result; + if (!BNReadLE16(m_stream, &result)) + throw ReadException(); + return result; +} + + +uint32_t BinaryReader::ReadLE32() +{ + uint32_t result; + if (!BNReadLE32(m_stream, &result)) + throw ReadException(); + return result; +} + + +uint64_t BinaryReader::ReadLE64() +{ + uint64_t result; + if (!BNReadLE64(m_stream, &result)) + throw ReadException(); + return result; +} + + +uint16_t BinaryReader::ReadBE16() +{ + uint16_t result; + if (!BNReadBE16(m_stream, &result)) + throw ReadException(); + return result; +} + + +uint32_t BinaryReader::ReadBE32() +{ + uint32_t result; + if (!BNReadBE32(m_stream, &result)) + throw ReadException(); + return result; +} + + +uint64_t BinaryReader::ReadBE64() +{ + uint64_t result; + if (!BNReadBE64(m_stream, &result)) + throw ReadException(); + return result; +} + + +bool BinaryReader::TryRead(void* dest, size_t len) +{ + return BNReadData(m_stream, dest, len); +} + + +bool BinaryReader::TryRead(DataBuffer& dest, size_t len) +{ + dest.SetSize(len); + return TryRead(dest.GetData(), len); +} + + +bool BinaryReader::TryReadString(string& dest, size_t len) +{ + DataBuffer result(len); + if (!TryRead(result.GetData(), len)) + return false; + dest = string((const char*)result.GetData(), len); + return true; +} + + +bool BinaryReader::TryRead8(uint8_t& result) +{ + return BNRead8(m_stream, &result); +} + + +bool BinaryReader::TryRead16(uint16_t& result) +{ + return BNRead16(m_stream, &result); +} + + +bool BinaryReader::TryRead32(uint32_t& result) +{ + return BNRead32(m_stream, &result); +} + + +bool BinaryReader::TryRead64(uint64_t& result) +{ + return BNRead64(m_stream, &result); +} + + +bool BinaryReader::TryReadLE16(uint16_t& result) +{ + return BNReadLE16(m_stream, &result); +} + + +bool BinaryReader::TryReadLE32(uint32_t& result) +{ + return BNReadLE32(m_stream, &result); +} + + +bool BinaryReader::TryReadLE64(uint64_t& result) +{ + return BNReadLE64(m_stream, &result); +} + + +bool BinaryReader::TryReadBE16(uint16_t& result) +{ + return BNReadBE16(m_stream, &result); +} + + +bool BinaryReader::TryReadBE32(uint32_t& result) +{ + return BNReadBE32(m_stream, &result); +} + + +bool BinaryReader::TryReadBE64(uint64_t& result) +{ + return BNReadBE64(m_stream, &result); +} + + +uint64_t BinaryReader::GetOffset() const +{ + return BNGetReaderPosition(m_stream); +} + + +void BinaryReader::Seek(uint64_t offset) +{ + BNSeekBinaryReader(m_stream, offset); +} + + +void BinaryReader::SeekRelative(int64_t offset) +{ + BNSeekBinaryReaderRelative(m_stream, offset); +} + + +bool BinaryReader::IsEndOfFile() const +{ + return BNIsEndOfFile(m_stream); +} diff --git a/binaryview.cpp b/binaryview.cpp new file mode 100644 index 00000000..23ff8c56 --- /dev/null +++ b/binaryview.cpp @@ -0,0 +1,332 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +void BinaryDataNotification::DataWrittenCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len) +{ + BinaryDataNotification* notify = (BinaryDataNotification*)ctxt; + Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object)); + notify->OnBinaryDataWritten(view, offset, len); +} + + +void BinaryDataNotification::DataInsertedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, size_t len) +{ + BinaryDataNotification* notify = (BinaryDataNotification*)ctxt; + Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object)); + notify->OnBinaryDataInserted(view, offset, len); +} + + +void BinaryDataNotification::DataRemovedCallback(void* ctxt, BNBinaryView* object, uint64_t offset, uint64_t len) +{ + BinaryDataNotification* notify = (BinaryDataNotification*)ctxt; + Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(object)); + notify->OnBinaryDataRemoved(view, offset, len); +} + + +BinaryDataNotification::BinaryDataNotification() +{ + m_callbacks.context = this; + m_callbacks.dataWritten = DataWrittenCallback; + m_callbacks.dataInserted = DataInsertedCallback; + m_callbacks.dataRemoved = DataRemovedCallback; +} + + +BinaryView::BinaryView(FileMetadata* file) +{ + BNCustomBinaryView view; + view.context = this; + view.read = ReadCallback; + view.write = WriteCallback; + view.insert = InsertCallback; + view.remove = RemoveCallback; + view.getModification = GetModificationCallback; + view.getStart = GetStartCallback; + view.getLength = GetLengthCallback; + view.isExecutable = IsExecutableCallback; + view.save = SaveCallback; + + m_file = file; + m_view = BNCreateCustomBinaryView(m_file->GetFileObject(), &view); +} + + +BinaryView::BinaryView(BNBinaryView* view) +{ + m_view = view; + m_file = new FileMetadata(BNNewFileReference(BNGetFileForView(m_view))); +} + + +BinaryView::~BinaryView() +{ + BNFreeBinaryView(m_view); +} + + +size_t BinaryView::ReadCallback(void* ctxt, void* dest, uint64_t offset, size_t len) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->Read(dest, offset, len); +} + + +size_t BinaryView::WriteCallback(void* ctxt, uint64_t offset, const void* src, size_t len) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->Write(offset, src, len); +} + + +size_t BinaryView::InsertCallback(void* ctxt, uint64_t offset, const void* src, size_t len) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->Insert(offset, src, len); +} + + +size_t BinaryView::RemoveCallback(void* ctxt, uint64_t offset, uint64_t len) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->Remove(offset, len); +} + + +BNModificationStatus BinaryView::GetModificationCallback(void* ctxt, uint64_t offset) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->GetModification(offset); +} + + +uint64_t BinaryView::GetStartCallback(void* ctxt) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->GetStart(); +} + + +uint64_t BinaryView::GetLengthCallback(void* ctxt) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->GetLength(); +} + + +bool BinaryView::IsExecutableCallback(void* ctxt) +{ + BinaryView* view = (BinaryView*)ctxt; + return view->IsExecutable(); +} + + +bool BinaryView::SaveCallback(void* ctxt, BNFileAccessor* file) +{ + BinaryView* view = (BinaryView*)ctxt; + CoreFileAccessor accessor(file); + return view->Save(&accessor); +} + + +bool BinaryView::IsModified() const +{ + return m_file->IsModified(); +} + + +void BinaryView::BeginUndoActions() +{ + m_file->BeginUndoActions(); +} + + +void BinaryView::AddUndoAction(UndoAction* action) +{ + m_file->AddUndoAction(action); +} + + +void BinaryView::CommitUndoActions() +{ + m_file->CommitUndoActions(); +} + + +bool BinaryView::Undo() +{ + return m_file->Undo(); +} + + +bool BinaryView::Redo() +{ + return m_file->Redo(); +} + + +string BinaryView::GetCurrentView() +{ + return m_file->GetCurrentView(); +} + + +uint64_t BinaryView::GetCurrentOffset() +{ + return m_file->GetCurrentOffset(); +} + + +bool BinaryView::Navigate(const string& view, uint64_t offset) +{ + return m_file->Navigate(view, offset); +} + + +DataBuffer BinaryView::ReadBuffer(uint64_t offset, size_t len) +{ + BNDataBuffer* result = BNReadViewBuffer(m_view, offset, len); + return DataBuffer(result); +} + + +size_t BinaryView::WriteBuffer(uint64_t offset, const DataBuffer& data) +{ + return BNWriteViewBuffer(m_view, offset, data.GetBufferObject()); +} + + +size_t BinaryView::InsertBuffer(uint64_t offset, const DataBuffer& data) +{ + return BNInsertViewBuffer(m_view, offset, data.GetBufferObject()); +} + + +vector<BNModificationStatus> BinaryView::GetModification(uint64_t offset, size_t len) +{ + BNModificationStatus* mod = new BNModificationStatus[len]; + len = BNGetModificationArray(m_view, offset, mod, len); + + vector<BNModificationStatus> result; + for (size_t i = 0; i < len; i++) + result.push_back(mod[i]); + + delete[] mod; + return result; +} + + +uint64_t BinaryView::GetEnd() const +{ + return BNGetEndOffset(m_view); +} + + +bool BinaryView::Save(const string& path) +{ + return BNSaveToFilename(m_view, path.c_str()); +} + + +void BinaryView::RegisterNotification(BinaryDataNotification* notify) +{ + BNRegisterDataNotification(m_view, notify->GetCallbacks()); +} + + +void BinaryView::UnregisterNotification(BinaryDataNotification* notify) +{ + BNUnregisterDataNotification(m_view, notify->GetCallbacks()); +} + + +CoreBinaryView::CoreBinaryView(BNBinaryView* view): BinaryView(view) +{ +} + + +size_t CoreBinaryView::Read(void* dest, uint64_t offset, size_t len) +{ + return BNReadViewData(m_view, dest, offset, len); +} + + +size_t CoreBinaryView::Write(uint64_t offset, const void* data, size_t len) +{ + return BNWriteViewData(m_view, offset, data, len); +} + + +size_t CoreBinaryView::Insert(uint64_t offset, const void* data, size_t len) +{ + return BNInsertViewData(m_view, offset, data, len); +} + + +size_t CoreBinaryView::Remove(uint64_t offset, uint64_t len) +{ + return BNRemoveViewData(m_view, offset, len); +} + + +BNModificationStatus CoreBinaryView::GetModification(uint64_t offset) +{ + return BNGetModification(m_view, offset); +} + + +uint64_t CoreBinaryView::GetStart() const +{ + return BNGetStartOffset(m_view); +} + + +uint64_t CoreBinaryView::GetLength() const +{ + return BNGetViewLength(m_view); +} + + +bool CoreBinaryView::IsExecutable() const +{ + return BNIsExecutableView(m_view); +} + + +bool CoreBinaryView::Save(FileAccessor* file) +{ + return BNSaveToFile(m_view, file->GetCallbacks()); +} + + +BinaryData::BinaryData(FileMetadata* file): CoreBinaryView(BNCreateBinaryDataView(file->GetFileObject())) +{ +} + + +BinaryData::BinaryData(FileMetadata* file, const DataBuffer& data): + CoreBinaryView(BNCreateBinaryDataViewFromBuffer(file->GetFileObject(), data.GetBufferObject())) +{ +} + + +BinaryData::BinaryData(FileMetadata* file, const void* data, size_t len): + CoreBinaryView(BNCreateBinaryDataViewFromData(file->GetFileObject(), data, len)) +{ +} + + +BinaryData::BinaryData(FileMetadata* file, const string& path): + CoreBinaryView(BNCreateBinaryDataViewFromFilename(file->GetFileObject(), path.c_str())) +{ +} + + +BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor): + CoreBinaryView(BNCreateBinaryDataViewFromFile(file->GetFileObject(), accessor->GetCallbacks())) +{ +} diff --git a/binaryviewtype.cpp b/binaryviewtype.cpp new file mode 100644 index 00000000..636a8856 --- /dev/null +++ b/binaryviewtype.cpp @@ -0,0 +1,112 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +BNBinaryView* BinaryViewType::CreateCallback(void* ctxt, BNBinaryView* data) +{ + BinaryViewType* type = (BinaryViewType*)ctxt; + Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data)); + Ref<BinaryView> result = type->Create(view); + return BNNewViewReference(result->GetViewObject()); +} + + +bool BinaryViewType::IsValidCallback(void* ctxt, BNBinaryView* data) +{ + BinaryViewType* type = (BinaryViewType*)ctxt; + Ref<BinaryView> view = new CoreBinaryView(BNNewViewReference(data)); + return type->IsTypeValidForData(view); +} + + +BinaryViewType::BinaryViewType(BNBinaryViewType* type): m_type(type) +{ +} + + +BinaryViewType::BinaryViewType(const string& name, const string& longName): + m_type(nullptr), m_nameForRegister(name), m_longNameForRegister(longName) +{ +} + + +BinaryViewType::~BinaryViewType() +{ + BNFreeBinaryViewType(m_type); +} + + +void BinaryViewType::Register(BinaryViewType* type) +{ + BNCustomBinaryViewType callbacks; + callbacks.context = type; + callbacks.create = CreateCallback; + callbacks.isValidForData = IsValidCallback; + + type->m_type = BNRegisterBinaryViewType(type->m_nameForRegister.c_str(), + type->m_longNameForRegister.c_str(), &callbacks); +} + + +Ref<BinaryViewType> BinaryViewType::GetByName(const string& name) +{ + BNBinaryViewType* type = BNGetBinaryViewTypeByName(name.c_str()); + if (!type) + return nullptr; + return new CoreBinaryViewType(type); +} + + +vector<Ref<BinaryViewType>> BinaryViewType::GetViewTypesForData(BinaryView* data) +{ + BNBinaryViewType** types; + size_t count; + types = BNGetBinaryViewTypesForData(data->GetViewObject(), &count); + + vector<Ref<BinaryViewType>> result; + for (size_t i = 0; i < count; i++) + result.push_back(new CoreBinaryViewType(BNNewViewTypeReference(types[i]))); + + BNFreeBinaryViewTypeList(types, count); + return result; +} + + +string BinaryViewType::GetName() +{ + char* contents = BNGetBinaryViewTypeName(m_type); + string result = contents; + BNFreeString(contents); + return result; +} + + +string BinaryViewType::GetLongName() +{ + char* contents = BNGetBinaryViewTypeLongName(m_type); + string result = contents; + BNFreeString(contents); + return result; +} + + +CoreBinaryViewType::CoreBinaryViewType(BNBinaryViewType* type): BinaryViewType(type) +{ +} + + +BinaryView* CoreBinaryViewType::Create(BinaryView* data) +{ + BNBinaryView* view = BNCreateBinaryViewOfType(m_type, data->GetViewObject()); + if (!view) + return nullptr; + return new CoreBinaryView(view); +} + + +bool CoreBinaryViewType::IsTypeValidForData(BinaryView* data) +{ + return BNIsBinaryViewTypeValidForData(m_type, data->GetViewObject()); +} diff --git a/binarywriter.cpp b/binarywriter.cpp new file mode 100644 index 00000000..808d0d5f --- /dev/null +++ b/binarywriter.cpp @@ -0,0 +1,214 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +BinaryWriter::BinaryWriter(BinaryView* data, BNEndianness endian): m_view(data) +{ + m_stream = BNCreateBinaryWriter(data->GetViewObject()); + BNSetBinaryWriterEndianness(m_stream, endian); +} + + +BinaryWriter::~BinaryWriter() +{ + BNFreeBinaryWriter(m_stream); +} + + +BNEndianness BinaryWriter::GetEndianness() const +{ + return BNGetBinaryWriterEndianness(m_stream); +} + + +void BinaryWriter::SetEndianness(BNEndianness endian) +{ + BNSetBinaryWriterEndianness(m_stream, endian); +} + + +void BinaryWriter::Write(const void* src, size_t len) +{ + if (!BNWriteData(m_stream, src, len)) + throw WriteException(); +} + + +void BinaryWriter::Write(const DataBuffer& buf) +{ + Write(buf.GetData(), buf.GetLength()); +} + + +void BinaryWriter::Write(const string& str) +{ + Write(str.c_str(), str.size()); +} + + +void BinaryWriter::Write8(uint8_t val) +{ + if (!BNWrite8(m_stream, val)) + throw WriteException(); +} + + +void BinaryWriter::Write16(uint16_t val) +{ + if (!BNWrite16(m_stream, val)) + throw WriteException(); +} + + +void BinaryWriter::Write32(uint32_t val) +{ + if (!BNWrite32(m_stream, val)) + throw WriteException(); +} + + +void BinaryWriter::Write64(uint64_t val) +{ + if (!BNWrite64(m_stream, val)) + throw WriteException(); +} + + +void BinaryWriter::WriteLE16(uint16_t val) +{ + if (!BNWriteLE16(m_stream, val)) + throw WriteException(); +} + + +void BinaryWriter::WriteLE32(uint32_t val) +{ + if (!BNWriteLE32(m_stream, val)) + throw WriteException(); +} + + +void BinaryWriter::WriteLE64(uint64_t val) +{ + if (!BNWriteLE64(m_stream, val)) + throw WriteException(); +} + + +void BinaryWriter::WriteBE16(uint16_t val) +{ + if (!BNWriteBE16(m_stream, val)) + throw WriteException(); +} + + +void BinaryWriter::WriteBE32(uint32_t val) +{ + if (!BNWriteBE32(m_stream, val)) + throw WriteException(); +} + + +void BinaryWriter::WriteBE64(uint64_t val) +{ + if (!BNWriteBE64(m_stream, val)) + throw WriteException(); +} + + +bool BinaryWriter::TryWrite(const void* src, size_t len) +{ + return BNWriteData(m_stream, src, len); +} + + +bool BinaryWriter::TryWrite(const DataBuffer& buf) +{ + return TryWrite(buf.GetData(), buf.GetLength()); +} + + +bool BinaryWriter::TryWrite(const string& str) +{ + return TryWrite(str.c_str(), str.size()); +} + + +bool BinaryWriter::TryWrite8(uint8_t val) +{ + return BNWrite8(m_stream, val); +} + + +bool BinaryWriter::TryWrite16(uint16_t val) +{ + return BNWrite16(m_stream, val); +} + + +bool BinaryWriter::TryWrite32(uint32_t val) +{ + return BNWrite32(m_stream, val); +} + + +bool BinaryWriter::TryWrite64(uint64_t val) +{ + return BNWrite64(m_stream, val); +} + + +bool BinaryWriter::TryWriteLE16(uint16_t val) +{ + return BNWriteLE16(m_stream, val); +} + + +bool BinaryWriter::TryWriteLE32(uint32_t val) +{ + return BNWriteLE32(m_stream, val); +} + + +bool BinaryWriter::TryWriteLE64(uint64_t val) +{ + return BNWriteLE64(m_stream, val); +} + + +bool BinaryWriter::TryWriteBE16(uint16_t val) +{ + return BNWriteBE16(m_stream, val); +} + + +bool BinaryWriter::TryWriteBE32(uint32_t val) +{ + return BNWriteBE32(m_stream, val); +} + + +bool BinaryWriter::TryWriteBE64(uint64_t val) +{ + return BNWriteBE64(m_stream, val); +} + + +uint64_t BinaryWriter::GetOffset() const +{ + return BNGetWriterPosition(m_stream); +} + + +void BinaryWriter::Seek(uint64_t offset) +{ + BNSeekBinaryWriter(m_stream, offset); +} + + +void BinaryWriter::SeekRelative(int64_t offset) +{ + BNSeekBinaryWriterRelative(m_stream, offset); +} diff --git a/databuffer.cpp b/databuffer.cpp new file mode 100644 index 00000000..dcc94f90 --- /dev/null +++ b/databuffer.cpp @@ -0,0 +1,103 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +DataBuffer::DataBuffer() +{ + m_buffer = BNCreateDataBuffer(nullptr, 0); +} + + +DataBuffer::DataBuffer(size_t len) +{ + m_buffer = BNCreateDataBuffer(nullptr, len); +} + + +DataBuffer::DataBuffer(const DataBuffer& buf) +{ + m_buffer = BNDuplicateDataBuffer(buf.m_buffer); +} + + +DataBuffer::DataBuffer(BNDataBuffer* buf) +{ + m_buffer = buf; +} + + +DataBuffer::~DataBuffer() +{ + BNFreeDataBuffer(m_buffer); +} + + +DataBuffer& DataBuffer::operator=(const DataBuffer& buf) +{ + BNFreeDataBuffer(m_buffer); + m_buffer = BNDuplicateDataBuffer(buf.m_buffer); + return *this; +} + + +void* DataBuffer::GetData() +{ + return BNGetDataBufferContents(m_buffer); +} + + +const void* DataBuffer::GetData() const +{ + return BNGetDataBufferContents(m_buffer); +} + + +void* DataBuffer::GetDataAt(size_t offset) +{ + return BNGetDataBufferContentsAt(m_buffer, offset); +} + + +size_t DataBuffer::GetLength() const +{ + return BNGetDataBufferLength(m_buffer); +} + + +void DataBuffer::SetSize(size_t len) +{ + BNSetDataBufferLength(m_buffer, len); +} + + +void DataBuffer::Append(const void* data, size_t len) +{ + BNAppendDataBufferContents(m_buffer, data, len); +} + + +void DataBuffer::Append(const DataBuffer& buf) +{ + BNAppendDataBuffer(m_buffer, buf.m_buffer); +} + + +DataBuffer DataBuffer::GetSlice(size_t start, size_t len) +{ + BNDataBuffer* result = BNGetDataBufferSlice(m_buffer, start, len); + return DataBuffer(result); +} + + +uint8_t& DataBuffer::operator[](size_t offset) +{ + return ((uint8_t*)GetData())[offset]; +} + + +const uint8_t& DataBuffer::operator[](size_t offset) const +{ + return ((const uint8_t*)GetData())[offset]; +} diff --git a/fileaccessor.cpp b/fileaccessor.cpp new file mode 100644 index 00000000..4a90d8dc --- /dev/null +++ b/fileaccessor.cpp @@ -0,0 +1,63 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +uint64_t FileAccessor::GetLengthCallback(void* ctxt) +{ + FileAccessor* file = (FileAccessor*)ctxt; + return file->GetLength(); +} + + +size_t FileAccessor::ReadCallback(void* ctxt, void* dest, uint64_t offset, size_t len) +{ + FileAccessor* file = (FileAccessor*)ctxt; + return file->Read(dest, offset, len); +} + + +size_t FileAccessor::WriteCallback(void* ctxt, uint64_t offset, const void* src, size_t len) +{ + FileAccessor* file = (FileAccessor*)ctxt; + return file->Write(offset, src, len); +} + + +FileAccessor::FileAccessor() +{ + m_callbacks.context = this; + m_callbacks.getLength = GetLengthCallback; + m_callbacks.read = ReadCallback; + m_callbacks.write = WriteCallback; +} + + +FileAccessor::FileAccessor(BNFileAccessor* accessor): m_callbacks(*accessor) +{ +} + + +CoreFileAccessor::CoreFileAccessor(BNFileAccessor* accessor): FileAccessor(accessor) +{ +} + + +uint64_t CoreFileAccessor::GetLength() const +{ + return m_callbacks.getLength(m_callbacks.context); +} + + +size_t CoreFileAccessor::Read(void* dest, uint64_t offset, size_t len) +{ + return m_callbacks.read(m_callbacks.context, dest, offset, len); +} + + +size_t CoreFileAccessor::Write(uint64_t offset, const void* src, size_t len) +{ + return m_callbacks.write(m_callbacks.context, offset, src, len); +} + diff --git a/filemetadata.cpp b/filemetadata.cpp new file mode 100644 index 00000000..b214e826 --- /dev/null +++ b/filemetadata.cpp @@ -0,0 +1,148 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +char* NavigationHandler::GetCurrentViewCallback(void* ctxt) +{ + NavigationHandler* handler = (NavigationHandler*)ctxt; + string result = handler->GetCurrentView(); + return BNAllocString(result.c_str()); +} + + +uint64_t NavigationHandler::GetCurrentOffsetCallback(void* ctxt) +{ + NavigationHandler* handler = (NavigationHandler*)ctxt; + return handler->GetCurrentOffset(); +} + + +bool NavigationHandler::NavigateCallback(void* ctxt, const char* view, uint64_t offset) +{ + NavigationHandler* handler = (NavigationHandler*)ctxt; + return handler->Navigate(view, offset); +} + + +NavigationHandler::NavigationHandler() +{ + m_callbacks.context = this; + m_callbacks.getCurrentView = GetCurrentViewCallback; + m_callbacks.getCurrentOffset = GetCurrentOffsetCallback; + m_callbacks.navigate = NavigateCallback; +} + + +void UndoAction::UndoCallback(void* ctxt) +{ + UndoAction* action = (UndoAction*)ctxt; + action->Undo(); +} + + +void UndoAction::RedoCallback(void* ctxt) +{ + UndoAction* action = (UndoAction*)ctxt; + action->Redo(); +} + + +void UndoAction::Add(BNFileMetadata* file) +{ + BNAddUndoAction(file, this, UndoCallback, RedoCallback); +} + + +FileMetadata::FileMetadata() +{ + m_file = BNCreateFileMetadata(); +} + + +FileMetadata::FileMetadata(BNFileMetadata* file) +{ + m_file = file; +} + + +FileMetadata::~FileMetadata() +{ + BNFreeFileMetadata(m_file); +} + + +void FileMetadata::SetNavigationHandler(NavigationHandler* handler) +{ + BNSetFileMetadataNavigationHandler(m_file, handler->GetCallbacks()); +} + + +bool FileMetadata::IsModified() const +{ + return BNIsFileModified(m_file); +} + + +void FileMetadata::MarkFileModified() +{ + BNMarkFileModified(m_file); +} + + +void FileMetadata::MarkFileSaved() +{ + BNMarkFileSaved(m_file); +} + + +void FileMetadata::BeginUndoActions() +{ + BNBeginUndoActions(m_file); +} + + +void FileMetadata::AddUndoAction(UndoAction* action) +{ + action->Add(m_file); +} + + +void FileMetadata::CommitUndoActions() +{ + BNCommitUndoActions(m_file); +} + + +bool FileMetadata::Undo() +{ + return BNUndo(m_file); +} + + +bool FileMetadata::Redo() +{ + return BNRedo(m_file); +} + + +string FileMetadata::GetCurrentView() +{ + char* view = BNGetCurrentView(m_file); + string result = view; + BNFreeString(view); + return result; +} + + +uint64_t FileMetadata::GetCurrentOffset() +{ + return BNGetCurrentOffset(m_file); +} + + +bool FileMetadata::Navigate(const string& view, uint64_t offset) +{ + return BNNavigate(m_file, view.c_str(), offset); +} diff --git a/transform.cpp b/transform.cpp new file mode 100644 index 00000000..4f8fe71d --- /dev/null +++ b/transform.cpp @@ -0,0 +1,242 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +Transform::Transform(BNTransform* xform): m_xform(xform) +{ +} + + +Transform::Transform(BNTransformType type, const string& name, const string& longName): + m_xform(nullptr), m_typeForRegister(type), m_nameForRegister(name), m_longNameForRegister(longName) +{ +} + + +BNTransformParameterInfo* Transform::GetParametersCallback(void* ctxt, size_t* count) +{ + Transform* xform = (Transform*)ctxt; + vector<TransformParameter> params = xform->GetParameters(); + *count = params.size(); + BNTransformParameterInfo* result = new BNTransformParameterInfo[params.size()]; + + for (size_t i = 0; i < params.size(); i++) + { + result[i].name = BNAllocString(params[i].name.c_str()); + result[i].longName = BNAllocString(params[i].longName.c_str()); + result[i].fixedLength = params[i].fixedLength; + } + + return result; +} + + +void Transform::FreeParametersCallback(BNTransformParameterInfo* params, size_t count) +{ + for (size_t i = 0; i < count; i++) + { + BNFreeString(params[i].name); + BNFreeString(params[i].longName); + } + delete[] params; +} + + +bool Transform::DecodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount) +{ + map<string, DataBuffer> paramMap; + for (size_t i = 0; i < paramCount; i++) + paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value)); + + DataBuffer inputBuf(BNDuplicateDataBuffer(input)); + DataBuffer outputBuf; + + Transform* xform = (Transform*)ctxt; + bool result = xform->Decode(inputBuf, outputBuf, paramMap); + BNAssignDataBuffer(output, outputBuf.GetBufferObject()); + return result; +} + + +bool Transform::EncodeCallback(void* ctxt, BNDataBuffer* input, BNDataBuffer* output, BNTransformParameter* params, size_t paramCount) +{ + map<string, DataBuffer> paramMap; + for (size_t i = 0; i < paramCount; i++) + paramMap[params[i].name] = DataBuffer(BNDuplicateDataBuffer(params[i].value)); + + DataBuffer inputBuf(BNDuplicateDataBuffer(input)); + DataBuffer outputBuf; + + Transform* xform = (Transform*)ctxt; + bool result = xform->Encode(inputBuf, outputBuf, paramMap); + BNAssignDataBuffer(output, outputBuf.GetBufferObject()); + return result; +} + + +vector<TransformParameter> Transform::EncryptionKeyParameters(size_t fixedKeyLength) +{ + vector<TransformParameter> params; + TransformParameter key; + key.name = "key"; + key.longName = "Encryption key"; + key.fixedLength = fixedKeyLength; + params.push_back(key); + return params; +} + + +vector<TransformParameter> Transform::EncryptionKeyAndIVParameters(size_t fixedKeyLength, size_t fixedIVLength) +{ + vector<TransformParameter> params; + TransformParameter key, iv; + key.name = "key"; + key.longName = "Encryption key"; + key.fixedLength = fixedKeyLength; + iv.name = "iv"; + iv.longName = "Initialization vector"; + iv.fixedLength = fixedIVLength; + params.push_back(key); + params.push_back(iv); + return params; +} + + +void Transform::Register(Transform* xform) +{ + BNCustomTransform callbacks; + callbacks.context = xform; + callbacks.getParameters = GetParametersCallback; + callbacks.freeParameters = FreeParametersCallback; + callbacks.decode = DecodeCallback; + callbacks.encode = EncodeCallback; + xform->m_xform = BNRegisterTransformType(xform->m_typeForRegister, xform->m_nameForRegister.c_str(), + xform->m_longNameForRegister.c_str(), &callbacks); +} + + +Ref<Transform> Transform::GetByName(const string& name) +{ + BNTransform* result = BNGetTransformByName(name.c_str()); + if (!result) + return nullptr; + return new CoreTransform(result); +} + + +vector<Ref<Transform>> Transform::GetTransformTypes() +{ + size_t count; + BNTransform** list = BNGetTransformTypeList(&count); + + vector<Ref<Transform>> result; + for (size_t i = 0; i < count; i++) + result.push_back(new CoreTransform(BNNewTransformReference(list[i]))); + + BNFreeTransformTypeList(list, count); + return result; +} + + +BNTransformType Transform::GetType() const +{ + return BNGetTransformType(m_xform); +} + + +string Transform::GetName() const +{ + char* name = BNGetTransformName(m_xform); + string result = name; + BNFreeString(name); + return result; +} + + +string Transform::GetLongName() const +{ + char* name = BNGetTransformLongName(m_xform); + string result = name; + BNFreeString(name); + return result; +} + + +vector<TransformParameter> Transform::GetParameters() const +{ + return vector<TransformParameter>(); +} + + +bool Transform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params) +{ + if (GetType() == InvertingTransform) + return Encode(input, output, params); + return false; +} + + +bool Transform::Encode(const DataBuffer&, DataBuffer&, const map<string, DataBuffer>&) +{ + return false; +} + + +CoreTransform::CoreTransform(BNTransform* xform): Transform(xform) +{ +} + + +vector<TransformParameter> CoreTransform::GetParameters() const +{ + size_t count; + BNTransformParameterInfo* list = BNGetTransformParameterList(m_xform, &count); + + vector<TransformParameter> result; + for (size_t i = 0; i < count; i++) + { + TransformParameter param; + param.name = list[i].name; + param.longName = list[i].longName; + param.fixedLength = list[i].fixedLength; + } + + BNFreeTransformParameterList(list, count); + return result; +} + + +bool CoreTransform::Decode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params) +{ + BNTransformParameter* list = new BNTransformParameter[params.size()]; + size_t idx = 0; + for (auto i : params) + { + list[idx].name = i.first.c_str(); + list[idx].value = i.second.GetBufferObject(); + } + + bool result = BNDecode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx); + + delete[] list; + return result; +} + + +bool CoreTransform::Encode(const DataBuffer& input, DataBuffer& output, const map<string, DataBuffer>& params) +{ + BNTransformParameter* list = new BNTransformParameter[params.size()]; + size_t idx = 0; + for (auto i : params) + { + list[idx].name = i.first.c_str(); + list[idx].value = i.second.GetBufferObject(); + } + + bool result = BNEncode(m_xform, input.GetBufferObject(), output.GetBufferObject(), list, idx); + + delete[] list; + return result; +} |
