summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--architecture.cpp68
-rw-r--r--binaryninjaapi.h11
-rw-r--r--lowlevelil.cpp57
3 files changed, 136 insertions, 0 deletions
diff --git a/architecture.cpp b/architecture.cpp
index e4d3e4f0..14e5b780 100644
--- a/architecture.cpp
+++ b/architecture.cpp
@@ -180,6 +180,32 @@ uint32_t* Architecture::GetAllRegistersCallback(void* ctxt, size_t* count)
}
+uint32_t* Architecture::GetAllFlagsCallback(void* ctxt, size_t* count)
+{
+ Architecture* arch = (Architecture*)ctxt;
+ vector<uint32_t> regs = arch->GetAllFlags();
+ *count = regs.size();
+
+ uint32_t* result = new uint32_t[regs.size()];
+ for (size_t i = 0; i < regs.size(); i++)
+ result[i] = regs[i];
+ return result;
+}
+
+
+uint32_t* Architecture::GetAllFlagWriteTypesCallback(void* ctxt, size_t* count)
+{
+ Architecture* arch = (Architecture*)ctxt;
+ vector<uint32_t> regs = arch->GetAllFlagWriteTypes();
+ *count = regs.size();
+
+ uint32_t* result = new uint32_t[regs.size()];
+ for (size_t i = 0; i < regs.size(); i++)
+ result[i] = regs[i];
+ return result;
+}
+
+
void Architecture::FreeRegisterListCallback(void*, uint32_t* regs)
{
delete[] regs;
@@ -293,6 +319,8 @@ void Architecture::Register(Architecture* arch)
callbacks.getFlagWriteTypeName = GetFlagWriteTypeNameCallback;
callbacks.getFullWidthRegisters = GetFullWidthRegistersCallback;
callbacks.getAllRegisters = GetAllRegistersCallback;
+ callbacks.getAllFlags = GetAllFlagsCallback;
+ callbacks.getAllFlagWriteTypes = GetAllFlagWriteTypesCallback;
callbacks.freeRegisterList = FreeRegisterListCallback;
callbacks.getRegisterInfo = GetRegisterInfoCallback;
callbacks.getStackPointerRegister = GetStackPointerRegisterCallback;
@@ -394,6 +422,18 @@ vector<uint32_t> Architecture::GetAllRegisters()
}
+vector<uint32_t> Architecture::GetAllFlags()
+{
+ return vector<uint32_t>();
+}
+
+
+vector<uint32_t> Architecture::GetAllFlagWriteTypes()
+{
+ return vector<uint32_t>();
+}
+
+
BNRegisterInfo Architecture::GetRegisterInfo(uint32_t)
{
BNRegisterInfo result;
@@ -621,6 +661,34 @@ vector<uint32_t> CoreArchitecture::GetAllRegisters()
}
+vector<uint32_t> CoreArchitecture::GetAllFlags()
+{
+ size_t count;
+ uint32_t* regs = BNGetAllArchitectureFlags(m_arch, &count);
+
+ vector<uint32_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(regs[i]);
+
+ BNFreeRegisterList(regs);
+ return result;
+}
+
+
+vector<uint32_t> CoreArchitecture::GetAllFlagWriteTypes()
+{
+ size_t count;
+ uint32_t* regs = BNGetAllArchitectureFlagWriteTypes(m_arch, &count);
+
+ vector<uint32_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(regs[i]);
+
+ BNFreeRegisterList(regs);
+ return result;
+}
+
+
BNRegisterInfo CoreArchitecture::GetRegisterInfo(uint32_t reg)
{
return BNGetArchitectureRegisterInfo(m_arch, reg);
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 5ede4758..abf4cf2a 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -860,6 +860,8 @@ namespace BinaryNinja
static char* GetFlagWriteTypeNameCallback(void* ctxt, uint32_t flags);
static uint32_t* GetFullWidthRegistersCallback(void* ctxt, size_t* count);
static uint32_t* GetAllRegistersCallback(void* ctxt, size_t* count);
+ static uint32_t* GetAllFlagsCallback(void* ctxt, size_t* count);
+ static uint32_t* GetAllFlagWriteTypesCallback(void* ctxt, size_t* count);
static void FreeRegisterListCallback(void* ctxt, uint32_t* regs);
static void GetRegisterInfoCallback(void* ctxt, uint32_t reg, BNRegisterInfo* result);
static uint32_t GetStackPointerRegisterCallback(void* ctxt);
@@ -902,6 +904,8 @@ namespace BinaryNinja
virtual std::string GetFlagWriteTypeName(uint32_t flags);
virtual std::vector<uint32_t> GetFullWidthRegisters();
virtual std::vector<uint32_t> GetAllRegisters();
+ virtual std::vector<uint32_t> GetAllFlags();
+ virtual std::vector<uint32_t> GetAllFlagWriteTypes();
virtual BNRegisterInfo GetRegisterInfo(uint32_t reg);
virtual uint32_t GetStackPointerRegister();
std::vector<uint32_t> GetModifiedRegistersOnWrite(uint32_t reg);
@@ -944,6 +948,8 @@ namespace BinaryNinja
virtual std::string GetFlagWriteTypeName(uint32_t flags) override;
virtual std::vector<uint32_t> GetFullWidthRegisters() override;
virtual std::vector<uint32_t> GetAllRegisters() override;
+ virtual std::vector<uint32_t> GetAllFlags() override;
+ virtual std::vector<uint32_t> GetAllFlagWriteTypes() override;
virtual BNRegisterInfo GetRegisterInfo(uint32_t reg) override;
virtual uint32_t GetStackPointerRegister() override;
@@ -1246,6 +1252,7 @@ namespace BinaryNinja
ExprId Register(size_t size, uint32_t reg);
ExprId Const(size_t size, uint64_t val);
ExprId Flag(uint32_t reg);
+ ExprId FlagBit(size_t size, uint32_t flag, uint32_t bitIndex);
ExprId Add(size_t size, ExprId a, ExprId b, uint32_t flags = 0);
ExprId AddCarry(size_t size, ExprId a, ExprId b, uint32_t flags = 0);
ExprId Sub(size_t size, ExprId a, ExprId b, uint32_t flags = 0);
@@ -1290,6 +1297,7 @@ namespace BinaryNinja
ExprId CompareUnsignedGreaterEqual(size_t size, ExprId a, ExprId b);
ExprId CompareSignedGreaterThan(size_t size, ExprId a, ExprId b);
ExprId CompareUnsignedGreaterThan(size_t size, ExprId a, ExprId b);
+ ExprId TestBit(size_t size, ExprId a, ExprId b);
ExprId SystemCall();
ExprId Breakpoint();
ExprId Trap(uint32_t num);
@@ -1309,6 +1317,9 @@ namespace BinaryNinja
BNLowLevelILLabel* GetLabelForAddress(Architecture* arch, ExprId addr);
void Finalize();
+
+ bool GetExprText(Architecture* arch, ExprId expr, std::vector<InstructionTextToken>& tokens);
+ bool GetInstructionText(Architecture* arch, size_t i, std::vector<InstructionTextToken>& tokens);
};
class FunctionRecognizer
diff --git a/lowlevelil.cpp b/lowlevelil.cpp
index e4c65b3a..7c30df9d 100644
--- a/lowlevelil.cpp
+++ b/lowlevelil.cpp
@@ -1,6 +1,7 @@
#include "binaryninjaapi.h"
using namespace BinaryNinja;
+using namespace std;
LowLevelILLabel::LowLevelILLabel()
@@ -117,6 +118,12 @@ ExprId LowLevelILFunction::Flag(uint32_t reg)
}
+ExprId LowLevelILFunction::FlagBit(size_t size, uint32_t flag, uint32_t bitIndex)
+{
+ return AddExpr(LLIL_FLAG_BIT, size, 0, flag, bitIndex);
+}
+
+
ExprId LowLevelILFunction::Add(size_t size, ExprId a, ExprId b, uint32_t flags)
{
return AddExpr(LLIL_ADD, size, flags, a, b);
@@ -381,6 +388,12 @@ ExprId LowLevelILFunction::CompareUnsignedGreaterThan(size_t size, ExprId a, Exp
}
+ExprId LowLevelILFunction::TestBit(size_t size, ExprId a, ExprId b)
+{
+ return AddExpr(LLIL_TEST_BIT, size, 0, a, b);
+}
+
+
ExprId LowLevelILFunction::SystemCall()
{
return AddExpr(LLIL_SYSCALL, 0, 0);
@@ -469,3 +482,47 @@ void LowLevelILFunction::Finalize()
{
BNFinalizeLowLevelILFunction(m_func);
}
+
+
+bool LowLevelILFunction::GetExprText(Architecture* arch, ExprId expr, vector<InstructionTextToken>& tokens)
+{
+ size_t count;
+ BNInstructionTextToken* list;
+ if (!BNGetLowLevelILExprText(m_func, arch->GetArchitectureObject(), expr, &list, &count))
+ return false;
+
+ tokens.clear();
+ for (size_t i = 0; i < count; i++)
+ {
+ InstructionTextToken token;
+ token.type = list[i].type;
+ token.text = list[i].text;
+ token.value = list[i].value;
+ tokens.push_back(token);
+ }
+
+ BNFreeInstructionText(list, count);
+ return true;
+}
+
+
+bool LowLevelILFunction::GetInstructionText(Architecture* arch, size_t instr, vector<InstructionTextToken>& tokens)
+{
+ size_t count;
+ BNInstructionTextToken* list;
+ if (!BNGetLowLevelILInstructionText(m_func, arch->GetArchitectureObject(), instr, &list, &count))
+ return false;
+
+ tokens.clear();
+ for (size_t i = 0; i < count; i++)
+ {
+ InstructionTextToken token;
+ token.type = list[i].type;
+ token.text = list[i].text;
+ token.value = list[i].value;
+ tokens.push_back(token);
+ }
+
+ BNFreeInstructionText(list, count);
+ return true;
+}