Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ADE32 version 2.02c -- C edition
- #define WIN32_LEAN_AND_MEAN
- #define WIN32_EXTRA_LEAN
- #include <windows.h>
- #include "ADE32.h"
- DWORD ade32_table[512] = {
- /* 00 */ C_MODRM,
- /* 01 */ C_MODRM,
- /* 02 */ C_MODRM,
- /* 03 */ C_MODRM,
- /* 04 */ C_DATA1,
- /* 05 */ C_DATA66,
- /* 06 */ C_BAD,
- /* 07 */ C_BAD,
- /* 08 */ C_MODRM,
- /* 09 */ C_MODRM,
- /* 0A */ C_MODRM,
- /* 0B */ C_MODRM,
- /* 0C */ C_DATA1,
- /* 0D */ C_DATA66,
- /* 0E */ C_BAD,
- /* 0F */ C_OPCODE2,
- /* 10 */ C_MODRM+C_BAD,
- /* 11 */ C_MODRM,
- /* 12 */ C_MODRM+C_BAD,
- /* 13 */ C_MODRM,
- /* 14 */ C_DATA1+C_BAD,
- /* 15 */ C_DATA66+C_BAD,
- /* 16 */ C_BAD,
- /* 17 */ C_BAD,
- /* 18 */ C_MODRM+C_BAD,
- /* 19 */ C_MODRM,
- /* 1A */ C_MODRM,
- /* 1B */ C_MODRM,
- /* 1C */ C_DATA1+C_BAD,
- /* 1D */ C_DATA66+C_BAD,
- /* 1E */ C_BAD,
- /* 1F */ C_BAD,
- /* 20 */ C_MODRM,
- /* 21 */ C_MODRM,
- /* 22 */ C_MODRM,
- /* 23 */ C_MODRM,
- /* 24 */ C_DATA1,
- /* 25 */ C_DATA66,
- /* 26 */ C_SEG+C_BAD,
- /* 27 */ C_BAD,
- /* 28 */ C_MODRM,
- /* 29 */ C_MODRM,
- /* 2A */ C_MODRM,
- /* 2B */ C_MODRM,
- /* 2C */ C_DATA1,
- /* 2D */ C_DATA66,
- /* 2E */ C_SEG+C_BAD,
- /* 2F */ C_BAD,
- /* 30 */ C_MODRM,
- /* 31 */ C_MODRM,
- /* 32 */ C_MODRM,
- /* 33 */ C_MODRM,
- /* 34 */ C_DATA1,
- /* 35 */ C_DATA66,
- /* 36 */ C_SEG+C_BAD,
- /* 37 */ C_BAD,
- /* 38 */ C_MODRM,
- /* 39 */ C_MODRM,
- /* 3A */ C_MODRM,
- /* 3B */ C_MODRM,
- /* 3C */ C_DATA1,
- /* 3D */ C_DATA66,
- /* 3E */ C_SEG+C_BAD,
- /* 3F */ C_BAD,
- /* 40 */ 0,
- /* 41 */ 0,
- /* 42 */ 0,
- /* 43 */ 0,
- /* 44 */ C_BAD,
- /* 45 */ 0,
- /* 46 */ 0,
- /* 47 */ 0,
- /* 48 */ 0,
- /* 49 */ 0,
- /* 4A */ 0,
- /* 4B */ 0,
- /* 4C */ C_BAD,
- /* 4D */ 0,
- /* 4E */ 0,
- /* 4F */ 0,
- /* 50 */ 0,
- /* 51 */ 0,
- /* 52 */ 0,
- /* 53 */ 0,
- /* 54 */ 0,
- /* 55 */ 0,
- /* 56 */ 0,
- /* 57 */ 0,
- /* 58 */ 0,
- /* 59 */ 0,
- /* 5A */ 0,
- /* 5B */ 0,
- /* 5C */ C_BAD,
- /* 5D */ 0,
- /* 5E */ 0,
- /* 5F */ 0,
- /* 60 */ C_BAD,
- /* 61 */ C_BAD,
- /* 62 */ C_MODRM+C_BAD,
- /* 63 */ C_MODRM+C_BAD,
- /* 64 */ C_SEG,
- /* 65 */ C_SEG+C_BAD,
- /* 66 */ C_66,
- /* 67 */ C_67,
- /* 68 */ C_DATA66,
- /* 69 */ C_MODRM+C_DATA66,
- /* 6A */ C_DATA1,
- /* 6B */ C_MODRM+C_DATA1,
- /* 6C */ C_BAD,
- /* 6D */ C_BAD,
- /* 6E */ C_BAD,
- /* 6F */ C_BAD,
- /* 70 */ C_DATA1+C_REL+C_BAD,
- /* 71 */ C_DATA1+C_REL+C_BAD,
- /* 72 */ C_DATA1+C_REL,
- /* 73 */ C_DATA1+C_REL,
- /* 74 */ C_DATA1+C_REL,
- /* 75 */ C_DATA1+C_REL,
- /* 76 */ C_DATA1+C_REL,
- /* 77 */ C_DATA1+C_REL,
- /* 78 */ C_DATA1+C_REL,
- /* 79 */ C_DATA1+C_REL,
- /* 7A */ C_DATA1+C_REL+C_BAD,
- /* 7B */ C_DATA1+C_REL+C_BAD,
- /* 7C */ C_DATA1+C_REL,
- /* 7D */ C_DATA1+C_REL,
- /* 7E */ C_DATA1+C_REL,
- /* 7F */ C_DATA1+C_REL,
- /* 80 */ C_MODRM+C_DATA1,
- /* 81 */ C_MODRM+C_DATA66,
- /* 82 */ C_MODRM+C_DATA1+C_BAD,
- /* 83 */ C_MODRM+C_DATA1,
- /* 84 */ C_MODRM,
- /* 85 */ C_MODRM,
- /* 86 */ C_MODRM,
- /* 87 */ C_MODRM,
- /* 88 */ C_MODRM,
- /* 89 */ C_MODRM,
- /* 8A */ C_MODRM,
- /* 8B */ C_MODRM,
- /* 8C */ C_MODRM+C_BAD,
- /* 8D */ C_MODRM,
- /* 8E */ C_MODRM+C_BAD,
- /* 8F */ C_MODRM,
- /* 90 */ 0,
- /* 91 */ 0,
- /* 92 */ 0,
- /* 93 */ C_BAD,
- /* 94 */ C_BAD,
- /* 95 */ C_BAD,
- /* 96 */ C_BAD,
- /* 97 */ C_BAD,
- /* 98 */ C_BAD,
- /* 99 */ 0,
- /* 9A */ C_DATA66+C_DATA2+C_BAD,
- /* 9B */ 0,
- /* 9C */ C_BAD,
- /* 9D */ C_BAD,
- /* 9E */ C_BAD,
- /* 9F */ C_BAD,
- /* A0 */ C_ADDR67,
- /* A1 */ C_ADDR67,
- /* A2 */ C_ADDR67,
- /* A3 */ C_ADDR67,
- /* A4 */ 0,
- /* A5 */ 0,
- /* A6 */ 0,
- /* A7 */ 0,
- /* A8 */ C_DATA1,
- /* A9 */ C_DATA66,
- /* AA */ 0,
- /* AB */ 0,
- /* AC */ 0,
- /* AD */ C_BAD,
- /* AE */ 0,
- /* AF */ C_BAD,
- /* B0 */ C_DATA1,
- /* B1 */ C_DATA1,
- /* B2 */ C_DATA1,
- /* B3 */ C_DATA1,
- /* B4 */ C_DATA1,
- /* B5 */ C_DATA1,
- /* B6 */ C_DATA1+C_BAD,
- /* B7 */ C_DATA1+C_BAD,
- /* B8 */ C_DATA66,
- /* B9 */ C_DATA66,
- /* BA */ C_DATA66,
- /* BB */ C_DATA66,
- /* BC */ C_DATA66+C_BAD,
- /* BD */ C_DATA66,
- /* BE */ C_DATA66,
- /* BF */ C_DATA66,
- /* C0 */ C_MODRM+C_DATA1,
- /* C1 */ C_MODRM+C_DATA1,
- /* C2 */ C_DATA2+C_STOP,
- /* C3 */ C_STOP,
- /* C4 */ C_MODRM+C_BAD,
- /* C5 */ C_MODRM+C_BAD,
- /* C6 */ C_MODRM+C_DATA1,
- /* C7 */ C_MODRM+C_DATA66,
- /* C8 */ C_DATA2+C_DATA1,
- /* C9 */ 0,
- /* CA */ C_DATA2+C_STOP+C_BAD,
- /* CB */ C_STOP+C_BAD,
- /* CC */ C_BAD,
- /* CD */ C_BAD,
- /* CE */ C_BAD,
- /* CF */ C_STOP+C_BAD,
- /* D0 */ C_MODRM,
- /* D1 */ C_MODRM,
- /* D2 */ C_MODRM,
- /* D3 */ C_MODRM,
- /* D4 */ C_DATA1+C_BAD,
- /* D5 */ C_DATA1+C_BAD,
- /* D6 */ C_BAD,
- /* D7 */ C_BAD,
- /* D8 */ C_MODRM,
- /* D9 */ C_MODRM,
- /* DA */ C_MODRM,
- /* DB */ C_MODRM,
- /* DC */ C_MODRM,
- /* DD */ C_MODRM,
- /* DE */ C_MODRM,
- /* DF */ C_MODRM,
- /* E0 */ C_DATA1+C_REL+C_BAD,
- /* E1 */ C_DATA1+C_REL+C_BAD,
- /* E2 */ C_DATA1+C_REL,
- /* E3 */ C_DATA1+C_REL,
- /* E4 */ C_DATA1+C_BAD,
- /* E5 */ C_DATA1+C_BAD,
- /* E6 */ C_DATA1+C_BAD,
- /* E7 */ C_DATA1+C_BAD,
- /* E8 */ C_DATA66+C_REL,
- /* E9 */ C_DATA66+C_REL+C_STOP,
- /* EA */ C_DATA66+C_DATA2+C_BAD,
- /* EB */ C_DATA1+C_REL+C_STOP,
- /* EC */ C_BAD,
- /* ED */ C_BAD,
- /* EE */ C_BAD,
- /* EF */ C_BAD,
- /* F0 */ C_LOCK+C_BAD,
- /* F1 */ C_BAD,
- /* F2 */ C_REP,
- /* F3 */ C_REP,
- /* F4 */ C_BAD,
- /* F5 */ C_BAD,
- /* F6 */ C_MODRM,
- /* F7 */ C_MODRM,
- /* F8 */ 0,
- /* F9 */ 0,
- /* FA */ C_BAD,
- /* FB */ C_BAD,
- /* FC */ 0,
- /* FD */ 0,
- /* FE */ C_MODRM,
- /* FF */ C_MODRM,
- /* 00 */ C_MODRM,
- /* 01 */ C_MODRM,
- /* 02 */ C_MODRM,
- /* 03 */ C_MODRM,
- /* 04 */ C_ERROR,
- /* 05 */ C_ERROR,
- /* 06 */ 0,
- /* 07 */ C_ERROR,
- /* 08 */ 0,
- /* 09 */ 0,
- /* 0A */ 0,
- /* 0B */ 0,
- /* 0C */ C_ERROR,
- /* 0D */ C_ERROR,
- /* 0E */ C_ERROR,
- /* 0F */ C_ERROR,
- /* 10 */ C_ERROR,
- /* 11 */ C_ERROR,
- /* 12 */ C_ERROR,
- /* 13 */ C_ERROR,
- /* 14 */ C_ERROR,
- /* 15 */ C_ERROR,
- /* 16 */ C_ERROR,
- /* 17 */ C_ERROR,
- /* 18 */ C_ERROR,
- /* 19 */ C_ERROR,
- /* 1A */ C_ERROR,
- /* 1B */ C_ERROR,
- /* 1C */ C_ERROR,
- /* 1D */ C_ERROR,
- /* 1E */ C_ERROR,
- /* 1F */ C_ERROR,
- /* 20 */ C_ERROR,
- /* 21 */ C_ERROR,
- /* 22 */ C_ERROR,
- /* 23 */ C_ERROR,
- /* 24 */ C_ERROR,
- /* 25 */ C_ERROR,
- /* 26 */ C_ERROR,
- /* 27 */ C_ERROR,
- /* 28 */ C_ERROR,
- /* 29 */ C_ERROR,
- /* 2A */ C_ERROR,
- /* 2B */ C_ERROR,
- /* 2C */ C_ERROR,
- /* 2D */ C_ERROR,
- /* 2E */ C_ERROR,
- /* 2F */ C_ERROR,
- /* 30 */ C_ERROR,
- /* 31 */ C_ERROR,
- /* 32 */ C_ERROR,
- /* 33 */ C_ERROR,
- /* 34 */ C_ERROR,
- /* 35 */ C_ERROR,
- /* 36 */ C_ERROR,
- /* 37 */ C_ERROR,
- /* 38 */ C_ERROR,
- /* 39 */ C_ERROR,
- /* 3A */ C_ERROR,
- /* 3B */ C_ERROR,
- /* 3C */ C_ERROR,
- /* 3D */ C_ERROR,
- /* 3E */ C_ERROR,
- /* 3F */ C_ERROR,
- /* 40 */ C_ERROR,
- /* 41 */ C_ERROR,
- /* 42 */ C_ERROR,
- /* 43 */ C_ERROR,
- /* 44 */ C_ERROR,
- /* 45 */ C_ERROR,
- /* 46 */ C_ERROR,
- /* 47 */ C_ERROR,
- /* 48 */ C_ERROR,
- /* 49 */ C_ERROR,
- /* 4A */ C_ERROR,
- /* 4B */ C_ERROR,
- /* 4C */ C_ERROR,
- /* 4D */ C_ERROR,
- /* 4E */ C_ERROR,
- /* 4F */ C_ERROR,
- /* 50 */ C_ERROR,
- /* 51 */ C_ERROR,
- /* 52 */ C_ERROR,
- /* 53 */ C_ERROR,
- /* 54 */ C_ERROR,
- /* 55 */ C_ERROR,
- /* 56 */ C_ERROR,
- /* 57 */ C_ERROR,
- /* 58 */ C_ERROR,
- /* 59 */ C_ERROR,
- /* 5A */ C_ERROR,
- /* 5B */ C_ERROR,
- /* 5C */ C_ERROR,
- /* 5D */ C_ERROR,
- /* 5E */ C_ERROR,
- /* 5F */ C_ERROR,
- /* 60 */ C_ERROR,
- /* 61 */ C_ERROR,
- /* 62 */ C_ERROR,
- /* 63 */ C_ERROR,
- /* 64 */ C_ERROR,
- /* 65 */ C_ERROR,
- /* 66 */ C_ERROR,
- /* 67 */ C_ERROR,
- /* 68 */ C_ERROR,
- /* 69 */ C_ERROR,
- /* 6A */ C_ERROR,
- /* 6B */ C_ERROR,
- /* 6C */ C_ERROR,
- /* 6D */ C_ERROR,
- /* 6E */ C_ERROR,
- /* 6F */ C_ERROR,
- /* 70 */ C_ERROR,
- /* 71 */ C_ERROR,
- /* 72 */ C_ERROR,
- /* 73 */ C_ERROR,
- /* 74 */ C_ERROR,
- /* 75 */ C_ERROR,
- /* 76 */ C_ERROR,
- /* 77 */ C_ERROR,
- /* 78 */ C_ERROR,
- /* 79 */ C_ERROR,
- /* 7A */ C_ERROR,
- /* 7B */ C_ERROR,
- /* 7C */ C_ERROR,
- /* 7D */ C_ERROR,
- /* 7E */ C_ERROR,
- /* 7F */ C_ERROR,
- /* 80 */ C_DATA66+C_REL,
- /* 81 */ C_DATA66+C_REL,
- /* 82 */ C_DATA66+C_REL,
- /* 83 */ C_DATA66+C_REL,
- /* 84 */ C_DATA66+C_REL,
- /* 85 */ C_DATA66+C_REL,
- /* 86 */ C_DATA66+C_REL,
- /* 87 */ C_DATA66+C_REL,
- /* 88 */ C_DATA66+C_REL,
- /* 89 */ C_DATA66+C_REL,
- /* 8A */ C_DATA66+C_REL,
- /* 8B */ C_DATA66+C_REL,
- /* 8C */ C_DATA66+C_REL,
- /* 8D */ C_DATA66+C_REL,
- /* 8E */ C_DATA66+C_REL,
- /* 8F */ C_DATA66+C_REL,
- /* 90 */ C_MODRM,
- /* 91 */ C_MODRM,
- /* 92 */ C_MODRM,
- /* 93 */ C_MODRM,
- /* 94 */ C_MODRM,
- /* 95 */ C_MODRM,
- /* 96 */ C_MODRM,
- /* 97 */ C_MODRM,
- /* 98 */ C_MODRM,
- /* 99 */ C_MODRM,
- /* 9A */ C_MODRM,
- /* 9B */ C_MODRM,
- /* 9C */ C_MODRM,
- /* 9D */ C_MODRM,
- /* 9E */ C_MODRM,
- /* 9F */ C_MODRM,
- /* A0 */ 0,
- /* A1 */ 0,
- /* A2 */ 0,
- /* A3 */ C_MODRM,
- /* A4 */ C_MODRM+C_DATA1,
- /* A5 */ C_MODRM,
- /* A6 */ C_ERROR,
- /* A7 */ C_ERROR,
- /* A8 */ 0,
- /* A9 */ 0,
- /* AA */ 0,
- /* AB */ C_MODRM,
- /* AC */ C_MODRM+C_DATA1,
- /* AD */ C_MODRM,
- /* AE */ C_ERROR,
- /* AF */ C_MODRM,
- /* B0 */ C_MODRM,
- /* B1 */ C_MODRM,
- /* B2 */ C_MODRM,
- /* B3 */ C_MODRM,
- /* B4 */ C_MODRM,
- /* B5 */ C_MODRM,
- /* B6 */ C_MODRM,
- /* B7 */ C_MODRM,
- /* B8 */ C_ERROR,
- /* B9 */ C_ERROR,
- /* BA */ C_MODRM+C_DATA1,
- /* BB */ C_MODRM,
- /* BC */ C_MODRM,
- /* BD */ C_MODRM,
- /* BE */ C_MODRM,
- /* BF */ C_MODRM,
- /* C0 */ C_MODRM,
- /* C1 */ C_MODRM,
- /* C2 */ C_ERROR,
- /* C3 */ C_ERROR,
- /* C4 */ C_ERROR,
- /* C5 */ C_ERROR,
- /* C6 */ C_ERROR,
- /* C7 */ C_ERROR,
- /* C8 */ 0,
- /* C9 */ 0,
- /* CA */ 0,
- /* CB */ 0,
- /* CC */ 0,
- /* CD */ C_DATA1,
- /* CE */ 0,
- /* CF */ 0,
- /* D0 */ C_ERROR,
- /* D1 */ C_ERROR,
- /* D2 */ C_ERROR,
- /* D3 */ C_ERROR,
- /* D4 */ C_ERROR,
- /* D5 */ C_ERROR,
- /* D6 */ C_ERROR,
- /* D7 */ C_ERROR,
- /* D8 */ C_ERROR,
- /* D9 */ C_ERROR,
- /* DA */ C_ERROR,
- /* DB */ C_ERROR,
- /* DC */ C_ERROR,
- /* DD */ C_ERROR,
- /* DE */ C_ERROR,
- /* DF */ C_ERROR,
- /* E0 */ C_ERROR,
- /* E1 */ C_ERROR,
- /* E2 */ C_ERROR,
- /* E3 */ C_ERROR,
- /* E4 */ C_ERROR,
- /* E5 */ C_ERROR,
- /* E6 */ C_ERROR,
- /* E7 */ C_ERROR,
- /* E8 */ C_ERROR,
- /* E9 */ C_ERROR,
- /* EA */ C_ERROR,
- /* EB */ C_ERROR,
- /* EC */ C_ERROR,
- /* ED */ C_ERROR,
- /* EE */ C_ERROR,
- /* EF */ C_ERROR,
- /* F0 */ C_ERROR,
- /* F1 */ C_ERROR,
- /* F2 */ C_ERROR,
- /* F3 */ C_ERROR,
- /* F4 */ C_ERROR,
- /* F5 */ C_ERROR,
- /* F6 */ C_ERROR,
- /* F7 */ C_ERROR,
- /* F8 */ C_ERROR,
- /* F9 */ C_ERROR,
- /* FA */ C_ERROR,
- /* FB */ C_ERROR,
- /* FC */ C_ERROR,
- /* FD */ C_ERROR,
- /* FE */ C_ERROR,
- /* FF */ C_ERROR
- }; // ade32_table[]
- int disasm(BYTE* opcode0, disasm_struct* diza){
- BYTE* opcode = opcode0;
- memset(diza, 0x00, sizeof(disasm_struct));
- diza->disasm_defdata = 4;
- diza->disasm_defaddr = 4;
- if(*(WORD*)opcode == 0x0000)
- return 0;
- if(*(WORD*)opcode == 0xFFFF)
- return 0;
- DWORD flag = 0;
- repeat_prefix:
- BYTE c = *opcode++;
- DWORD t = ade32_table[ c ];
- if(t & C_ANYPREFIX){
- if(flag & t)
- return 0;
- flag |= t;
- if(t & C_67)
- diza->disasm_defaddr ^= 2^4;
- else if(t & C_66)
- diza->disasm_defdata ^= 2^4;
- else if(t & C_SEG)
- diza->disasm_seg = c;
- else if(t & C_REP)
- diza->disasm_rep = c;
- // LOCK
- goto repeat_prefix;
- } // C_ANYPREFIX
- flag |= t;
- diza->disasm_opcode = c;
- if(c == 0x0F){
- c = *opcode++;
- diza->disasm_opcode2 = c;
- flag |= ade32_table[256+c]; // 2nd flagtable half
- if(flag == C_ERROR)
- return 0;
- }else if(c == 0xF7){
- if(((*opcode) & 0x38) == 0)
- flag |= C_DATA66;
- }else if(c == 0xF6){
- if(((*opcode) & 0x38) == 0)
- flag |= C_DATA1;
- }else if(c == 0xCD){
- if(*opcode == 0x20)
- flag |= C_DATA4;
- }
- if(flag & C_MODRM){
- c = *opcode++;
- diza->disasm_modrm = c;
- if(((c & 0x38) == 0x20) && (diza->disasm_opcode == 0xFF))
- flag |= C_STOP;
- BYTE mod = c & 0xC0;
- BYTE rm = c & 0x07;
- if(mod != 0xC0){
- if(diza->disasm_defaddr == 4){
- if(rm == 4){
- flag |= C_SIB;
- c = *opcode++;
- diza->disasm_sib = c;
- rm = c & 0x07;
- }
- if(mod == 0x40)
- flag |= C_ADDR1;
- else if(mod == 0x80)
- flag |= C_ADDR4;
- else if (rm == 5)
- flag |= C_ADDR4;
- }else{ // MODRM 16-bit
- if(mod == 0x40)
- flag |= C_ADDR1;
- else if(mod == 0x80)
- flag |= C_ADDR2;
- else if(rm == 6)
- flag |= C_ADDR2;
- }
- }
- } // C_MODRM
- diza->disasm_flag = flag;
- DWORD a = flag & (C_ADDR1 | C_ADDR2 | C_ADDR4);
- DWORD d = (flag & (C_DATA1 | C_DATA2 | C_DATA4)) >> 8;
- if(flag & C_ADDR67)
- a += diza->disasm_defaddr;
- if(flag & C_DATA66)
- d += diza->disasm_defdata;
- diza->disasm_addrsize = a;
- diza->disasm_datasize = d;
- DWORD i;
- for(i = 0; i < a; i++)
- diza->disasm_addr_b[i] = *opcode++;
- for(i = 0; i < d; i++)
- diza->disasm_data_b[i] = *opcode++;
- diza->disasm_len = opcode - opcode0;
- return diza->disasm_len;
- } // disasm()
- int oplen(BYTE *opcode){
- disasm_struct diza;
- memset(&diza,0,sizeof(diza));
- disasm((BYTE*)opcode,&diza);
- if((diza.disasm_flag == C_ERROR) || ((diza.disasm_flag&C_STOP) == C_STOP) || ((diza.disasm_flag&C_REL)==C_REL) || ((diza.disasm_flag&C_BAD)==C_BAD))
- return -1;
- return diza.disasm_len;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement