Advertisement
Riremito

Untitled

Oct 5th, 2014
605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.40 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. char Register[8][4] = {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"};
  5.  
  6. int ModRM(unsigned char *b){
  7.     unsigned char Mod = (b[1] >> 6) & 3;
  8.     unsigned char RO = (b[1] >> 3) & 7;
  9.     unsigned char RM = b[1] & 7;
  10.     unsigned long int disp32;
  11.     unsigned char disp8;
  12.     unsigned char SS = (b[2] >> 6) & 3;
  13.     unsigned char Index = (b[2] >> 3) & 7;
  14.     unsigned char Base = b[2] & 7;
  15.  
  16.     switch(Mod){
  17.     case 0:
  18.         switch(RM){
  19.         case 4:
  20.             disp32 = *(unsigned long int *)&b[3];
  21.             switch(SS){
  22.             case 0:
  23.                 printf("%s,[%08X+%s]", Register[RO], disp32, Register[Index]);
  24.                 break;
  25.             default:
  26.                 printf("%s,[%08X+%s*%02X]", Register[RO], disp32, Register[Index], (1 << SS));
  27.                 break;
  28.             }
  29.             return 6;
  30.         case 5:
  31.             disp32 = *(unsigned long int *)&b[2];
  32.             printf("%s,[%08X]", Register[RO], disp32);
  33.             return 5;
  34.         default:
  35.             printf("%s,[%s]", Register[RO], Register[RM]);
  36.             return 1;
  37.         }
  38.         printf("case 0");
  39.         break;
  40.     case 1:
  41.         switch(RM){
  42.         case 4:
  43.             disp8 = b[3];
  44.             switch(SS){
  45.             case 0:
  46.                 printf("%s,[ebp+%02X+%s]", Register[RO], disp8, Register[Index]);
  47.                 break;
  48.             default:
  49.                 printf("%s,[ebp+%02X+%s*%02X]", Register[RO], disp8, Register[Index], (1 << SS));
  50.                 break;
  51.             }
  52.             return 3;
  53.         default:
  54.             disp8 = b[2];
  55.             printf("%s,[%s+%02X]", Register[RO], Register[RM], disp8);
  56.             return 2;
  57.         }
  58.         printf("case 1");
  59.         break;
  60.     case 2:
  61.         switch(RM){
  62.         case 4:
  63.             disp32 = *(unsigned long int *)&b[3];
  64.             switch(SS){
  65.             case 0:
  66.                 printf("%s,[ebp+%08X+%s]", Register[RO], disp32, Register[Index]);
  67.                 break;
  68.             default:
  69.                 printf("%s,[ebp+%08X+%s*%02X]", Register[RO], disp32, Register[Index], (1 << SS));
  70.                 break;
  71.             }
  72.             return 6;
  73.         default:
  74.             disp32 = *(unsigned long int *)&b[2];
  75.             printf("%s,[%s+%08X]", Register[RO], Register[RM], disp32);
  76.             return 5;
  77.         }
  78.         printf("case 2");
  79.         break;
  80.     case 3:
  81.         printf("%s,%s", Register[RO], Register[RM]);
  82.         return 1;
  83.     }
  84. }
  85.  
  86.  
  87. unsigned char b[] = "\xEB\x48\x33\xC0\x03\xC2\x8B\x55\x18\x83\xE8\x08\x8B\x02\xC1\xE8\x08\x33\xC9\x8B\xC8\xC1\xE1\x08\x8B\x4D\x08\x03\x4D\xC8\x33\xD2\x8B\x5D\x08\x8A\x11\x80\xC2\x01\x8B\x4D\x18\x8B\x09\x80\xEA\x01\x33\xCA\x81\xE1\xFF\x00\x00\x00\x83\xF1\x16\x83\xF1\x16\x33\x04\x8D\xAC\xAD\xBC\x01\x8B\x55\x18\x89\x02\xE9\x9C\xFD\xFF\xFF";
  88.  
  89. int main(){
  90.  
  91.     for(int i=0; i<70; i++){
  92.         ModRM(&b[i]);
  93.         printf("\n");
  94.     }
  95.  
  96.  
  97.     system("pause");
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement