diff options
| author | Rusty Wagner <dontpanic@binaryninja.com> | 2015-03-21 03:51:23 -0400 |
|---|---|---|
| committer | Rusty Wagner <dontpanic@binaryninja.com> | 2015-03-21 03:51:23 -0400 |
| commit | c85cae0d74c2c32b23f5e1422f230bebd61f1b1e (patch) | |
| tree | db86059ab0816bc57c469fa72d144768711f9077 | |
| parent | e044ab55ef7204237507465074b54a113c8aae4d (diff) | |
Add assemble dialog and use nasm for x86/x86_64
| -rw-r--r-- | api.pro | 3 | ||||
| -rw-r--r-- | architecture.cpp | 27 | ||||
| -rw-r--r-- | binaryninjaapi.h | 23 | ||||
| -rw-r--r-- | databuffer.cpp | 6 | ||||
| -rw-r--r-- | filemetadata.cpp | 2 | ||||
| -rw-r--r-- | tempfile.cpp | 55 |
6 files changed, 113 insertions, 3 deletions
@@ -25,7 +25,8 @@ SOURCES += \ function.cpp \ functiongraph.cpp \ functiongraphblock.cpp \ - log.cpp + log.cpp \ + tempfile.cpp HEADERS += binaryninjaapi.h unix { diff --git a/architecture.cpp b/architecture.cpp index eca3a9a6..fc5b0466 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -88,6 +88,19 @@ void Architecture::FreeInstructionTextCallback(BNInstructionTextToken* tokens, s } +bool Architecture::AssembleCallback(void* ctxt, const char* code, uint64_t addr, BNDataBuffer* result, char** errors) +{ + Architecture* arch = (Architecture*)ctxt; + DataBuffer buf; + string errorStr; + bool ok = arch->Assemble(code, addr, buf, errorStr); + + BNSetDataBufferContents(result, buf.GetData(), buf.GetLength()); + *errors = BNAllocString(errorStr.c_str()); + return ok; +} + + void Architecture::Register(Architecture* arch) { BNCustomArchitecture callbacks; @@ -95,6 +108,7 @@ void Architecture::Register(Architecture* arch) callbacks.getInstructionInfo = GetInstructionInfoCallback; callbacks.getInstructionText = GetInstructionTextCallback; callbacks.freeInstructionText = FreeInstructionTextCallback; + callbacks.assemble = AssembleCallback; arch->m_arch = BNRegisterArchitecture(arch->m_nameForRegister.c_str(), &callbacks); } @@ -156,3 +170,16 @@ bool CoreArchitecture::GetInstructionText(const uint8_t* data, uint64_t addr, si BNFreeInstructionText(tokens, count); return true; } + + +bool CoreArchitecture::Assemble(const string& code, uint64_t addr, DataBuffer& result, string& errors) +{ + char* errorStr = nullptr; + bool ok = BNAssemble(m_arch, code.c_str(), addr, result.GetBufferObject(), &errorStr); + if (errorStr) + { + errors = errorStr; + BNFreeString(errorStr); + } + return ok; +} diff --git a/binaryninjaapi.h b/binaryninjaapi.h index a0dfe693..5a50f5e4 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -173,6 +173,7 @@ namespace BinaryNinja void* GetData(); const void* GetData() const; void* GetDataAt(size_t offset); + const void* GetDataAt(size_t offset) const; size_t GetLength() const; void SetSize(size_t len); @@ -189,6 +190,22 @@ namespace BinaryNinja static DataBuffer FromEscapedString(const std::string& src); }; + class TemporaryFile: public RefCountObject + { + BNTemporaryFile* m_file; + + public: + TemporaryFile(); + TemporaryFile(const DataBuffer& contents); + TemporaryFile(const std::string& contents); + TemporaryFile(BNTemporaryFile* file); + ~TemporaryFile(); + + bool IsValid() const { return m_file != nullptr; } + std::string GetPath() const; + DataBuffer GetContents(); + }; + class NavigationHandler { private: @@ -238,7 +255,7 @@ namespace BinaryNinja void SetNavigationHandler(NavigationHandler* handler); - const std::string& GetFilename() const; + std::string GetFilename() const; void SetFilename(const std::string& name); bool IsModified() const; @@ -704,6 +721,7 @@ namespace BinaryNinja static bool GetInstructionTextCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t* len, BNInstructionTextToken** result, size_t* count); static void FreeInstructionTextCallback(BNInstructionTextToken* tokens, size_t count); + static bool AssembleCallback(void* ctxt, const char* code, uint64_t addr, BNDataBuffer* result, char** errors); public: Architecture(const std::string& name); @@ -719,6 +737,8 @@ namespace BinaryNinja virtual bool GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) = 0; virtual bool GetInstructionText(const uint8_t* data, uint64_t addr, size_t& len, std::vector<InstructionTextToken>& result) = 0; + + virtual bool Assemble(const std::string& code, uint64_t addr, DataBuffer& result, std::string& errors) = 0; }; class CoreArchitecture: public Architecture @@ -728,6 +748,7 @@ namespace BinaryNinja virtual bool GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) override; virtual bool GetInstructionText(const uint8_t* data, uint64_t addr, size_t& len, std::vector<InstructionTextToken>& result) override; + virtual bool Assemble(const std::string& code, uint64_t addr, DataBuffer& result, std::string& errors) override; }; class Function; diff --git a/databuffer.cpp b/databuffer.cpp index 0e11de8e..4bcd930b 100644 --- a/databuffer.cpp +++ b/databuffer.cpp @@ -66,6 +66,12 @@ void* DataBuffer::GetDataAt(size_t offset) } +const void* DataBuffer::GetDataAt(size_t offset) const +{ + return BNGetDataBufferContentsAt(m_buffer, offset); +} + + size_t DataBuffer::GetLength() const { return BNGetDataBufferLength(m_buffer); diff --git a/filemetadata.cpp b/filemetadata.cpp index 2a563f40..0824d234 100644 --- a/filemetadata.cpp +++ b/filemetadata.cpp @@ -86,7 +86,7 @@ void FileMetadata::SetNavigationHandler(NavigationHandler* handler) } -const string& FileMetadata::GetFilename() const +string FileMetadata::GetFilename() const { char* str = BNGetFilename(m_file); string result = str; diff --git a/tempfile.cpp b/tempfile.cpp new file mode 100644 index 00000000..33256c76 --- /dev/null +++ b/tempfile.cpp @@ -0,0 +1,55 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +TemporaryFile::TemporaryFile() +{ + m_file = BNCreateTemporaryFile(); +} + + +TemporaryFile::TemporaryFile(const DataBuffer& contents) +{ + m_file = BNCreateTemporaryFileWithContents(contents.GetBufferObject()); +} + + +TemporaryFile::TemporaryFile(const string& contents) +{ + DataBuffer buf(contents.c_str(), contents.size()); + m_file = BNCreateTemporaryFileWithContents(buf.GetBufferObject()); +} + + +TemporaryFile::TemporaryFile(BNTemporaryFile* file): m_file(file) +{ +} + + +TemporaryFile::~TemporaryFile() +{ + if (m_file) + BNFreeTemporaryFile(m_file); +} + + +string TemporaryFile::GetPath() const +{ + if (!m_file) + return string(); + + char* str = BNGetTemporaryFilePath(m_file); + string result = str; + BNFreeString(str); + return result; +} + + +DataBuffer TemporaryFile::GetContents() +{ + if (!m_file) + return DataBuffer(); + return DataBuffer(BNGetTemporaryFileContents(m_file)); +} |
