SHARE
TWEET

Auto Injector V2

a guest Mar 7th, 2011 82 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. int filesize( FILE * fp){
  7.         int sz = 0;
  8.         fseek(fp, 0L, SEEK_END);
  9.         sz = ftell(fp);
  10.         fseek(fp, 0L, SEEK_SET);
  11.         return sz;
  12. }
  13.  
  14. int GetFileNameDeb(FILE * fn, char ** filnamPtr){
  15.         int i = 0, nstart = 0, nsize = 0, next = 0, estart = 0, esize = 0;
  16.         char c = '0';
  17.         int tabarr[4] = {0,0,0,0};
  18.         char * filnam;
  19.  
  20.         if(*filnamPtr != NULL){free(*filnamPtr);}
  21.  
  22.         if(ftell(fn) > 0x143C0){return -1;}
  23.  
  24.         while(c != '\n'){
  25.                 fread(&c, 1, 1, fn);
  26.                 if((c == ' ') && (i < 4)){
  27.                         tabarr[i] = ftell(fn);
  28.                         i++;
  29.                 }
  30.         }
  31.  
  32.         next = ftell(fn);
  33.         nstart = tabarr[0];
  34.         nsize = tabarr[1]-tabarr[0]-1;
  35.         estart = tabarr[2];
  36.         esize = tabarr[3]-tabarr[2]-1;
  37.  
  38.         *filnamPtr = (char *) malloc(nsize+esize+1);
  39.  
  40.         filnam = *filnamPtr;
  41.  
  42.         fseek(fn, nstart, SEEK_SET);
  43.         fread(filnam, 1, nsize, fn);
  44.  
  45.         fseek(fn, estart, SEEK_SET);
  46.         fread(&(filnam[nsize]), 1, esize, fn);
  47.  
  48.         filnam[nsize+esize] = '\0';
  49.  
  50.         fseek(fn, next, SEEK_SET);
  51.  
  52.         if(filnam[nsize+esize-1] == 'e'){return 1;} else {return 0;}
  53. }
  54.  
  55. int FindTable(FILE * rom){
  56.  
  57.         int base = 0x7000, i=0, dummy = 0;
  58.         int check[5] = {0,0,0,0,0};
  59.         int littab[5] = {0, 0x60100000, 0, 0, 0x60100000};
  60.  
  61.         while(i < 5){
  62.  
  63.                 base += 0x10;
  64.  
  65.                 fseek(rom, base, SEEK_SET);
  66.                 dummy = fread(check,4,5,rom);
  67.  
  68.                 for(i=0;i<5;i++){
  69.                         if(check[i] != littab[i]){break;}
  70.                 }
  71.  
  72.                 if(base > 0x13000){
  73.                         base = 0;
  74.                         break;
  75.                 }
  76.         }
  77.  
  78.         return base;
  79. }
  80.  
  81. int SceneFix(FILE * scene, int RoomNo, int Offset1, int Offset2){
  82.  
  83.         int scenebase = 0, numrooms = 0, dummy = 0, OffsetTable = 0;
  84.  
  85.         if(scene == NULL){return -1;}
  86.  
  87.         fseek(scene, 0x09, SEEK_SET);
  88.         dummy = fread(&numrooms, 1, 1, scene);
  89.  
  90.         fseek(scene, 0x0E, SEEK_SET);
  91.         dummy = fread(&scenebase, 2, 1, scene);
  92.  
  93.         scenebase = _byteswap_ushort(scenebase);
  94.  
  95.         fseek(scene, scenebase + 8*RoomNo, SEEK_SET);
  96.         dummy = fread(&OffsetTable, 4, 1, scene);
  97.  
  98.         if(_byteswap_ulong(OffsetTable) != Offset1){
  99.                 printf("Unexpected end of scene\n\r");
  100.                 return 1;
  101.         }
  102.  
  103.         fseek(scene, scenebase + 8*RoomNo + 4, SEEK_SET);
  104.         dummy = fwrite(&Offset2, 4, 1, scene);
  105.  
  106.         if(RoomNo < numrooms-1){return 0;}
  107.  
  108.         return 1;
  109. }
  110.  
  111. void SceneInsert(FILE * scene, FILE * rom, int size, int offset){
  112.         int dummy = 0;
  113.         char * buffer = NULL;
  114.  
  115.         fseek(rom, offset, SEEK_SET);
  116.         fseek(scene, 0, SEEK_SET);
  117.  
  118.         buffer = (char *) malloc(size);
  119.  
  120.         dummy = fread(buffer, 1, size, scene);
  121.  
  122.         dummy = fwrite(buffer, 1, size, rom);
  123.  
  124.         free(buffer);
  125. }
  126.  
  127. int main(){
  128.         int fileindex = 0;
  129.         int offset1 = 0;
  130.         int offset2 = 0;
  131.         int injectsize = 0;
  132.         int injnum = 0;
  133.         int crccheck = 0;
  134.         int excess = 0;
  135.         int tablebase = 0;
  136.         int dummy = 0;
  137.         int status = 0;
  138.         int roomnum = 0;
  139.         int scenstat = 0;
  140.         int scenoff = 0;
  141.         int scensize = 0;
  142.         char * buffer = NULL;
  143.         char * filename = NULL;
  144.         FILE * currentscene = NULL;
  145.         FILE * rom = NULL;
  146.         FILE * injection = NULL;
  147.         FILE * fn = NULL;
  148.  
  149.         rom = fopen("ZELOOTMA.z64","rb+");
  150.         fn = fopen("DebugList.txt", "rb");
  151.  
  152.         if((rom == NULL)||(fn == NULL)){
  153.                 printf("Failed to open ROM or DebugList.txt\n\r");
  154.                 printf("Make sure your ROM is named ZELOOTMA.z64\n\r");
  155.                 goto end;
  156.         }
  157.        
  158.         fseek(fn, 0, SEEK_SET);
  159.  
  160.         printf("ROM and DebugList opened.\n\r");
  161.  
  162.         tablebase = FindTable(rom);
  163.  
  164.         if(tablebase == 0){
  165.                 printf("File table not found.");
  166.                 fclose(fn);
  167.                 fclose(rom);
  168.                 goto end;
  169.         }
  170.  
  171.         printf("File table found at %X\n\r", tablebase);
  172.  
  173.         for(fileindex = 0 ; fileindex < 1532; fileindex++){
  174.  
  175.                 status = GetFileNameDeb(fn, &filename);
  176.                 scenstat = 0;
  177.  
  178.                 if(status == -1){
  179.                         printf("Ran out of DebugList\n\r");
  180.                         goto end;
  181.                 }
  182.  
  183.                 injection = fopen(filename, "rb+");
  184.  
  185.                 if(injection == NULL){/*printf("Failed to open file %s %d",filename,fileindex);*/ continue;}
  186.  
  187.                 printf("%s  ", filename);
  188.  
  189.                 fseek(rom, tablebase + 16*fileindex, SEEK_SET);
  190.  
  191.                 printf("Table Slot %X\n\r", tablebase + 16*fileindex);
  192.  
  193.                 dummy = fread(&offset1, 4, 1, rom);
  194.  
  195.                 offset1 = _byteswap_ulong(offset1);
  196.                
  197.                 fseek(rom, 12, SEEK_CUR);
  198.  
  199.                 dummy = fread(&offset2, 4, 1, rom);
  200.  
  201.                 offset2 = _byteswap_ulong(offset2);
  202.  
  203.                 printf("Start %X End %X\n\r", offset1, offset2);
  204.  
  205.                 injectsize = filesize(injection);
  206.  
  207.                 excess = injectsize - (offset2 - offset1);
  208.  
  209.                 if( excess > 0 ){
  210.                         printf("%s is %X bytes too large to inject.\n\r", filename, excess);
  211.                         continue;
  212.                 }
  213.  
  214.                 offset2 = _byteswap_ulong(offset2 + excess);
  215.  
  216.                 printf("New End %X\n\r",_byteswap_ulong(offset2));
  217.  
  218.                 fseek(rom, tablebase + fileindex*16 + 4, SEEK_SET);
  219.  
  220.                 fwrite(&offset2, 4, 1, rom);
  221.  
  222.                 fseek(rom, offset1, SEEK_SET);
  223.  
  224.                 buffer = (char *) malloc(injectsize);
  225.  
  226.                 dummy = fread(buffer, 1, injectsize, injection);
  227.  
  228.                 dummy = fwrite(buffer, 1, injectsize, rom);
  229.  
  230.                 printf("%X bytes transferred\n\r\n\r", dummy);
  231.  
  232.                 free(buffer);
  233.  
  234.                 injnum++;
  235.  
  236.                 if(status != 1){dummy = fclose(injection);}else{printf("Scene not closed.\n\r\n\r");}
  237.  
  238.                 if(status == 1){
  239.                         if(currentscene != NULL){
  240.                                 SceneInsert(currentscene, rom, scensize, scenoff);
  241.  
  242.                                 dummy = fclose(currentscene);
  243.                                 currentscene = NULL;
  244.  
  245.                                 printf("Previous scene closed.\n\r\n\r");
  246.                         }
  247.  
  248.                         currentscene = injection;
  249.                         scensize = injectsize;
  250.                         scenoff = offset1;
  251.                         roomnum = -1;
  252.                 }
  253.  
  254.                 if((status != 1)&&(currentscene != NULL)){scenstat = SceneFix(currentscene, roomnum, offset1, offset2);}
  255.  
  256.                 roomnum++;
  257.  
  258.                 if(((scenstat == 1)||(roomnum > 32)) && (currentscene != NULL)){
  259.                         SceneInsert(currentscene, rom, scensize, scenoff);
  260.  
  261.                         dummy = fclose(currentscene);
  262.                         currentscene = NULL;
  263.  
  264.                         printf("Scene closed.\n\r\n\r");
  265.                 }
  266.         }
  267.        
  268.         if(injection != NULL){dummy = fclose(injection);}
  269.         if(currentscene != NULL){
  270.                 SceneInsert(currentscene, rom, scensize, scenoff);
  271.                 dummy = fclose(currentscene);
  272.         }
  273.         dummy = fclose(fn);
  274.         dummy = fclose(rom);
  275.  
  276.         printf("Injected %d files.  Now fix the CRC and you're done.\n\r", injnum);
  277.  
  278.         end:
  279.  
  280.         printf("AutoInjector program by petrie911.\n\r");
  281.         system("pause");
  282. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top