binlex
cil.h
1 #ifndef CIL_H
2 #define CIL_H
3 
4 #include <iostream>
5 #include <fstream>
6 #include <stdio.h>
7 #include <string.h>
8 #include <stdlib.h>
9 #include <errno.h>
10 #include <inttypes.h>
11 #include <assert.h>
12 #include <byteswap.h>
13 #include <ctype.h>
14 #include <capstone/capstone.h>
15 #include <queue>
16 #include <vector>
17 #include <set>
18 #include <map>
19 #include "decompilerbase.h"
20 #include "json.h"
21 
22 #define INVALID_OP 0xFFFFFFFF
23 
24 // CIL Decompiler Types
25 #define CIL_DECOMPILER_TYPE_FUNCS 0
26 #define CIL_DECOMPILER_TYPE_BLCKS 1
27 #define CIL_DECOMPILER_TYPE_UNSET 2
28 #define CIL_DECOMPILER_TYPE_ALL 3
29 
30 #define CIL_DECOMPILER_MAX_SECTIONS 256
31 #define CIL_DECOMPILER_MAX_INSN 16384
32 
33 // CIL Instructions
34 #define CIL_INS_ADD 0x58
35 #define CIL_INS_ADD_OVF 0xD6
36 #define CIL_INS_ADD_OVF_UN 0xD7
37 #define CIL_INS_AND 0x5F
38 #define CIL_INS_BEQ 0x3B
39 #define CIL_INS_BEQ_S 0x2E
40 #define CIL_INS_BGE 0x3C
41 #define CIL_INS_BGE_S 0x2F
42 #define CIL_INS_BGE_UN 0x41
43 #define CIL_INS_BGE_UN_S 0x34
44 #define CIL_INS_BGT 0x3D
45 #define CIL_INS_BGT_S 0x30
46 #define CIL_INS_BGT_UN 0x42
47 #define CIL_INS_BGT_UN_S 0x35
48 #define CIL_INS_BLE 0x3E
49 #define CIL_INS_BLE_S 0x31
50 #define CIL_INS_BLE_UN 0x43
51 #define CIL_INS_BLE_UN_S 0x36
52 #define CIL_INS_BLT 0x3F
53 #define CIL_INS_BLT_S 0x32
54 #define CIL_INS_BLT_UN 0x44
55 #define CIL_INS_BLT_UN_S 0x37
56 #define CIL_INS_BNE_UN 0x40
57 #define CIL_INS_BNE_UN_S 0x33
58 #define CIL_INS_BOX 0x8C
59 #define CIL_INS_BR 0x38
60 #define CIL_INS_BR_S 0x2B
61 #define CIL_INS_BREAK 0x01
62 #define CIL_INS_BRFALSE 0x39
63 #define CIL_INS_BRFALSE_S 0x2C
64 #define CIL_INS_BRINST 0x3A
65 #define CIL_INS_BRINST_S 0x2D
66 #define CIL_INS_BRNULL 0x39
67 #define CIL_INS_BRNULL_S 0x2C
68 #define CIL_INS_BRTRUE 0x3A
69 #define CIL_INS_BRTRUE_S 0x2D
70 #define CIL_INS_BRZERO 0x39
71 #define CIL_INS_BRZERO_S 0x2C
72 #define CIL_INS_CALL 0x28
73 #define CIL_INS_CALLI 0x29
74 #define CIL_INS_CALLVIRT 0x6F
75 #define CIL_INS_CASTCLASS 0x74
76 #define CIL_INS_CKINITE 0xC3
77 #define CIL_INS_CONV_I 0xD3
78 #define CIL_INS_CONV_I1 0x67
79 #define CIL_INS_CONV_I2 0x68
80 #define CIL_INS_CONV_I4 0x69
81 #define CIL_INS_CONV_I8 0x6A
82 #define CIL_INS_CONV_OVF_i 0xD4
83 #define CIL_INS_CONV_OVF_I_UN 0x8A
84 #define CIL_INS_CONV_OVF_I1 0xB3
85 #define CIL_INS_CONV_OVF_I1_UN 0x82
86 #define CIL_INS_CONV_OVF_I2 0xB5
87 #define CIL_INS_CONV_OVF_I2_UN 0x83
88 #define CIL_INS_CONV_OVF_I4 0xB7
89 #define CIL_INS_CONV_OVF_I4_UN 0x84
90 #define CIL_INS_CONV_OVF_I8 0xB9
91 #define CIL_INS_CONV_OVF_I8_UN 0x85
92 #define CIL_INS_CONV_OVF_U 0xD5
93 #define CIL_INS_CONV_OVF_U_UN 0x8B
94 #define CIL_INS_CONV_OVF_U1 0xB4
95 #define CIL_INS_CONV_OVF_U1_UN 0x86
96 #define CIL_INS_CONV_OVF_U2 0xB6
97 #define CIL_INS_CONV_OVF_U2_UN 0x87
98 #define CIL_INS_CONV_OVF_U4 0xB8
99 #define CIL_INS_CONV_OVF_U4_UN 0x88
100 #define CIL_INS_CONV_OVF_U8 0xBA
101 #define CIL_INS_CONV_OVF_U8_UN 0x89
102 #define CIL_INS_CONV_R_UN 0x76
103 #define CIL_INS_CONV_R4 0x6B
104 #define CIL_INS_CONV_R8 0x6C
105 #define CIL_INS_CONV_U 0xE0
106 #define CIL_INS_CONV_U1 0xD2
107 #define CIL_INS_CONV_U2 0xD1
108 #define CIL_INS_CONV_U4 0x6D
109 #define CIL_INS_CONV_U8 0x6E
110 #define CIL_INS_CPOBJ 0x70
111 #define CIL_INS_DIV 0x5B
112 #define CIL_INS_DIV_UN 0x5C
113 #define CIL_INS_DUP 0x25
114 #define CIL_INS_ENDFAULT 0xDC
115 #define CIL_INS_ENDFINALLY 0xDC
116 #define CIL_INS_ISINST 0x75
117 #define CIL_INS_JMP 0x27
118 #define CIL_INS_LDARG_0 0x02
119 #define CIL_INS_LDARG_1 0x03
120 #define CIL_INS_LDARG_2 0x04
121 #define CIL_INS_LDARG_3 0x05
122 #define CIL_INS_LDARG_S 0x0E
123 #define CIL_INS_LDARGA_S 0x0F
124 #define CIL_INS_LDC_I4 0x20
125 #define CIL_INS_LDC_I4_0 0x16
126 #define CIL_INS_LDC_I4_1 0x17
127 #define CIL_INS_LDC_I4_2 0x18
128 #define CIL_INS_LDC_I4_3 0x19
129 #define CIL_INS_LDC_I4_4 0x1A
130 #define CIL_INS_LDC_I4_5 0x1B
131 #define CIL_INS_LDC_I4_6 0x1C
132 #define CIL_INS_LDC_I4_7 0x1D
133 #define CIL_INS_LDC_I4_8 0x1E
134 #define CIL_INS_LDC_I4_M1 0x15
135 #define CIL_INS_LDC_I4_S 0x1F
136 #define CIL_INS_LDC_I8 0x21
137 #define CIL_INS_LDC_R4 0x22
138 #define CIL_INS_LDC_R8 0x23
139 #define CIL_INS_LDELM 0xA3
140 #define CIL_INS_LDELM_I 0x97
141 #define CIL_INS_LDELM_I1 0x90
142 #define CIL_INS_LDELM_I2 0x92
143 #define CIL_INS_LDELM_I4 0x94
144 #define CIL_INS_LDELM_I8 0x96
145 #define CIL_INS_LDELM_R4 0x98
146 #define CIL_INS_LDELM_R8 0x99
147 #define CIL_INS_LDELM_REF 0x9A
148 #define CIL_INS_LDELM_U1 0x91
149 #define CIL_INS_LDELM_U2 0x93
150 #define CIL_INS_LDELM_U4 0x95
151 #define CIL_INS_LDELM_U8 0x96
152 #define CIL_INS_LDELMA 0x8F
153 #define CIL_INS_LDFLD 0x7B
154 #define CIL_INS_LDFLDA 0x7C
155 #define CIL_INS_LDIND_I 0x4D
156 #define CIL_INS_LDIND_I1 0x46
157 #define CIL_INS_LDIND_I2 0x48
158 #define CIL_INS_LDIND_I4 0x4A
159 #define CIL_INS_LDIND_I8 0x4C
160 #define CIL_INS_LDIND_R4 0x4E
161 #define CIL_INS_LDIND_R8 0x4F
162 #define CIL_INS_LDIND_REF 0x50
163 #define CIL_INS_LDIND_U1 0x47
164 #define CIL_INS_LDIND_U2 0x49
165 #define CIL_INS_LDIND_U4 0x4B
166 #define CIL_INS_LDIND_U8 0x4C
167 #define CIL_INS_LDLEN 0x8E
168 #define CIL_INS_LDLOC_0 0x06
169 #define CIL_INS_LDLOC_1 0x07
170 #define CIL_INS_LDLOC_2 0x08
171 #define CIL_INS_LDLOC_3 0x09
172 #define CIL_INS_LDLOC_S 0x11
173 #define CIL_INS_LDLOCA_S 0x12
174 #define CIL_INS_LDNULL 0x14
175 #define CIL_INS_LDOBJ 0x71
176 #define CIL_INS_LDSFLD 0x7E
177 #define CIL_INS_LDSFLDA 0x7F
178 #define CIL_INS_LDSTR 0x72
179 #define CIL_INS_LDTOKEN 0xD0
180 #define CIL_INS_LEAVE 0xDD
181 #define CIL_INS_LEAVE_S 0xDE
182 #define CIL_INS_MKREFANY 0xC6
183 #define CIL_INS_MUL 0x5A
184 #define CIL_INS_MUL_OVF 0xD8
185 #define CIL_INS_MUL_OVF_UN 0xD9
186 #define CIL_INS_NEG 0x65
187 #define CIL_INS_NEWARR 0x8D
188 #define CIL_INS_NEWOBJ 0x73
189 #define CIL_INS_NOP 0x00
190 #define CIL_INS_NOT 0x66
191 #define CIL_INS_OR 0x60
192 #define CIL_INS_POP 0x26
193 #define CIL_INS_REFANYVAL 0xC2
194 #define CIL_INS_REM 0x5D
195 #define CIL_INS_REM_UN 0x5E
196 #define CIL_INS_RET 0x2A
197 #define CIL_INS_SHL 0x62
198 #define CIL_INS_SHR 0x63
199 #define CIL_INS_SHR_UN 0x64
200 #define CIL_INS_STARG_S 0x10
201 #define CIL_INS_STELEM 0xA4
202 #define CIL_INS_STELEM_I 0x9B
203 #define CIL_INS_STELEM_I1 0x9C
204 #define CIL_INS_STELEM_I2 0x9D
205 #define CIL_INS_STELEM_I4 0x9E
206 #define CIL_INS_STELEM_I8 0x9F
207 #define CIL_INS_STELEM_R4 0xA0
208 #define CIL_INS_STELEM_R8 0xA1
209 #define CIL_INS_STELEM_REF 0xA2
210 #define CIL_INS_STFLD 0x7D
211 #define CIL_INS_STIND_I 0xDF
212 #define CIL_INS_STIND_I1 0x52
213 #define CIL_INS_STIND_I2 0x53
214 #define CIL_INS_STIND_I4 0x54
215 #define CIL_INS_STIND_I8 0x55
216 #define CIL_INS_STIND_R4 0x56
217 #define CIL_INS_STIND_R8 0x57
218 #define CIL_INS_STIND_REF 0x51
219 #define CIL_INS_STLOC_0 0x0A
220 #define CIL_INS_STLOC_1 0x0B
221 #define CIL_INS_STLOC_2 0x0C
222 #define CIL_INS_STLOC_3 0x0D
223 #define CIL_INS_STOBJ 0x81
224 #define CIL_INS_STSFLD 0x80
225 #define CIL_INS_SUB 0x59
226 #define CIL_INS_SUB_OVF 0xDA
227 #define CIL_INS_SUB_OVF_UN 0xDB
228 #define CIL_INS_SWITCH 0x45
229 #define CIL_INS_THROW 0x7A
230 #define CIL_INS_UNBOX 0x79
231 #define CIL_INS_UNBOX_ANY 0xA5
232 #define CIL_INS_XOR 0x61
233 #define CIL_INS_STLOC_S 0x13
234 
235 // CIL Prefix Instructions
236 #define CIL_INS_PREFIX 0xFE
237 #define CIL_INS_ARGLIST 0x00
238 #define CIL_INS_CEQ 0x01
239 #define CIL_INS_CGT 0x02
240 #define CIL_INS_CGT_UN 0x03
241 #define CIL_INS_CLT 0x04
242 #define CIL_INS_CLT_UN 0x05
243 #define CIL_INS_CONSTRAINED 0x16
244 #define CIL_INS_CPBLK 0x17
245 #define CIL_INS_ENDFILTER 0x11
246 #define CIL_INS_INITBLK 0x18
247 #define CIL_INS_INITOBJ 0x15
248 #define CIL_INS_LDARG 0x09
249 #define CIL_INS_LDARGA 0x0A
250 #define CIL_INS_LDFTN 0x06
251 #define CIL_INS_LDLOC 0x0C
252 #define CIL_INS_LDLOCA 0x0D
253 #define CIL_INS_LDVIRTFTN 0x07
254 #define CIL_INS_LOCALLOC 0x0F
255 #define CIL_INS_NO 0x19
256 #define CIL_INS_READONLY 0x1E
257 #define CIL_INS_REFANYTYPE 0x1D
258 #define CIL_INS_RETHROW 0x1A
259 #define CIL_INS_SIZEOF 0x1C
260 #define CIL_INS_STARG 0x0B
261 #define CIL_INS_STLOC 0x0E
262 #define CIL_INS_TAIL 0x14
263 #define CIL_INS_UNALIGNED 0x12
264 #define CIL_INS_VOLATILE 0x13
265 
266 using namespace std;
267 
268 namespace binlex {
269  class CILDecompiler : public DecompilerBase {
270  private:
271  int type = CIL_DECOMPILER_TYPE_UNSET;
272  char * hexdump_traits(char *buffer0, const void *data, int size, int operand_size);
273  char * traits_nl(char *traits);
274  int update_offset(int operand_size, int i);
275  typedef struct worker {
276  csh handle;
277  cs_err error;
278  uint64_t pc;
279  const uint8_t *code;
280  size_t code_size;
281  } worker;
282  typedef struct{
283  uint index;
284  void *sections;
285  } worker_args;
286  public:
287  CILDecompiler(const binlex::File &firef);
288  struct Instruction {
289  unsigned char instruction;
290  uint operand_size;
291  uint offset;
292  };
293  struct Trait {
294  string corpus;
295  string type;
296  string architecture;
297  string tmp_bytes;
298  string bytes;
299  string trait;
300  uint edges;
301  uint blocks;
302  vector< Instruction* >* instructions;
303  uint num_instructions;
304  uint size;
305  uint offset;
306  uint invalid_instructions;
307  uint cyclomatic_complexity;
308  uint average_instructions_per_block;
309  float bytes_entropy;
310  float trait_entropy;
311  string trait_sha256;
312  string bytes_sha256;
313  };
314  struct Section {
315  vector <Trait*> function_traits;
316  vector <Trait*> block_traits;
317  char *trait;
318  cs_arch arch;
319  cs_mode mode;
320  char *arch_str;
321  char *cpu;
322  string corpus;
323  uint threads;
324  bool instructions;
325  uint thread_cycles;
326  useconds_t thread_sleep;
327  uint offset;
328  uint ntraits;
329  struct Trait **traits;
330  void *data;
331  size_t data_size;
332  set<uint64_t> coverage;
333  map<uint64_t, uint> addresses;
334  map<uint64_t, int> visited;
335  queue<uint64_t> discovered;
336  };
337  struct Section sections[CIL_DECOMPILER_MAX_SECTIONS];
338  //Map containing prefix instructions and their operand sizes
339  map<int, int> prefixInstrMap;
340  //Map containing conditional instructions and their operand sizes
341  map<int, int> condInstrMap;
342  //Map for all remaining instruction types that don't need special
343  //treatment
344  map<int, int> miscInstrMap;
345  bool Setup(int input_type);
346  bool Decompile(void *data, int data_size, int index);
351  vector<json> GetTraits();
352  json GetTrait(struct Trait *trait);
357  string ConvTraitBytes(vector< Instruction* > instructions);
363  string ConvBytes(vector< Instruction* > allinst, void *data, int data_size);
368  bool IsConditionalInsn(Instruction *insn);
373  bool IsPrefixInstr(Instruction *insn);
378  uint SizeOfTrait(vector< Instruction* > allinst);
379  ~CILDecompiler();
380  };
381 };
382 
383 #endif
binlex::CILDecompiler
Definition: cil.h:269
binlex::DecompilerBase
Definition: decompilerbase.h:12
binlex::CILDecompiler::Instruction
Definition: cil.h:288
binlex::CILDecompiler::Section
Definition: cil.h:314
binlex::CILDecompiler::Trait
Definition: cil.h:293
binlex::File
Definition: file.h:14
binlex
the binlex namespace