diff options
| author | Rusty Wagner <rusty@vector35.com> | 2019-07-23 22:40:39 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2020-04-17 14:20:35 -0400 |
| commit | 203717232e816d42973f05f1c9fbc950914d71dc (patch) | |
| tree | 71b1316a95417ea36147230faf4aa7c44556ea0a /binaryninjacore.h | |
| parent | 072c5cd6eee7af9671e6c4fe583e77bc3bcbdd1d (diff) | |
Early HLIL testing
Diffstat (limited to 'binaryninjacore.h')
| -rw-r--r-- | binaryninjacore.h | 179 |
1 files changed, 178 insertions, 1 deletions
diff --git a/binaryninjacore.h b/binaryninjacore.h index 941540f0..5487baab 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -133,6 +133,7 @@ extern "C" struct BNTemporaryFile; struct BNLowLevelILFunction; struct BNMediumLevelILFunction; + struct BNHighLevelILFunction; struct BNType; struct BNTypeBuilder; struct BNTypeLibrary; @@ -515,7 +516,8 @@ extern "C" MediumLevelILFunctionGraph = 4, MediumLevelILSSAFormFunctionGraph = 5, MappedMediumLevelILFunctionGraph = 6, - MappedMediumLevelILSSAFormFunctionGraph = 7 + MappedMediumLevelILSSAFormFunctionGraph = 7, + HighLevelILFunctionGraph = 8 }; enum BNDisassemblyOption @@ -531,6 +533,7 @@ extern "C" // Linear disassembly options GroupLinearDisassemblyFunctions = 64, + HighLevelILLinearDisassembly = 65, // Debugging options ShowFlagUsage = 128 @@ -1043,6 +1046,130 @@ extern "C" int64_t storage; }; + enum BNHighLevelILOperation + { + HLIL_NOP, + + HLIL_BLOCK, + HLIL_IF, + HLIL_WHILE, + HLIL_DO_WHILE, + HLIL_FOR, + HLIL_SWITCH, + HLIL_CASE, + HLIL_BREAK, + HLIL_JUMP, + HLIL_RET, + HLIL_NORET, + HLIL_GOTO, + HLIL_LABEL, + + HLIL_ASSIGN, + HLIL_ASSIGN_UNPACK, + HLIL_VAR, + HLIL_STRUCT_FIELD, + HLIL_ARRAY_INDEX, + HLIL_SPLIT, + HLIL_DEREF, + HLIL_DEREF_FIELD, + HLIL_ADDRESS_OF, + HLIL_CONST, + HLIL_CONST_PTR, + HLIL_EXTERN_PTR, + HLIL_FLOAT_CONST, + HLIL_IMPORT, + HLIL_ADD, + HLIL_ADC, + HLIL_SUB, + HLIL_SBB, + HLIL_AND, + HLIL_OR, + HLIL_XOR, + HLIL_LSL, + HLIL_LSR, + HLIL_ASR, + HLIL_ROL, + HLIL_RLC, + HLIL_ROR, + HLIL_RRC, + HLIL_MUL, + HLIL_MULU_DP, + HLIL_MULS_DP, + HLIL_DIVU, + HLIL_DIVU_DP, + HLIL_DIVS, + HLIL_DIVS_DP, + HLIL_MODU, + HLIL_MODU_DP, + HLIL_MODS, + HLIL_MODS_DP, + HLIL_NEG, + HLIL_NOT, + HLIL_SX, + HLIL_ZX, + HLIL_LOW_PART, + HLIL_CALL, + HLIL_CMP_E, + HLIL_CMP_NE, + HLIL_CMP_SLT, + HLIL_CMP_ULT, + HLIL_CMP_SLE, + HLIL_CMP_ULE, + HLIL_CMP_SGE, + HLIL_CMP_UGE, + HLIL_CMP_SGT, + HLIL_CMP_UGT, + HLIL_TEST_BIT, + HLIL_BOOL_TO_INT, + HLIL_ADD_OVERFLOW, + HLIL_SYSCALL, + HLIL_TAILCALL, + HLIL_INTRINSIC, + HLIL_BP, + HLIL_TRAP, + HLIL_UNDEF, + HLIL_UNIMPL, + HLIL_UNIMPL_MEM, + + // Floating point + HLIL_FADD, + HLIL_FSUB, + HLIL_FMUL, + HLIL_FDIV, + HLIL_FSQRT, + HLIL_FNEG, + HLIL_FABS, + HLIL_FLOAT_TO_INT, + HLIL_INT_TO_FLOAT, + HLIL_FLOAT_CONV, + HLIL_ROUND_TO_INT, + HLIL_FLOOR, + HLIL_CEIL, + HLIL_FTRUNC, + HLIL_FCMP_E, + HLIL_FCMP_NE, + HLIL_FCMP_LT, + HLIL_FCMP_LE, + HLIL_FCMP_GE, + HLIL_FCMP_GT, + HLIL_FCMP_O, + HLIL_FCMP_UO, + + // The following instructions are only used in SSA form + HLIL_VAR_SSA, + HLIL_VAR_PHI + }; + + struct BNHighLevelILInstruction + { + BNHighLevelILOperation operation; + uint32_t sourceOperand; + size_t size; + uint64_t operands[5]; + uint64_t address; + size_t parent; + }; + // Callbacks struct BNLogListener { @@ -2698,6 +2825,8 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI void BNFreeILInstructionList(size_t* list); BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetFunctionMediumLevelIL(BNFunction* func); BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetFunctionMediumLevelILIfAvailable(BNFunction* func); + BINARYNINJACOREAPI BNHighLevelILFunction* BNGetFunctionHighLevelIL(BNFunction* func); + BINARYNINJACOREAPI BNHighLevelILFunction* BNGetFunctionHighLevelILIfAvailable(BNFunction* func); BINARYNINJACOREAPI BNRegisterValue BNGetRegisterValueAtInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr, uint32_t reg); BINARYNINJACOREAPI BNRegisterValue BNGetRegisterValueAfterInstruction(BNFunction* func, BNArchitecture* arch, @@ -2811,11 +2940,14 @@ __attribute__ ((format (printf, 1, 2))) BNDisassemblySettings* settings); BINARYNINJACOREAPI BNDisassemblyTextRenderer* BNCreateMediumLevelILDisassemblyTextRenderer(BNMediumLevelILFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNDisassemblyTextRenderer* BNCreateHighLevelILDisassemblyTextRenderer(BNHighLevelILFunction* func, + BNDisassemblySettings* settings); BINARYNINJACOREAPI BNDisassemblyTextRenderer* BNNewDisassemblyTextRendererReference(BNDisassemblyTextRenderer* renderer); BINARYNINJACOREAPI void BNFreeDisassemblyTextRenderer(BNDisassemblyTextRenderer* renderer); BINARYNINJACOREAPI BNFunction* BNGetDisassemblyTextRendererFunction(BNDisassemblyTextRenderer* renderer); BINARYNINJACOREAPI BNLowLevelILFunction* BNGetDisassemblyTextRendererLowLevelILFunction(BNDisassemblyTextRenderer* renderer); BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetDisassemblyTextRendererMediumLevelILFunction(BNDisassemblyTextRenderer* renderer); + BINARYNINJACOREAPI BNHighLevelILFunction* BNGetDisassemblyTextRendererHighLevelILFunction(BNDisassemblyTextRenderer* renderer); BINARYNINJACOREAPI BNBasicBlock* BNGetDisassemblyTextRendererBasicBlock(BNDisassemblyTextRenderer* renderer); BINARYNINJACOREAPI BNArchitecture* BNGetDisassemblyTextRendererArchitecture(BNDisassemblyTextRenderer* renderer); BINARYNINJACOREAPI BNDisassemblySettings* BNGetDisassemblyTextRendererSettings(BNDisassemblyTextRenderer* renderer); @@ -2990,6 +3122,8 @@ __attribute__ ((format (printf, 1, 2))) BNDisassemblySettings* settings); BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewMappedMediumLevelILSSAForm(BNBinaryView* view, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewHighLevelIL(BNBinaryView* view, + BNDisassemblySettings* settings); BINARYNINJACOREAPI BNLinearViewObject* BNNewLinearViewObjectReference(BNLinearViewObject* obj); BINARYNINJACOREAPI void BNFreeLinearViewObject(BNLinearViewObject* obj); BINARYNINJACOREAPI BNLinearViewObject* BNGetFirstLinearViewObjectChild(BNLinearViewObject* obj); @@ -3200,6 +3334,8 @@ __attribute__ ((format (printf, 1, 2))) BNDisassemblySettings* settings); BINARYNINJACOREAPI BNFlowGraph* BNCreateMediumLevelILFunctionGraph(BNMediumLevelILFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNFlowGraph* BNCreateHighLevelILFunctionGraph(BNHighLevelILFunction* func, + BNDisassemblySettings* settings); BINARYNINJACOREAPI BNFlowGraph* BNCreateCustomFlowGraph(BNCustomFlowGraph* callbacks); BINARYNINJACOREAPI BNFlowGraph* BNNewFlowGraphReference(BNFlowGraph* graph); BINARYNINJACOREAPI void BNFreeFlowGraph(BNFlowGraph* graph); @@ -3222,10 +3358,13 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI bool BNIsILFlowGraph(BNFlowGraph* graph); BINARYNINJACOREAPI bool BNIsLowLevelILFlowGraph(BNFlowGraph* graph); BINARYNINJACOREAPI bool BNIsMediumLevelILFlowGraph(BNFlowGraph* graph); + BINARYNINJACOREAPI bool BNIsHighLevelILFlowGraph(BNFlowGraph* graph); BINARYNINJACOREAPI BNLowLevelILFunction* BNGetFlowGraphLowLevelILFunction(BNFlowGraph* graph); BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetFlowGraphMediumLevelILFunction(BNFlowGraph* graph); + BINARYNINJACOREAPI BNHighLevelILFunction* BNGetFlowGraphHighLevelILFunction(BNFlowGraph* graph); BINARYNINJACOREAPI void BNSetFlowGraphLowLevelILFunction(BNFlowGraph* graph, BNLowLevelILFunction* func); BINARYNINJACOREAPI void BNSetFlowGraphMediumLevelILFunction(BNFlowGraph* graph, BNMediumLevelILFunction* func); + BINARYNINJACOREAPI void BNSetFlowGraphHighLevelILFunction(BNFlowGraph* graph, BNHighLevelILFunction* func); BINARYNINJACOREAPI BNFlowGraphNode** BNGetFlowGraphNodes(BNFlowGraph* graph, size_t* count); BINARYNINJACOREAPI BNFlowGraphNode* BNGetFlowGraphNode(BNFlowGraph* graph, size_t i); @@ -3567,12 +3706,50 @@ __attribute__ ((format (printf, 1, 2))) BNMediumLevelILFunction* func, size_t instr, size_t* count); BINARYNINJACOREAPI void BNFreeILBranchDependenceList(BNILBranchInstructionAndDependence* branches); + BINARYNINJACOREAPI BNBasicBlock** BNGetHighLevelILBasicBlockList(BNHighLevelILFunction* func, size_t* count); + BINARYNINJACOREAPI BNBasicBlock* BNGetHighLevelILBasicBlockForInstruction(BNHighLevelILFunction* func, size_t i); + BINARYNINJACOREAPI BNLowLevelILFunction* BNGetLowLevelILForMediumLevelIL(BNMediumLevelILFunction* func); BINARYNINJACOREAPI size_t BNGetLowLevelILInstructionIndex(BNMediumLevelILFunction* func, size_t instr); BINARYNINJACOREAPI size_t BNGetLowLevelILExprIndex(BNMediumLevelILFunction* func, size_t expr); BINARYNINJACOREAPI BNTypeWithConfidence BNGetMediumLevelILExprType(BNMediumLevelILFunction* func, size_t expr); + // High-level IL + BINARYNINJACOREAPI BNHighLevelILFunction* BNCreateHighLevelILFunction(BNArchitecture* arch, BNFunction* func); + BINARYNINJACOREAPI BNHighLevelILFunction* BNNewHighLevelILFunctionReference(BNHighLevelILFunction* func); + BINARYNINJACOREAPI void BNFreeHighLevelILFunction(BNHighLevelILFunction* func); + + BINARYNINJACOREAPI BNFunction* BNGetHighLevelILOwnerFunction(BNHighLevelILFunction* func); + BINARYNINJACOREAPI uint64_t BNHighLevelILGetCurrentAddress(BNHighLevelILFunction* func); + BINARYNINJACOREAPI void BNHighLevelILSetCurrentAddress(BNHighLevelILFunction* func, BNArchitecture* arch, uint64_t addr); + BINARYNINJACOREAPI size_t BNHighLevelILAddExpr(BNHighLevelILFunction* func, BNHighLevelILOperation operation, size_t size, + uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e); + BINARYNINJACOREAPI size_t BNHighLevelILAddExprWithLocation(BNHighLevelILFunction* func, BNHighLevelILOperation operation, + uint64_t addr, uint32_t sourceOperand, size_t size, uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e); + BINARYNINJACOREAPI size_t BNGetHighLevelILRootExpr(BNHighLevelILFunction* func); + BINARYNINJACOREAPI void BNSetHighLevelILRootExpr(BNHighLevelILFunction* func, size_t expr); + BINARYNINJACOREAPI void BNFinalizeHighLevelILFunction(BNHighLevelILFunction* func); + + BINARYNINJACOREAPI size_t BNHighLevelILAddOperandList(BNHighLevelILFunction* func, uint64_t* operands, size_t count); + BINARYNINJACOREAPI uint64_t* BNHighLevelILGetOperandList(BNHighLevelILFunction* func, size_t expr, size_t operand, size_t* count); + BINARYNINJACOREAPI void BNHighLevelILFreeOperandList(uint64_t* operands); + + BINARYNINJACOREAPI BNHighLevelILInstruction BNGetHighLevelILByIndex(BNHighLevelILFunction* func, size_t i); + BINARYNINJACOREAPI size_t BNGetHighLevelILIndexForInstruction(BNHighLevelILFunction* func, size_t i); + BINARYNINJACOREAPI size_t BNGetHighLevelILInstructionForExpr(BNHighLevelILFunction* func, size_t expr); + BINARYNINJACOREAPI size_t BNGetHighLevelILInstructionCount(BNHighLevelILFunction* func); + BINARYNINJACOREAPI size_t BNGetHighLevelILExprCount(BNHighLevelILFunction* func); + + BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetMediumLevelILForHighLevelILFunction(BNHighLevelILFunction* func); + BINARYNINJACOREAPI size_t BNGetMediumLevelILExprIndexFromHighLevelIL(BNHighLevelILFunction* func, size_t expr); + + BINARYNINJACOREAPI void BNUpdateHighLevelILOperand(BNHighLevelILFunction* func, size_t instr, size_t operandIndex, uint64_t value); + BINARYNINJACOREAPI void BNReplaceHighLevelILExpr(BNHighLevelILFunction* func, size_t expr, size_t newExpr); + + BINARYNINJACOREAPI BNDisassemblyTextLine* BNGetHighLevelILExprText(BNHighLevelILFunction* func, size_t expr, + bool asFullAst, size_t* count); + // Type Libraries BINARYNINJACOREAPI BNTypeLibrary* BNNewTypeLibrary(BNArchitecture* arch, const char* name); BINARYNINJACOREAPI BNTypeLibrary* BNNewTypeLibraryReference(BNTypeLibrary* lib); |
