Guest User

Untitled

a guest
Dec 11th, 2018
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. typedef struct _HEADER
  4. {
  5. char signature[0x2B];
  6. unsigned char xormask;
  7. unsigned int filecount;
  8. unsigned int indexoffset;
  9. } HEADER;
  10.  
  11. typedef struct _FILEINDEX
  12. {
  13. char filename[0x27];
  14. char addcrypt;
  15. unsigned int offset;
  16. unsigned int size;
  17. } FILEINDEX;
  18.  
  19. //changes string!
  20. char *ToUpper(char *s)
  21. {
  22. int i;
  23. for (i = 0 ; i < strlen(s); i ++ ) s[i]=toupper(s[i]);
  24. return s;
  25. }
  26.  
  27. void main (int argc, char *argv[])
  28. {
  29. HEADER head;
  30. FILE* in;
  31. int i,j;
  32. FILEINDEX* indexes;
  33.  
  34. if(argc < 3)
  35. {
  36. printf("CARNIVAL Script Dumper v0.01\n");
  37. printf("Usage: %s infile.pd OutDir\n",argv[0]);
  38. return;
  39. }
  40.  
  41.  
  42. if((in = fopen(argv[1],"rb"))==NULL)
  43. {
  44. printf("Failed opening input\n");
  45. return;
  46. }
  47.  
  48. fread(&head,sizeof(HEADER), 1, in);
  49. if (strncmp(head.signature,"Pack",4))
  50. {
  51. printf("Invalid signature.\n");
  52. return;
  53. }
  54.  
  55. fseek(in, head.indexoffset, SEEK_SET);
  56. indexes = (FILEINDEX*)malloc(head.filecount*sizeof(FILEINDEX));
  57. fread(indexes,sizeof(FILEINDEX),head.filecount,in);
  58.  
  59. mkdir(argv[2]);
  60. chdir(argv[2]);
  61.  
  62. for (i = 0; i < head.filecount; i++)
  63. {
  64. FILE* out;
  65. char *outbuff;
  66. indexes[i].size-=indexes[i].addcrypt;
  67. indexes[i].offset-=indexes[i].addcrypt;
  68. if ((out=fopen(indexes[i].filename, "wb"))==0)
  69. {
  70. printf("Failed opening output file %s\n",indexes[i].filename);
  71. continue;
  72. }
  73.  
  74. outbuff = (char*) malloc(indexes[i].size);
  75. fseek(in, indexes[i].offset, SEEK_SET);
  76. fread(outbuff, indexes[i].size, 1, in);
  77. if ((strstr(ToUpper(indexes[i].filename),".PNG")==0)&&
  78. (strstr(ToUpper(indexes[i].filename),".OGG")==0)
  79. )
  80. for (j = 0; j < indexes[i].size; j++) outbuff[j]^=head.xormask;
  81. fwrite(outbuff,indexes[i].size,1,out);
  82.  
  83. fclose(out);
  84. free(outbuff);
  85. }
  86. chdir("..");
  87. free(indexes);
  88. fclose(in);
  89. }
Advertisement
Add Comment
Please, Sign In to add comment