Exemplo n.º 1
0
int main(int argc, char *argv[])
{
	FILE *dcp,*ext;
	BYTE *compressed,*decompressed;
	unsigned long int num,tableOff,i,x,len,pointer,compsize,decsize;
	char *name;

	printf ("WinterMute Engine Unpacker by Vash v1.0.1 -vash.romhacking.it-\n\n");
	if (argc < 2) 
	{
		printf("DCP_Unpacker file.dcp\n");
		return(0);
	}

	dcp = fopen(argv[1],"rb");
	if (!dcp)
	{
		printf("Can't open %s\n",argv[1]);
		return(0);
	}

	fseek(dcp,0x80,SEEK_SET);
	fread(&tableOff,4,1,dcp);
	fseek(dcp,tableOff,SEEK_SET);
	len=fgetc(dcp);
	name=(char*)malloc(len);
	fread(name,len,1,dcp);
	_mkdir(name);
	_chdir(name);
	free(name);
	//if (ftell(dcp) % 2 != 0)
		fseek(dcp,0x01,SEEK_CUR);
	fread(&num,4,1,dcp);
	printf("Extracting %d files\n",num);
	printf("%X",ftell(dcp));
	for (i=0;i<num;i++)
	{
		len=fgetc(dcp);
		name=(char*)malloc(len);
		fread(name,len,1,dcp);
		for (x=0;x<len;x++)
		{
			name[x]=name[x]^0x44; //DirTree decrypted
		}
		ext=CreateDirTree(name);
		printf ("Extracing %s [%d on %d]\n",name,i+1,num);
		fread(&pointer,4,1,dcp);
		fread(&decsize,4,1,dcp);
		fread(&compsize,4,1,dcp);
		fseek(dcp,0x0C,SEEK_CUR); //gotta check this jump
		tableOff = ftell(dcp);
		fseek(dcp,pointer,SEEK_SET);
		if (compsize == 0x00) //not compressed
		{
			decompressed=(BYTE*)malloc(decsize);
			fread(decompressed,decsize,1,dcp);
			fwrite(decompressed,decsize,1,ext);
			free(decompressed);
		}else{
			decompressed=(BYTE*)malloc(decsize);
			compressed=(BYTE*)malloc(compsize);
			fread(compressed,compsize,1,dcp);
			uncompress(decompressed,&decsize,compressed,compsize);
			free(compressed);
			fwrite(decompressed,decsize,1,ext);
			free (decompressed);
		}
		free(name);
		fclose(ext);
		fseek(dcp,tableOff,SEEK_SET);
		//system("pause");
	}
}
/* CreateDirTree
 * ----------------------------------------------------------------------------
 */
UINT CFolderDialog::CreateDirTree(CHAR CONST *pPath, UINT uPos, BOOL bDirOnly)
{
    CHAR pBuffer[MAX_PATH];
    UINT uStart = uPos;

    BOOL bUNC = FALSE;

    if (pPath[uPos] == '\\' && pPath[uPos + 1] == '\\')
    {
        uPos++;
        uPos++;

        bUNC = TRUE;
    }
    else if (pPath[uPos] == '\\')
    {
        uPos++;
        uStart++;
    }

    if (pPath[uPos] == '\0')
    {
        return TRUE;
    }

    for ( ; pPath[uPos] != '\0' && pPath[uPos] != '\\'; uPos++)
    {
        ;
    }

    if (bUNC == TRUE && pPath[uPos] != '\0')
    {
        uPos++;
        for ( ; bUNC == TRUE && pPath[uPos] != '\0' && pPath[uPos] != '\\'; uPos++)
        {
            ;
        }
    }

    if (pPath[uPos] == '\0' && bDirOnly == FALSE)
    {
        return TRUE;
    }

    memcpy(pBuffer, pPath + uStart, uPos - uStart);
    pBuffer[uPos - uStart] = '\0';

    if (pBuffer[1] == ':')
    {
        // Drive spec.
        pBuffer[2] = '\\';
        pBuffer[3] = '\0';
    }
    else if (bUNC == FALSE)
    {
        // Path
        _mkdir(pBuffer);
    }

    if (_chdir(pBuffer) != 0)
    {
        return FALSE;
    }

    return CreateDirTree(pPath, uPos, bDirOnly);
}