home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Quines / files / idx_switch.idc < prev    next >
Encoding:
Text File  |  2000-05-25  |  1.4 KB  |  60 lines

  1. // Make Indexed Jump Table
  2. // IDC Script for IDA Pro v3.84
  3. // written by Quine (quine@blacksun.res.cmu.edu)
  4. // visit Quine's IDA Page at http://surf.to/quine_ida
  5.  
  6.  
  7. #include <idc.idc>
  8.  
  9. static main () {
  10.     
  11.     auto base, count, offsets, lookup, index, dest, i, use_enum, _enum, enum_id, name, rc;
  12.     use_enum = 0;
  13.     lookup = Dfirst(ScreenEA());
  14.     if (lookup == BADADDR) {
  15.         Message("Bad lookup!\n");
  16.         return 0;
  17.     }
  18.     base = xtol(AskStr("0","Enter the case base number:"));
  19.     count = xtol(AskStr("0","Enter the count:"));
  20.     offsets = find_next_ijmp(ScreenEA());
  21.     if (offsets == BADADDR) {
  22.         Message("Couldn't find indexed jmp!\n");
  23.         return 0;
  24.     }
  25.  
  26.     _enum = AskStr("","Enter the ENUM name or hit enter to skip:");
  27.     if (_enum!="") {
  28.         enum_id = GetEnum(_enum);
  29.         if (enum_id == -1) {
  30.             Message("Bad enum!\n");
  31.             return 0;
  32.         }
  33.         use_enum = 1;
  34.     }
  35.     for (i=0; i<=count; i++) {
  36.         index = Byte(lookup+i);
  37.         dest = Dword(offsets+index*4);
  38.         if (use_enum) {
  39.             name = form("case %s:", GetConstName(GetConst(enum_id, base+i)));
  40.         } else {
  41.             name = form("case %x:", base+i);
  42.         }
  43.         if ((rc = RptCmt(dest)) != "") {
  44.             name = rc + "\n" + name;
  45.         }
  46.         MakeRptCmt(dest,name);
  47.     }
  48. }
  49.  
  50. static find_next_ijmp(ea) {
  51.     auto x;
  52.     for (x=0; x<10; x++) {
  53.         ea = NextNotTail(ea);
  54.         if ((isCode(GetFlags(ea))) && (GetMnem(ea) == "jmp") && (GetOpType(ea,0) == 2)) {
  55.             return Dfirst(ea);
  56.         }
  57.     }
  58.     return BADADDR;
  59. }
  60.