diff options
Diffstat (limited to 'function.cpp')
| -rw-r--r-- | function.cpp | 144 |
1 files changed, 130 insertions, 14 deletions
diff --git a/function.cpp b/function.cpp index 12f99d1f..b8429998 100644 --- a/function.cpp +++ b/function.cpp @@ -124,20 +124,6 @@ Ref<LowLevelILFunction> Function::GetLowLevelIL() const } -vector<Ref<BasicBlock>> Function::GetLowLevelILBasicBlocks() const -{ - size_t count; - BNBasicBlock** blocks = BNGetFunctionLowLevelILBasicBlockList(m_object, &count); - - vector<Ref<BasicBlock>> result; - for (size_t i = 0; i < count; i++) - result.push_back(new BasicBlock(BNNewBasicBlockReference(blocks[i]))); - - BNFreeBasicBlockList(blocks, count); - return result; -} - - size_t Function::GetLowLevelILForInstruction(Architecture* arch, uint64_t addr) { return BNGetLowLevelILForInstruction(m_object, arch->GetObject(), addr); @@ -229,6 +215,66 @@ vector<StackVariableReference> Function::GetStackVariablesReferencedByInstructio } +Ref<LowLevelILFunction> Function::GetLiftedIL() const +{ + return new LowLevelILFunction(BNGetFunctionLiftedIL(m_object)); +} + + +size_t Function::GetLiftedILForInstruction(Architecture* arch, uint64_t addr) +{ + return BNGetLiftedILForInstruction(m_object, arch->GetObject(), addr); +} + + +set<size_t> Function::GetLiftedILFlagUsesForDefinition(size_t i, uint32_t flag) +{ + size_t count; + size_t* instrs = BNGetLiftedILFlagUsesForDefinition(m_object, i, flag, &count); + + set<size_t> result; + result.insert(&instrs[0], &instrs[count]); + BNFreeLowLevelILInstructionList(instrs); + return result; +} + + +set<size_t> Function::GetLiftedILFlagDefinitionsForUse(size_t i, uint32_t flag) +{ + size_t count; + size_t* instrs = BNGetLiftedILFlagDefinitionsForUse(m_object, i, flag, &count); + + set<size_t> result; + result.insert(&instrs[0], &instrs[count]); + BNFreeLowLevelILInstructionList(instrs); + return result; +} + + +set<uint32_t> Function::GetFlagsReadByLiftedILInstruction(size_t i) +{ + size_t count; + uint32_t* flags = BNGetFlagsReadByLiftedILInstruction(m_object, i, &count); + + set<uint32_t> result; + result.insert(&flags[0], &flags[count]); + BNFreeRegisterList(flags); + return result; +} + + +set<uint32_t> Function::GetFlagsWrittenByLiftedILInstruction(size_t i) +{ + size_t count; + uint32_t* flags = BNGetFlagsWrittenByLiftedILInstruction(m_object, i, &count); + + set<uint32_t> result; + result.insert(&flags[0], &flags[count]); + BNFreeRegisterList(flags); + return result; +} + + Ref<Type> Function::GetType() const { return new Type(BNGetFunctionType(m_object)); @@ -313,3 +359,73 @@ bool Function::GetStackVariableAtFrameOffset(int64_t offset, StackVariable& resu BNFreeStackVariable(&var); return true; } + + +void Function::SetAutoIndirectBranches(Architecture* sourceArch, uint64_t source, const std::vector<ArchAndAddr>& branches) +{ + BNArchitectureAndAddress* branchList = new BNArchitectureAndAddress[branches.size()]; + for (size_t i = 0; i < branches.size(); i++) + { + branchList[i].arch = branches[i].arch->GetObject(); + branchList[i].address = branches[i].address; + } + BNSetAutoIndirectBranches(m_object, sourceArch->GetObject(), source, branchList, branches.size()); + delete[] branchList; +} + + +void Function::SetUserIndirectBranches(Architecture* sourceArch, uint64_t source, const std::vector<ArchAndAddr>& branches) +{ + BNArchitectureAndAddress* branchList = new BNArchitectureAndAddress[branches.size()]; + for (size_t i = 0; i < branches.size(); i++) + { + branchList[i].arch = branches[i].arch->GetObject(); + branchList[i].address = branches[i].address; + } + BNSetUserIndirectBranches(m_object, sourceArch->GetObject(), source, branchList, branches.size()); + delete[] branchList; +} + + +vector<IndirectBranchInfo> Function::GetIndirectBranches() +{ + size_t count; + BNIndirectBranchInfo* branches = BNGetIndirectBranches(m_object, &count); + + vector<IndirectBranchInfo> result; + for (size_t i = 0; i < count; i++) + { + IndirectBranchInfo b; + b.sourceArch = new CoreArchitecture(branches[i].sourceArch); + b.sourceAddr = branches[i].sourceAddr; + b.destArch = new CoreArchitecture(branches[i].destArch); + b.destAddr = branches[i].destAddr; + b.autoDefined = branches[i].autoDefined; + result.push_back(b); + } + + BNFreeIndirectBranchList(branches); + return result; +} + + +vector<IndirectBranchInfo> Function::GetIndirectBranchesAt(Architecture* arch, uint64_t addr) +{ + size_t count; + BNIndirectBranchInfo* branches = BNGetIndirectBranchesAt(m_object, arch->GetObject(), addr, &count); + + vector<IndirectBranchInfo> result; + for (size_t i = 0; i < count; i++) + { + IndirectBranchInfo b; + b.sourceArch = new CoreArchitecture(branches[i].sourceArch); + b.sourceAddr = branches[i].sourceAddr; + b.destArch = new CoreArchitecture(branches[i].destArch); + b.destAddr = branches[i].destAddr; + b.autoDefined = branches[i].autoDefined; + result.push_back(b); + } + + BNFreeIndirectBranchList(branches); + return result; +} |
