Riremito

x86 ModRM and SIB

Oct 5th, 2014
666
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.45 KB | None | 0 0
  1. //Created by Riremito
  2. char Register[8][4] = {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
  3.  
  4. int ModRM(unsigned char *b){
  5.     unsigned char Mod = (b[1] >> 6) & 3;
  6.     unsigned char RO = (b[1] >> 3) & 7;
  7.     unsigned char RM = b[1] & 7;
  8.     unsigned long int disp32;
  9.     unsigned char disp8;
  10.     unsigned char SS = (b[2] >> 6) & 3;
  11.     unsigned char Index = (b[2] >> 3) & 7;
  12.     unsigned char Base = b[2] & 7;
  13.  
  14.     switch(Mod){
  15.     case 0:
  16.         switch(RM){
  17.         case 4:
  18.             disp32 = *(unsigned long int *)&b[3];
  19.             switch(SS){
  20.             case 0:
  21.                 printf("%s,[%08X+%s]", Register[RO], disp32, Register[Index]);
  22.                 break;
  23.             case 1:
  24.                 printf("%s,[%08X+%s*2]", Register[RO], disp32, Register[Index]);
  25.                 break;
  26.             case 2:
  27.                 printf("%s,[%08X+%s*4]", Register[RO], disp32, Register[Index]);
  28.                 break;
  29.             case 3:
  30.                 printf("%s,[%08X+%s*8]", Register[RO], disp32, Register[Index]);
  31.                 break;
  32.             }
  33.             return 6;
  34.         case 5:
  35.             disp32 = *(unsigned long int *)&b[2];
  36.             printf("%s,[%08X]", Register[RO], disp32);
  37.             return 5;
  38.         default:
  39.             printf("%s,[%s]", Register[RO], Register[RM]);
  40.             return 1;
  41.         }
  42.         printf("case 0");
  43.         break;
  44.     case 1:
  45.         switch(RM){
  46.         case 4:
  47.             disp8 = b[3];
  48.             switch(SS){
  49.             case 0:
  50.                 printf("%s,[ebp+%02X+%s]", Register[RO], disp8, Register[Index]);
  51.                 break;
  52.             case 1:
  53.                 printf("%s,[ebp+%02X+%s*2]", Register[RO], disp8, Register[Index]);
  54.                 break;
  55.             case 2:
  56.                 printf("%s,[ebp+%02X+%s*4]", Register[RO], disp8, Register[Index]);
  57.                 break;
  58.             case 3:
  59.                 printf("%s,[ebp+%02X+%s*8]", Register[RO], disp8, Register[Index]);
  60.                 break;
  61.             }
  62.             return 3;
  63.         default:
  64.             disp8 = b[2];
  65.             printf("%s,[%s+%02X]", Register[RO], Register[RM], disp8);
  66.             return 2;
  67.         }
  68.         printf("case 1");
  69.         break;
  70.     case 2:
  71.         switch(RM){
  72.         case 4:
  73.             disp32 = *(unsigned long int *)&b[3];
  74.             switch(SS){
  75.             case 0:
  76.                 printf("%s,[ebp+%08X+%s]", Register[RO], disp32, Register[Index]);
  77.                 break;
  78.             case 1:
  79.                 printf("%s,[ebp+%08X+%s*2]", Register[RO], disp32, Register[Index]);
  80.                 break;
  81.             case 2:
  82.                 printf("%s,[ebp+%08X+%s*4]", Register[RO], disp32, Register[Index]);
  83.                 break;
  84.             case 3:
  85.                 printf("%s,[ebp+%08X+%s*8]", Register[RO], disp32, Register[Index]);
  86.                 break;
  87.             }
  88.             return 6;
  89.         default:
  90.             disp32 = *(unsigned long int *)&b[2];
  91.             printf("%s,[%s+%08X]", Register[RO], Register[RM], disp32);
  92.             return 5;
  93.         }
  94.         printf("case 2");
  95.         break;
  96.     case 3:
  97.         printf("%s,%s", Register[RO], Register[RM]);
  98.         return 1;
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment