Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fcntl.h>
- #include <malloc.h>
- typedef struct{
- unsigned id;
- short padding;
- unsigned short len;
- unsigned unk;
- }TPAheader;
- typedef struct{
- unsigned id;
- unsigned size;
- unsigned offset;
- unsigned dummy;
- }FileEntry;
- typedef struct{
- unsigned id;//0xdec00400
- short unk;//0x0000
- short len;//0xf900
- unsigned unk2;//0x60c4 3800
- }PKHeader;
- typedef struct{
- unsigned id;//0xa24ac3d6
- unsigned short size;//0x0001
- unsigned short size2;//0x0000
- unsigned unk;//0x00000000
- unsigned unk2;//0x00000000
- }PKEntry;
- int main(int argc,char** argv){
- if(argc<2)return printf("missing arg");
- printf("opening %s...\n",argv[1]);
- FILE*fd=fopen(argv[1],"rb");
- if(fd<=0)return printf("file %s not found",argv[1]);
- TPAheader head;
- fread(&head,sizeof(head),1,fd);
- printf("%i files found\n",head.len);
- FileEntry ent;
- int i;
- for(i=0;i<head.len;i++){
- fread(&ent,sizeof(ent),1,fd);
- int pos=ftell(fd);
- char*p=malloc(ent.size);
- fseek(fd,ent.offset,SEEK_SET);
- fread(p,ent.size,1,fd);
- fseek(fd,pos,SEEK_SET);
- //printf("%08X @%08X (%i)\n",ent.id,ent.offset,ent.size);
- char fname[8+1+3+1],*ext=NULL;
- switch(*((int*)p)){
- case 0x46464952:ext="at3";break;//RIFF
- case 0x46465450:ext="pt";break;//PTFF
- case 0x0004c0de://no extention it will be a folder
- if(ent.id!=0x96E6F686)break;
- sprintf(fname,"%08X",ent.id);
- mkdir(fname);
- PKHeader*pk=(PKHeader*)p;
- printf(" <PKG [%08X]> %i\n",pk->id,pk->len);
- PKEntry*pke=(PKEntry*)(p+sizeof(PKHeader));
- for(;;){
- printf("[%08X](%i)\n",pke->size,pke->size);
- pke=pke+(pke->size+sizeof(PKEntry))/16;
- // printf(" | %08X %i\n",pke->id,pke->size);
- // pke=(PKEntry*)(pke->size+sizeof(PKEntry));
- // printf(" > %08X %i\n",pke->id,pke->size);
- break;
- }
- break;
- default :ext="unk";
- }
- if(ext){
- sprintf(fname,"%08X.%s",ent.id,ext);
- FILE*out=fopen(fname,"w+b");
- fwrite(p,ent.size,1,out);
- fclose(out);
- }
- free(p);
- }
- printf("%i files extracted!",i);
- fclose(fd);
- }
Add Comment
Please, Sign In to add comment