summaryrefslogtreecommitdiff
path: root/binaryninjacore.h
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2019-07-23 22:40:39 -0400
committerRusty Wagner <rusty@vector35.com>2020-04-17 14:20:35 -0400
commit203717232e816d42973f05f1c9fbc950914d71dc (patch)
tree71b1316a95417ea36147230faf4aa7c44556ea0a /binaryninjacore.h
parent072c5cd6eee7af9671e6c4fe583e77bc3bcbdd1d (diff)
Early HLIL testing
Diffstat (limited to 'binaryninjacore.h')
-rw-r--r--binaryninjacore.h179
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);