home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1999 April / macformat-075.iso / Resources / Anti-virus / AntiGax 1.3 / Source / AntigaxCommon.c < prev    next >
Encoding:
Text File  |  1998-10-10  |  3.1 KB  |  155 lines  |  [TEXT/CWIE]

  1. char RepairApp(short rev);
  2. Boolean DamagedApp(short rev);
  3. void DeadFile(void);
  4. void WriteString(short fie, uchar *str);
  5.  
  6.  
  7. extern FSSpec    *lantana;
  8. extern Boolean    check_only,    prevent_moves;
  9.  
  10. /* Returns 1 is/was infected, 0 for repaired, 1 not repairable */
  11. char RepairApp(short rev)
  12. {
  13. Handle    mdh,    menuh;
  14. Str255    stoop;
  15. ulong    ule;
  16. long    mdlen,    mdglobs,    l,    mdencend,    menusz;
  17. short    nmdf,    i,    menid,    mdid,    j;
  18. uchar    obka;
  19.  
  20.  
  21. UseResFile(rev);
  22.  
  23. nmdf=Count1Resources('MDEF');
  24. if(!nmdf) return 0;
  25.  
  26. for(i=0;i<nmdf;i++)
  27.     {
  28.     mdh=Get1IndResource('MDEF',i+1);
  29.     if(!mdh) continue;
  30.     
  31.     if( ((short*)(*mdh))[4] == 'JS' ) break;
  32.     }
  33.  
  34. if(i==nmdf) return 0;
  35.  
  36. GetResInfo(mdh,&mdid,&ule,stoop);
  37.     // WE don't give a Str63 or whatever the virus gives for the name arg in its call!
  38.  
  39. /* OK, we have a definitely infected app now */
  40.  
  41. if(check_only) return 1;
  42.  
  43. /* First find the char it's obfuscated with, and unobfuscate it */
  44. mdlen=GetHandleSize(mdh);
  45. mdglobs=mdlen-0x1E2;
  46. obka=*(mdglobs + 0x2A + *mdh);
  47.  
  48. mdencend=*(short*)(2+*mdh) + 2;
  49. for(l=0x0A;l<mdencend;l++) (*mdh)[l]^=obka;
  50.  
  51. /* now get the affected MENU id */
  52. menid=*(short*)(0x0A + *mdh);
  53.  
  54. /* make sure that menu is still there and full of f's ... more than it checks too */
  55. menuh=Get1Resource('MENU',menid);
  56. if(!menuh || *(long*)(*menuh)!='ffff')
  57.     {
  58.     DeadFile();
  59.     return -1;
  60.     }
  61.  
  62. /* now copy the proper data back into it */
  63. menusz=GetHandleSize(menuh);
  64. BlockMoveData(0x0A+*mdh,*menuh,menusz);
  65. ChangedResource(menuh);
  66.  
  67. /* Now find the lowest-ID menu which was using the virus MDEF as their MDEF and
  68. set them back to 0. There is a small chance this will make a menu using a custom
  69. MDEF which is in another file go back to using the std MDEF (if it installed at
  70. this ID), but these apps would have stuffed up completely when run as infected. */
  71.  
  72. nmdf=Count1Resources('MENU');
  73. menid=0x7FFF;    // works for them
  74. for(i=1;i<=nmdf;i++)
  75.     {
  76.     menuh=Get1IndResource('MENU',i);
  77.     if(!menuh) continue;
  78.     
  79.     if( ((short*)*menuh)[3]!=mdid )
  80.         {
  81.         // HPurge(menuh);
  82.         // we don't call HPurge any more as the resource might be in use.
  83.         continue;
  84.         }
  85.     
  86.     GetResInfo(menuh,&j,&ule,stoop);
  87.     if(menid>j) menid=j;
  88.     }
  89.  
  90. if(menid<0x7FFF)    // just ignore it if we didn't find one I think...
  91.     {
  92.     menuh=Get1Resource('MENU',menid);
  93.     ((short*)*menuh)[3]=0;
  94.     ChangedResource(menuh);
  95.     }
  96.  
  97. /* And finally, it's time to say goodbye to our favourite resource... */
  98. RemoveResource(mdh);
  99. DisposeHandle(mdh);
  100. UpdateResFile(rev);
  101. /* Good riddance! */
  102.  
  103. return 1;
  104. }
  105.  
  106. /* This should be called after RepairApp has given it a clean bill of health */
  107. Boolean DamagedApp(short rev)
  108. {
  109. Handle    meh;
  110. short    nmnu,    i;
  111.  
  112.  
  113. UseResFile(rev);
  114.  
  115. nmnu=Count1Resources('MENU');
  116. if(!nmnu) return 0;
  117.  
  118. for(i=0;i<nmnu;i++)
  119.     {
  120.     meh=Get1IndResource('MENU',i+1);
  121.     if(!meh) continue;
  122.     
  123.     /* Found one homeless corrupted menu.... */
  124.     if(*(long*)(*meh) == 'ffff')
  125.         {
  126.         if(!check_only) DeadFile();
  127.         return 1;
  128.         }
  129.     }
  130.  
  131. return 0;
  132. }
  133.  
  134. void DeadFile(void)
  135. {
  136. Str63    nuname;
  137.  
  138. if(prevent_moves) return;
  139.  
  140. BlockMoveData(lantana->name,nuname,64);
  141. BlockMoveData(".bad",&nuname[nuname[0]+1],4);    nuname[0]+=4;
  142. FSpRename(lantana,nuname);
  143. }
  144.  
  145.  
  146. void WriteString(short fie, uchar *str)
  147. {
  148. long    sz;
  149.  
  150. if(!fie || fie==-1) return;
  151.  
  152. sz=str[0];
  153. FSWrite(fie,&sz,str+1);
  154. }
  155.