1 /* radare - Apache 2.0 - Copyright 2013 - Adam Pridgen <dso@rice.edu || adam.pridgen@thecoverofnight.com> */ 2 #include <r_anal.h> 3 4 #ifndef R2_JAVA_OPS_H 5 #define R2_JAVA_OPS_H 6 7 enum { 8 R_ANAL_JAVA_ILL_OP =-1, /* illegal instruction // trap */ 9 R_ANAL_JAVA_NULL_OP = 0, 10 R_ANAL_JAVA_NOP = 1, /* does nothing */ 11 R_ANAL_JAVA_STORE_OP = 1 << 20, // Load or Store memory operation 12 R_ANAL_JAVA_LOAD_OP = 1 << 21, // Load or Store memory operation 13 R_ANAL_JAVA_REG_OP = 1 << 22, // register operation 14 R_ANAL_JAVA_OBJ_OP = 1 << 23, // operates on an object 15 R_ANAL_JAVA_STACK_OP = 1 << 25, // stack based operation 16 R_ANAL_JAVA_BIN_OP = 1 << 26, // binary operation 17 R_ANAL_JAVA_CODE_OP = 1 << 27, // operates on code 18 R_ANAL_JAVA_DATA_OP = 1 << 28, // operates on data 19 R_ANAL_JAVA_UNK_OP = 1 << 29, /* unknown opcode type */ 20 R_ANAL_JAVA_REP_OP = 1 << 30, /* repeats next instruction N times */ 21 R_ANAL_JAVA_COND_OP = 1 << 31, 22 }; 23 24 enum { 25 R_ANAL_JAVA_TYPE_REF_NULL = 0, 26 R_ANAL_JAVA_TYPE_REF_UNK = 1 << 1, 27 R_ANAL_JAVA_TYPE_REF = 1 << 2, 28 R_ANAL_JAVA_TYPE_SIGNED = 1 << 3, 29 R_ANAL_JAVA_TYPE_PRIM = 1 << 4, 30 R_ANAL_JAVA_TYPE_CONST = 1 << 5, 31 R_ANAL_JAVA_TYPE_STATIC = 1 << 6, 32 R_ANAL_JAVA_TYPE_VOLATILE = 1 << 7, 33 R_ANAL_JAVA_TYPE_PUBLIC = 1 << 8, 34 35 R_ANAL_JAVA_TYPE_BOOL = 1 << 10, 36 R_ANAL_JAVA_TYPE_BYTE = 1 << 11, 37 R_ANAL_JAVA_TYPE_SHORT = 1 << 12, 38 R_ANAL_JAVA_TYPE_INT32 = 1 << 13, 39 R_ANAL_JAVA_TYPE_INTEGER = 1 << 13, 40 R_ANAL_JAVA_TYPE_INT64 = 1 << 14, 41 R_ANAL_JAVA_TYPE_LONG = 1 << 14, 42 R_ANAL_JAVA_TYPE_FLOAT = 1 << 15, 43 R_ANAL_JAVA_TYPE_DOUBLE = 1 << 16, 44 R_ANAL_JAVA_TYPE_STRING = 1 << 17, 45 R_ANAL_JAVA_TYPE_CHAR = 1 << 18, 46 R_ANAL_JAVA_TYPE_VOID = 1 << 19, 47 }; 48 49 // code ops 50 enum { 51 R_ANAL_JAVA_CODEOP_JMP = 1 << 1 | R_ANAL_JAVA_CODE_OP,/* mandatory jump */ 52 R_ANAL_JAVA_CODEOP_CALL = 1 << 2 | R_ANAL_JAVA_CODE_OP,/* call to subroutine (branch+link) */ 53 R_ANAL_JAVA_CODEOP_RET = 1 << 3 | R_ANAL_JAVA_CODE_OP,/* returns from subrutine */ 54 R_ANAL_JAVA_CODEOP_TRAP = 1 << 4 | R_ANAL_JAVA_CODE_OP,/* it's a trap! */ 55 R_ANAL_JAVA_CODEOP_SWI = 1 << 5 | R_ANAL_JAVA_CODE_OP,/* syscall software interrupt */ 56 R_ANAL_JAVA_CODEOP_IO = 1 << 6 | R_ANAL_JAVA_CODE_OP, 57 R_ANAL_JAVA_CODEOP_LEAVE = 1 << 7 | R_ANAL_JAVA_CODE_OP, 58 R_ANAL_JAVA_CODEOP_SWITCH = 1 << 8 | R_ANAL_JAVA_CODE_OP, 59 R_ANAL_JAVA_CODEOP_CJMP = R_ANAL_JAVA_COND_OP | R_ANAL_JAVA_CODE_OP | R_ANAL_JAVA_CODEOP_JMP, 60 R_ANAL_JAVA_CODEOP_EOB = R_ANAL_JAVA_CODEOP_JMP | R_ANAL_JAVA_CODEOP_RET | R_ANAL_JAVA_CODEOP_LEAVE | R_ANAL_JAVA_CODEOP_SWITCH, 61 }; 62 63 enum { 64 // call return types 65 R_ANAL_JAVA_RET_TYPE_REF_NULL = 1 << 10, 66 R_ANAL_JAVA_RET_TYPE_REF = 1 << 11 , 67 R_ANAL_JAVA_RET_TYPE_PRIM = 1 << 12 , 68 R_ANAL_JAVA_RET_TYPE_CONST = 1 << 13, 69 R_ANAL_JAVA_RET_TYPE_STATIC = 1 << 14, 70 }; 71 72 // jmp conditionals 73 enum { 74 // TODO these should be mapped to some sort of 75 // flags register 76 R_ANAL_JAVA_COND_EQ = 1 << 11, 77 R_ANAL_JAVA_COND_NE = 1 << 12, 78 R_ANAL_JAVA_COND_GE = 1 << 13, 79 R_ANAL_JAVA_COND_GT = 1 << 14, 80 R_ANAL_JAVA_COND_LE = 1 << 15, 81 R_ANAL_JAVA_COND_LT = 1 << 16, 82 R_ANAL_JAVA_COND_AL = 1 << 17, 83 R_ANAL_JAVA_COND_NV = 1 << 18, 84 R_ANAL_JAVA_COND_NULL = 1 << 19, 85 }; 86 87 // bin ops 88 enum { 89 R_ANAL_JAVA_BINOP_NEG = 0 | R_ANAL_JAVA_BIN_OP, 90 R_ANAL_JAVA_BINOP_XCHG = 1 << 1 | R_ANAL_JAVA_BIN_OP, 91 R_ANAL_JAVA_BINOP_CMP = 1 << 2 | R_ANAL_JAVA_BIN_OP, 92 R_ANAL_JAVA_BINOP_ADD = 1 << 3 | R_ANAL_JAVA_BIN_OP, 93 R_ANAL_JAVA_BINOP_SUB = 1 << 4 | R_ANAL_JAVA_BIN_OP, 94 R_ANAL_JAVA_BINOP_MUL = 1 << 6 | R_ANAL_JAVA_BIN_OP, 95 R_ANAL_JAVA_BINOP_DIV = 1 << 7 | R_ANAL_JAVA_BIN_OP, 96 R_ANAL_JAVA_BINOP_SHR = 1 << 8 | R_ANAL_JAVA_BIN_OP, 97 R_ANAL_JAVA_BINOP_SHL = 1 << 9 | R_ANAL_JAVA_BIN_OP, 98 R_ANAL_JAVA_BINOP_SAL = 1 << 10 | R_ANAL_JAVA_BIN_OP, 99 R_ANAL_JAVA_BINOP_SAR = 1 << 11 | R_ANAL_JAVA_BIN_OP, 100 R_ANAL_JAVA_BINOP_OR = 1 << 12 | R_ANAL_JAVA_BIN_OP, 101 R_ANAL_JAVA_BINOP_AND = 1 << 14 | R_ANAL_JAVA_BIN_OP, 102 R_ANAL_JAVA_BINOP_XOR = 1 << 15 | R_ANAL_JAVA_BIN_OP, 103 R_ANAL_JAVA_BINOP_NOT = 1 << 16 | R_ANAL_JAVA_BIN_OP, 104 R_ANAL_JAVA_BINOP_MOD = 1 << 17 | R_ANAL_JAVA_BIN_OP, 105 R_ANAL_JAVA_BINOP_ROR = 1 << 18 | R_ANAL_JAVA_BIN_OP, 106 R_ANAL_JAVA_BINOP_ROL = 1 << 19 | R_ANAL_JAVA_BIN_OP, 107 }; 108 109 // Object ops 110 enum { 111 R_ANAL_JAVA_OBJOP_CAST = 1 << 0 | R_ANAL_JAVA_OBJ_OP, 112 R_ANAL_JAVA_OBJOP_CHECK = 1 << 1 | R_ANAL_JAVA_OBJ_OP, 113 R_ANAL_JAVA_OBJOP_NEW = 1 << 2 | R_ANAL_JAVA_OBJ_OP, 114 R_ANAL_JAVA_OBJOP_DEL = 1 << 3 | R_ANAL_JAVA_OBJ_OP, 115 R_ANAL_JAVA_OBJOP_SIZE = 1 << 4 | R_ANAL_JAVA_OBJ_OP, 116 }; 117 118 119 // Memory or Data Operations 120 // Locations of item loaded (base of indirect) 121 enum { 122 R_ANAL_JAVA_LDST_FROM_REF = 1 << 1, 123 R_ANAL_JAVA_LDST_FROM_MEM = 1 << 1, 124 125 R_ANAL_JAVA_LDST_FROM_REG = 1 << 2, 126 R_ANAL_JAVA_LDST_FROM_STACK = 1 << 3, 127 R_ANAL_JAVA_LDST_FROM_CONST = 1 << 4, 128 R_ANAL_JAVA_LDST_FROM_VAR = 1 << 5, 129 130 // If indirect load, where are we getting the indirection, 131 R_ANAL_JAVA_LDST_INDIRECT_REF = 1 << 6, 132 R_ANAL_JAVA_LDST_INDIRECT_MEM = 1 << 6, 133 134 R_ANAL_JAVA_LDST_INDIRECT_REG = 1 << 7, 135 R_ANAL_JAVA_LDST_INDIRECT_STACK = 1 << 8, 136 R_ANAL_JAVA_LDST_INDIRECT_IDX = 1 << 9, 137 R_ANAL_JAVA_LDST_INDIRECT_VAR = 1 << 10, 138 139 // Location to put the item, 140 R_ANAL_JAVA_LDST_TO_REF = 1 << 11, 141 R_ANAL_JAVA_LDST_TO_MEM = 1 << 11, 142 143 R_ANAL_JAVA_LDST_TO_REG = 1 << 12, 144 R_ANAL_JAVA_LDST_TO_STACK = 1 << 13, 145 R_ANAL_JAVA_LDST_TO_VAR = 1 << 14, 146 147 // Stack, Memory, Register, Bss, Data , 148 R_ANAL_JAVA_LDST_OP_PUSH = 1 << 15 , 149 R_ANAL_JAVA_LDST_OP_POP = 1 << 16, 150 R_ANAL_JAVA_LDST_OP_MOV = 1 << 17 , 151 R_ANAL_JAVA_LDST_OP_EFF_ADDR = 1 << 18, 152 }; 153 154 enum { 155 156 R_ANAL_JAVA_LDST_LOAD_FROM_CONST_REF_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\ 157 R_ANAL_JAVA_LOAD_OP |\ 158 R_ANAL_JAVA_LDST_FROM_REF |\ 159 R_ANAL_JAVA_LDST_FROM_CONST |\ 160 R_ANAL_JAVA_LDST_TO_STACK |\ 161 R_ANAL_JAVA_TYPE_REF, 162 163 164 165 R_ANAL_JAVA_LDST_LOAD_FROM_CONST_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\ 166 R_ANAL_JAVA_LOAD_OP |\ 167 R_ANAL_JAVA_LDST_FROM_CONST |\ 168 R_ANAL_JAVA_LDST_TO_STACK, 169 170 R_ANAL_JAVA_LDST_LOAD_FROM_CONST_INDIRECT_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\ 171 R_ANAL_JAVA_LOAD_OP |\ 172 R_ANAL_JAVA_LDST_FROM_CONST |\ 173 R_ANAL_JAVA_LDST_INDIRECT_IDX |\ 174 R_ANAL_JAVA_LDST_TO_STACK, 175 176 R_ANAL_JAVA_LDST_LOAD_FROM_VAR_INDIRECT_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\ 177 R_ANAL_JAVA_LOAD_OP |\ 178 R_ANAL_JAVA_LDST_FROM_VAR |\ 179 R_ANAL_JAVA_LDST_INDIRECT_IDX |\ 180 R_ANAL_JAVA_LDST_TO_STACK, 181 182 R_ANAL_JAVA_LDST_LOAD_FROM_VAR_INDIRECT_TO_STACK_REF = R_ANAL_JAVA_LDST_OP_PUSH |\ 183 R_ANAL_JAVA_LOAD_OP |\ 184 R_ANAL_JAVA_LDST_FROM_VAR |\ 185 R_ANAL_JAVA_LDST_INDIRECT_IDX |\ 186 R_ANAL_JAVA_LDST_TO_STACK, 187 188 R_ANAL_JAVA_LDST_LOAD_FROM_VAR_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\ 189 R_ANAL_JAVA_LOAD_OP |\ 190 R_ANAL_JAVA_LDST_FROM_VAR |\ 191 R_ANAL_JAVA_LDST_INDIRECT_IDX |\ 192 R_ANAL_JAVA_LDST_TO_STACK, 193 194 R_ANAL_JAVA_LDST_LOAD_FROM_VAR_TO_STACK_REF = R_ANAL_JAVA_LDST_OP_PUSH |\ 195 R_ANAL_JAVA_LOAD_OP |\ 196 R_ANAL_JAVA_LDST_FROM_VAR |\ 197 R_ANAL_JAVA_LDST_INDIRECT_IDX |\ 198 R_ANAL_JAVA_LDST_TO_STACK, 199 200 R_ANAL_JAVA_LDST_LOAD_FROM_REF_INDIRECT_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\ 201 R_ANAL_JAVA_LOAD_OP |\ 202 R_ANAL_JAVA_LDST_FROM_REF |\ 203 R_ANAL_JAVA_LDST_INDIRECT_IDX |\ 204 R_ANAL_JAVA_LDST_TO_STACK, 205 206 R_ANAL_JAVA_LDST_LOAD_FROM_REF_INDIRECT_TO_STACK_REF = R_ANAL_JAVA_LDST_OP_PUSH |\ 207 R_ANAL_JAVA_LOAD_OP |\ 208 R_ANAL_JAVA_LDST_FROM_REF |\ 209 R_ANAL_JAVA_LDST_INDIRECT_IDX |\ 210 R_ANAL_JAVA_LDST_TO_STACK, 211 212 R_ANAL_JAVA_LDST_STORE_FROM_STACK_INDIRECT_TO_VAR = R_ANAL_JAVA_LDST_OP_PUSH |\ 213 R_ANAL_JAVA_STORE_OP |\ 214 R_ANAL_JAVA_LDST_FROM_STACK |\ 215 R_ANAL_JAVA_LDST_INDIRECT_IDX |\ 216 R_ANAL_JAVA_LDST_TO_VAR, 217 218 R_ANAL_JAVA_LDST_STORE_FROM_STACK_INDIRECT_TO_VAR_REF = R_ANAL_JAVA_LDST_OP_PUSH |\ 219 R_ANAL_JAVA_STORE_OP |\ 220 R_ANAL_JAVA_LDST_FROM_STACK |\ 221 R_ANAL_JAVA_LDST_INDIRECT_IDX |\ 222 R_ANAL_JAVA_LDST_TO_VAR, 223 224 R_ANAL_JAVA_LDST_STORE_FROM_STACK_TO_VAR = R_ANAL_JAVA_LDST_OP_PUSH |\ 225 R_ANAL_JAVA_STORE_OP |\ 226 R_ANAL_JAVA_LDST_FROM_STACK |\ 227 R_ANAL_JAVA_LDST_TO_VAR, 228 229 R_ANAL_JAVA_LDST_STORE_FROM_STACK_TO_VAR_REF = R_ANAL_JAVA_LDST_OP_PUSH |\ 230 R_ANAL_JAVA_STORE_OP |\ 231 R_ANAL_JAVA_LDST_FROM_STACK |\ 232 R_ANAL_JAVA_LDST_TO_VAR, 233 234 R_ANAL_JAVA_LDST_STORE_FROM_STACK_INDIRECT_TO_REF = R_ANAL_JAVA_LDST_OP_PUSH |\ 235 R_ANAL_JAVA_STORE_OP |\ 236 R_ANAL_JAVA_LDST_FROM_STACK |\ 237 R_ANAL_JAVA_LDST_TO_REF, 238 239 R_ANAL_JAVA_LDST_STORE_FROM_STACK_INDIRECT_TO_REF_REF = R_ANAL_JAVA_LDST_OP_PUSH |\ 240 R_ANAL_JAVA_STORE_OP |\ 241 R_ANAL_JAVA_LDST_FROM_STACK |\ 242 R_ANAL_JAVA_LDST_TO_REF, 243 244 R_ANAL_JAVA_LDST_LOAD_FROM_REF_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\ 245 R_ANAL_JAVA_LOAD_OP |\ 246 R_ANAL_JAVA_LDST_FROM_REF |\ 247 R_ANAL_JAVA_LDST_TO_STACK |\ 248 R_ANAL_JAVA_TYPE_PRIM, 249 250 R_ANAL_JAVA_LDST_LOAD_FROM_PRIM_VAR_TO_STACK = R_ANAL_JAVA_LDST_OP_PUSH |\ 251 R_ANAL_JAVA_LOAD_OP |\ 252 R_ANAL_JAVA_LDST_FROM_VAR |\ 253 R_ANAL_JAVA_TYPE_PRIM, 254 255 R_ANAL_JAVA_LDST_LOAD_GET_STATIC = R_ANAL_JAVA_LDST_OP_PUSH |\ 256 R_ANAL_JAVA_LOAD_OP |\ 257 R_ANAL_JAVA_LDST_FROM_REF |\ 258 R_ANAL_JAVA_LDST_TO_STACK |\ 259 R_ANAL_JAVA_TYPE_REF, 260 261 R_ANAL_JAVA_LDST_STORE_PUT_STATIC = R_ANAL_JAVA_LDST_OP_POP |\ 262 R_ANAL_JAVA_STORE_OP |\ 263 R_ANAL_JAVA_LDST_FROM_STACK |\ 264 R_ANAL_JAVA_LDST_TO_REF |\ 265 R_ANAL_JAVA_TYPE_REF, 266 267 R_ANAL_JAVA_LDST_LOAD_GET_FIELD = R_ANAL_JAVA_LDST_OP_PUSH |\ 268 R_ANAL_JAVA_LOAD_OP |\ 269 R_ANAL_JAVA_LDST_FROM_REF |\ 270 R_ANAL_JAVA_LDST_TO_STACK |\ 271 R_ANAL_JAVA_TYPE_REF, 272 273 R_ANAL_JAVA_LDST_STORE_PUT_FIELD = R_ANAL_JAVA_LDST_OP_POP |\ 274 R_ANAL_JAVA_STORE_OP |\ 275 R_ANAL_JAVA_LDST_FROM_STACK |\ 276 R_ANAL_JAVA_LDST_TO_REF |\ 277 R_ANAL_JAVA_TYPE_REF, 278 }; 279 280 #endif 281