summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <dontpanic@binaryninja.com>2015-03-21 03:51:23 -0400
committerRusty Wagner <dontpanic@binaryninja.com>2015-03-21 03:51:23 -0400
commitc85cae0d74c2c32b23f5e1422f230bebd61f1b1e (patch)
treedb86059ab0816bc57c469fa72d144768711f9077
parente044ab55ef7204237507465074b54a113c8aae4d (diff)
Add assemble dialog and use nasm for x86/x86_64
-rw-r--r--api.pro3
-rw-r--r--architecture.cpp27
-rw-r--r--binaryninjaapi.h23
-rw-r--r--databuffer.cpp6
-rw-r--r--filemetadata.cpp2
-rw-r--r--tempfile.cpp55
6 files changed, 113 insertions, 3 deletions
diff --git a/api.pro b/api.pro
index 5026d9c3..3cf7dfa7 100644
--- a/api.pro
+++ b/api.pro
@@ -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));
+}