Hermes/Dyforge is a program written in c++ allows you to inject a dll that can analyze all processes in a program, can be used for mod and reverse engeneering
| 1 | #ifndef CAPSTONE_SH_H |
| 2 | #define CAPSTONE_SH_H |
| 3 | |
| 4 | /* Capstone Disassembly Engine */ |
| 5 | /* By Yoshinori Sato, 2022 */ |
| 6 | |
| 7 | #ifdef __cplusplus |
| 8 | extern "C" { |
| 9 | #endif |
| 10 | |
| 11 | #include "platform.h" |
| 12 | #include "cs_operand.h" |
| 13 | |
| 14 | #ifdef _MSC_VER |
| 15 | #pragma warning(disable:4201) |
| 16 | #endif |
| 17 | |
| 18 | /// SH registers and special registers |
| 19 | typedef enum { |
| 20 | SH_REG_INVALID = 0, |
| 21 | |
| 22 | SH_REG_R0, |
| 23 | SH_REG_R1, |
| 24 | SH_REG_R2, |
| 25 | SH_REG_R3, |
| 26 | SH_REG_R4, |
| 27 | SH_REG_R5, |
| 28 | SH_REG_R6, |
| 29 | SH_REG_R7, |
| 30 | |
| 31 | SH_REG_R8, |
| 32 | SH_REG_R9, |
| 33 | SH_REG_R10, |
| 34 | SH_REG_R11, |
| 35 | SH_REG_R12, |
| 36 | SH_REG_R13, |
| 37 | SH_REG_R14, |
| 38 | SH_REG_R15, |
| 39 | |
| 40 | SH_REG_R0_BANK, |
| 41 | SH_REG_R1_BANK, |
| 42 | SH_REG_R2_BANK, |
| 43 | SH_REG_R3_BANK, |
| 44 | SH_REG_R4_BANK, |
| 45 | SH_REG_R5_BANK, |
| 46 | SH_REG_R6_BANK, |
| 47 | SH_REG_R7_BANK, |
| 48 | |
| 49 | SH_REG_FR0, |
| 50 | SH_REG_FR1, |
| 51 | SH_REG_FR2, |
| 52 | SH_REG_FR3, |
| 53 | SH_REG_FR4, |
| 54 | SH_REG_FR5, |
| 55 | SH_REG_FR6, |
| 56 | SH_REG_FR7, |
| 57 | SH_REG_FR8, |
| 58 | SH_REG_FR9, |
| 59 | SH_REG_FR10, |
| 60 | SH_REG_FR11, |
| 61 | SH_REG_FR12, |
| 62 | SH_REG_FR13, |
| 63 | SH_REG_FR14, |
| 64 | SH_REG_FR15, |
| 65 | |
| 66 | SH_REG_DR0, |
| 67 | SH_REG_DR2, |
| 68 | SH_REG_DR4, |
| 69 | SH_REG_DR6, |
| 70 | SH_REG_DR8, |
| 71 | SH_REG_DR10, |
| 72 | SH_REG_DR12, |
| 73 | SH_REG_DR14, |
| 74 | |
| 75 | SH_REG_XD0, |
| 76 | SH_REG_XD2, |
| 77 | SH_REG_XD4, |
| 78 | SH_REG_XD6, |
| 79 | SH_REG_XD8, |
| 80 | SH_REG_XD10, |
| 81 | SH_REG_XD12, |
| 82 | SH_REG_XD14, |
| 83 | |
| 84 | SH_REG_XF0, |
| 85 | SH_REG_XF1, |
| 86 | SH_REG_XF2, |
| 87 | SH_REG_XF3, |
| 88 | SH_REG_XF4, |
| 89 | SH_REG_XF5, |
| 90 | SH_REG_XF6, |
| 91 | SH_REG_XF7, |
| 92 | SH_REG_XF8, |
| 93 | SH_REG_XF9, |
| 94 | SH_REG_XF10, |
| 95 | SH_REG_XF11, |
| 96 | SH_REG_XF12, |
| 97 | SH_REG_XF13, |
| 98 | SH_REG_XF14, |
| 99 | SH_REG_XF15, |
| 100 | |
| 101 | SH_REG_FV0, |
| 102 | SH_REG_FV4, |
| 103 | SH_REG_FV8, |
| 104 | SH_REG_FV12, |
| 105 | |
| 106 | SH_REG_XMATRX, |
| 107 | |
| 108 | SH_REG_PC, |
| 109 | SH_REG_PR, |
| 110 | SH_REG_MACH, |
| 111 | SH_REG_MACL, |
| 112 | |
| 113 | SH_REG_SR, |
| 114 | SH_REG_GBR, |
| 115 | SH_REG_SSR, |
| 116 | SH_REG_SPC, |
| 117 | SH_REG_SGR, |
| 118 | SH_REG_DBR, |
| 119 | SH_REG_VBR, |
| 120 | SH_REG_TBR, |
| 121 | SH_REG_RS, |
| 122 | SH_REG_RE, |
| 123 | SH_REG_MOD, |
| 124 | |
| 125 | SH_REG_FPUL, |
| 126 | SH_REG_FPSCR, |
| 127 | |
| 128 | SH_REG_DSP_X0, |
| 129 | SH_REG_DSP_X1, |
| 130 | SH_REG_DSP_Y0, |
| 131 | SH_REG_DSP_Y1, |
| 132 | SH_REG_DSP_A0, |
| 133 | SH_REG_DSP_A1, |
| 134 | SH_REG_DSP_A0G, |
| 135 | SH_REG_DSP_A1G, |
| 136 | SH_REG_DSP_M0, |
| 137 | SH_REG_DSP_M1, |
| 138 | SH_REG_DSP_DSR, |
| 139 | |
| 140 | SH_REG_DSP_RSV0, |
| 141 | SH_REG_DSP_RSV1, |
| 142 | SH_REG_DSP_RSV2, |
| 143 | SH_REG_DSP_RSV3, |
| 144 | SH_REG_DSP_RSV4, |
| 145 | SH_REG_DSP_RSV5, |
| 146 | SH_REG_DSP_RSV6, |
| 147 | SH_REG_DSP_RSV7, |
| 148 | SH_REG_DSP_RSV8, |
| 149 | SH_REG_DSP_RSV9, |
| 150 | SH_REG_DSP_RSVA, |
| 151 | SH_REG_DSP_RSVB, |
| 152 | SH_REG_DSP_RSVC, |
| 153 | SH_REG_DSP_RSVD, |
| 154 | SH_REG_DSP_RSVE, |
| 155 | SH_REG_DSP_RSVF, |
| 156 | |
| 157 | SH_REG_ENDING, // <-- mark the end of the list of registers |
| 158 | } sh_reg; |
| 159 | |
| 160 | typedef enum { |
| 161 | SH_OP_INVALID = CS_OP_INVALID, ///< = CS_OP_INVALID (Uninitialized). |
| 162 | SH_OP_REG = CS_OP_REG, ///< = CS_OP_REG (Register operand). |
| 163 | SH_OP_IMM = CS_OP_IMM, ///< = CS_OP_IMM (Immediate operand). |
| 164 | SH_OP_MEM = CS_OP_MEM, ///< = CS_OP_MEM (Memory operand). |
| 165 | } sh_op_type; |
| 166 | |
| 167 | typedef enum { |
| 168 | SH_OP_MEM_INVALID = 0, /// <= Invalid |
| 169 | SH_OP_MEM_REG_IND, /// <= Register indirect |
| 170 | SH_OP_MEM_REG_POST, /// <= Register post increment |
| 171 | SH_OP_MEM_REG_PRE, /// <= Register pre decrement |
| 172 | SH_OP_MEM_REG_DISP, /// <= displacement |
| 173 | SH_OP_MEM_REG_R0, /// <= R0 indexed |
| 174 | SH_OP_MEM_GBR_DISP, /// <= GBR based displacement |
| 175 | SH_OP_MEM_GBR_R0, /// <= GBR based R0 indexed |
| 176 | SH_OP_MEM_PCR, /// <= PC relative |
| 177 | SH_OP_MEM_TBR_DISP, /// <= TBR based displaysment |
| 178 | } sh_op_mem_type; |
| 179 | |
| 180 | typedef struct sh_op_mem { |
| 181 | sh_op_mem_type address; /// <= memory address |
| 182 | sh_reg reg; /// <= base register |
| 183 | uint32_t disp; /// <= displacement |
| 184 | } sh_op_mem; |
| 185 | |
| 186 | typedef enum sh_dsp_insn { |
| 187 | SH_INS_DSP_INVALID = 0, |
| 188 | SH_INS_DSP_NOP = 1, |
| 189 | SH_INS_DSP_MOV, |
| 190 | SH_INS_DSP_PSHL, |
| 191 | SH_INS_DSP_PSHA, |
| 192 | SH_INS_DSP_PMULS, |
| 193 | SH_INS_DSP_PCLR_PMULS, |
| 194 | SH_INS_DSP_PSUB_PMULS, |
| 195 | SH_INS_DSP_PADD_PMULS, |
| 196 | SH_INS_DSP_PSUBC, |
| 197 | SH_INS_DSP_PADDC, |
| 198 | SH_INS_DSP_PCMP, |
| 199 | SH_INS_DSP_PABS, |
| 200 | SH_INS_DSP_PRND, |
| 201 | SH_INS_DSP_PSUB, |
| 202 | SH_INS_DSP_PSUBr, |
| 203 | SH_INS_DSP_PADD, |
| 204 | SH_INS_DSP_PAND, |
| 205 | SH_INS_DSP_PXOR, |
| 206 | SH_INS_DSP_POR, |
| 207 | SH_INS_DSP_PDEC, |
| 208 | SH_INS_DSP_PINC, |
| 209 | SH_INS_DSP_PCLR, |
| 210 | SH_INS_DSP_PDMSB, |
| 211 | SH_INS_DSP_PNEG, |
| 212 | SH_INS_DSP_PCOPY, |
| 213 | SH_INS_DSP_PSTS, |
| 214 | SH_INS_DSP_PLDS, |
| 215 | SH_INS_DSP_PSWAP, |
| 216 | SH_INS_DSP_PWAD, |
| 217 | SH_INS_DSP_PWSB, |
| 218 | } sh_dsp_insn; |
| 219 | |
| 220 | typedef enum sh_dsp_operand { |
| 221 | SH_OP_DSP_INVALID, |
| 222 | SH_OP_DSP_REG_PRE, |
| 223 | SH_OP_DSP_REG_IND, |
| 224 | SH_OP_DSP_REG_POST, |
| 225 | SH_OP_DSP_REG_INDEX, |
| 226 | SH_OP_DSP_REG, |
| 227 | SH_OP_DSP_IMM, |
| 228 | |
| 229 | } sh_dsp_operand; |
| 230 | |
| 231 | typedef enum sh_dsp_cc { |
| 232 | SH_DSP_CC_INVALID, |
| 233 | SH_DSP_CC_NONE, |
| 234 | SH_DSP_CC_DCT, |
| 235 | SH_DSP_CC_DCF, |
| 236 | } sh_dsp_cc; |
| 237 | |
| 238 | typedef struct sh_op_dsp { |
| 239 | sh_dsp_insn insn; |
| 240 | sh_dsp_operand operand[2]; |
| 241 | sh_reg r[6]; |
| 242 | sh_dsp_cc cc; |
| 243 | uint8_t imm; |
| 244 | int size; |
| 245 | } sh_op_dsp; |
| 246 | |
| 247 | /// Instruction operand |
| 248 | typedef struct cs_sh_op { |
| 249 | sh_op_type type; |
| 250 | union { |
| 251 | uint64_t imm; ///< immediate value for IMM operand |
| 252 | sh_reg reg; ///< register value for REG operand |
| 253 | sh_op_mem mem; ///< data when operand is targeting memory |
| 254 | sh_op_dsp dsp; ///< dsp instruction |
| 255 | }; |
| 256 | } cs_sh_op; |
| 257 | |
| 258 | /// SH instruction |
| 259 | typedef enum sh_insn { |
| 260 | SH_INS_INVALID, |
| 261 | SH_INS_ADD_r, |
| 262 | SH_INS_ADD, |
| 263 | SH_INS_ADDC, |
| 264 | SH_INS_ADDV, |
| 265 | SH_INS_AND, |
| 266 | SH_INS_BAND, |
| 267 | SH_INS_BANDNOT, |
| 268 | SH_INS_BCLR, |
| 269 | SH_INS_BF, |
| 270 | SH_INS_BF_S, |
| 271 | SH_INS_BLD, |
| 272 | SH_INS_BLDNOT, |
| 273 | SH_INS_BOR, |
| 274 | SH_INS_BORNOT, |
| 275 | SH_INS_BRA, |
| 276 | SH_INS_BRAF, |
| 277 | SH_INS_BSET, |
| 278 | SH_INS_BSR, |
| 279 | SH_INS_BSRF, |
| 280 | SH_INS_BST, |
| 281 | SH_INS_BT, |
| 282 | SH_INS_BT_S, |
| 283 | SH_INS_BXOR, |
| 284 | SH_INS_CLIPS, |
| 285 | SH_INS_CLIPU, |
| 286 | SH_INS_CLRDMXY, |
| 287 | SH_INS_CLRMAC, |
| 288 | SH_INS_CLRS, |
| 289 | SH_INS_CLRT, |
| 290 | SH_INS_CMP_EQ, |
| 291 | SH_INS_CMP_GE, |
| 292 | SH_INS_CMP_GT, |
| 293 | SH_INS_CMP_HI, |
| 294 | SH_INS_CMP_HS, |
| 295 | SH_INS_CMP_PL, |
| 296 | SH_INS_CMP_PZ, |
| 297 | SH_INS_CMP_STR, |
| 298 | SH_INS_DIV0S, |
| 299 | SH_INS_DIV0U, |
| 300 | SH_INS_DIV1, |
| 301 | SH_INS_DIVS, |
| 302 | SH_INS_DIVU, |
| 303 | SH_INS_DMULS_L, |
| 304 | SH_INS_DMULU_L, |
| 305 | SH_INS_DT, |
| 306 | SH_INS_EXTS_B, |
| 307 | SH_INS_EXTS_W, |
| 308 | SH_INS_EXTU_B, |
| 309 | SH_INS_EXTU_W, |
| 310 | SH_INS_FABS, |
| 311 | SH_INS_FADD, |
| 312 | SH_INS_FCMP_EQ, |
| 313 | SH_INS_FCMP_GT, |
| 314 | SH_INS_FCNVDS, |
| 315 | SH_INS_FCNVSD, |
| 316 | SH_INS_FDIV, |
| 317 | SH_INS_FIPR, |
| 318 | SH_INS_FLDI0, |
| 319 | SH_INS_FLDI1, |
| 320 | SH_INS_FLDS, |
| 321 | SH_INS_FLOAT, |
| 322 | SH_INS_FMAC, |
| 323 | SH_INS_FMOV, |
| 324 | SH_INS_FMUL, |
| 325 | SH_INS_FNEG, |
| 326 | SH_INS_FPCHG, |
| 327 | SH_INS_FRCHG, |
| 328 | SH_INS_FSCA, |
| 329 | SH_INS_FSCHG, |
| 330 | SH_INS_FSQRT, |
| 331 | SH_INS_FSRRA, |
| 332 | SH_INS_FSTS, |
| 333 | SH_INS_FSUB, |
| 334 | SH_INS_FTRC, |
| 335 | SH_INS_FTRV, |
| 336 | SH_INS_ICBI, |
| 337 | SH_INS_JMP, |
| 338 | SH_INS_JSR, |
| 339 | SH_INS_JSR_N, |
| 340 | SH_INS_LDBANK, |
| 341 | SH_INS_LDC, |
| 342 | SH_INS_LDRC, |
| 343 | SH_INS_LDRE, |
| 344 | SH_INS_LDRS, |
| 345 | SH_INS_LDS, |
| 346 | SH_INS_LDTLB, |
| 347 | SH_INS_MAC_L, |
| 348 | SH_INS_MAC_W, |
| 349 | SH_INS_MOV, |
| 350 | SH_INS_MOVA, |
| 351 | SH_INS_MOVCA, |
| 352 | SH_INS_MOVCO, |
| 353 | SH_INS_MOVI20, |
| 354 | SH_INS_MOVI20S, |
| 355 | SH_INS_MOVLI, |
| 356 | SH_INS_MOVML, |
| 357 | SH_INS_MOVMU, |
| 358 | SH_INS_MOVRT, |
| 359 | SH_INS_MOVT, |
| 360 | SH_INS_MOVU, |
| 361 | SH_INS_MOVUA, |
| 362 | SH_INS_MUL_L, |
| 363 | SH_INS_MULR, |
| 364 | SH_INS_MULS_W, |
| 365 | SH_INS_MULU_W, |
| 366 | SH_INS_NEG, |
| 367 | SH_INS_NEGC, |
| 368 | SH_INS_NOP, |
| 369 | SH_INS_NOT, |
| 370 | SH_INS_NOTT, |
| 371 | SH_INS_OCBI, |
| 372 | SH_INS_OCBP, |
| 373 | SH_INS_OCBWB, |
| 374 | SH_INS_OR, |
| 375 | SH_INS_PREF, |
| 376 | SH_INS_PREFI, |
| 377 | SH_INS_RESBANK, |
| 378 | SH_INS_ROTCL, |
| 379 | SH_INS_ROTCR, |
| 380 | SH_INS_ROTL, |
| 381 | SH_INS_ROTR, |
| 382 | SH_INS_RTE, |
| 383 | SH_INS_RTS, |
| 384 | SH_INS_RTS_N, |
| 385 | SH_INS_RTV_N, |
| 386 | SH_INS_SETDMX, |
| 387 | SH_INS_SETDMY, |
| 388 | SH_INS_SETRC, |
| 389 | SH_INS_SETS, |
| 390 | SH_INS_SETT, |
| 391 | SH_INS_SHAD, |
| 392 | SH_INS_SHAL, |
| 393 | SH_INS_SHAR, |
| 394 | SH_INS_SHLD, |
| 395 | SH_INS_SHLL, |
| 396 | SH_INS_SHLL16, |
| 397 | SH_INS_SHLL2, |
| 398 | SH_INS_SHLL8, |
| 399 | SH_INS_SHLR, |
| 400 | SH_INS_SHLR16, |
| 401 | SH_INS_SHLR2, |
| 402 | SH_INS_SHLR8, |
| 403 | SH_INS_SLEEP, |
| 404 | SH_INS_STBANK, |
| 405 | SH_INS_STC, |
| 406 | SH_INS_STS, |
| 407 | SH_INS_SUB, |
| 408 | SH_INS_SUBC, |
| 409 | SH_INS_SUBV, |
| 410 | SH_INS_SWAP_B, |
| 411 | SH_INS_SWAP_W, |
| 412 | SH_INS_SYNCO, |
| 413 | SH_INS_TAS, |
| 414 | SH_INS_TRAPA, |
| 415 | SH_INS_TST, |
| 416 | SH_INS_XOR, |
| 417 | SH_INS_XTRCT, |
| 418 | SH_INS_DSP, |
| 419 | SH_INS_ENDING, // <-- mark the end of the list of instructions |
| 420 | } sh_insn; |
| 421 | |
| 422 | /// Instruction structure |
| 423 | typedef struct cs_sh { |
| 424 | sh_insn insn; |
| 425 | uint8_t size; |
| 426 | uint8_t op_count; |
| 427 | cs_sh_op operands[3]; |
| 428 | } cs_sh; |
| 429 | |
| 430 | /// Group of SH instructions |
| 431 | typedef enum sh_insn_group { |
| 432 | SH_GRP_INVALID = 0, ///< CS_GRUP_INVALID |
| 433 | SH_GRP_JUMP, ///< = CS_GRP_JUMP |
| 434 | SH_GRP_CALL, ///< = CS_GRP_CALL |
| 435 | SH_GRP_INT, ///< = CS_GRP_INT |
| 436 | SH_GRP_RET, ///< = CS_GRP_RET |
| 437 | SH_GRP_IRET, ///< = CS_GRP_IRET |
| 438 | SH_GRP_PRIVILEGE, ///< = CS_GRP_PRIVILEGE |
| 439 | SH_GRP_BRANCH_RELATIVE, ///< = CS_GRP_BRANCH_RELATIVE |
| 440 | |
| 441 | SH_GRP_SH1, |
| 442 | SH_GRP_SH2, |
| 443 | SH_GRP_SH2E, |
| 444 | SH_GRP_SH2DSP, |
| 445 | SH_GRP_SH2A, |
| 446 | SH_GRP_SH2AFPU, |
| 447 | SH_GRP_SH3, |
| 448 | SH_GRP_SH3DSP, |
| 449 | SH_GRP_SH4, |
| 450 | SH_GRP_SH4A, |
| 451 | |
| 452 | SH_GRP_ENDING,// <-- mark the end of the list of groups |
| 453 | } sh_insn_group; |
| 454 | |
| 455 | #ifdef __cplusplus |
| 456 | } |
| 457 | #endif |
| 458 | |
| 459 | #endif |
| 460 |