diff options
| -rw-r--r-- | architecture.cpp | 68 | ||||
| -rw-r--r-- | binaryninjaapi.h | 11 | ||||
| -rw-r--r-- | lowlevelil.cpp | 57 |
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; +} |
