Found this game with nice models and I would like to unpack the content that is stored in .kfs archive

site: https://yh.duoyi.com/
Sample: https://www.mediafire.com/file/pmhu3apann6su89/Model.kfs/file
Code: Select all
sub_417880((int)off_4224B0, dword_4224B8, (int)v8, v9, 0);
Code: Select all
int __cdecl sub_417880(int a1, int a2, int a3, int a4, int a5)
{
int v5; // edx
int i; // eax
v5 = a5 % a2;
for ( i = 0; i < a4; ++i )
{
*(_BYTE *)(i + a3) -= *(_BYTE *)(v5++ + a1);
if ( v5 >= a2 )
v5 = 0;
}
return 0;
}
Code: Select all
unsigned char lpKey[32] = {
0x5A, 0x2E, 0x6A, 0x5E, 0x65, 0x69, 0x68, 0x4C, 0x75, 0x69, 0x34, 0x65, 0x39, 0x32, 0x33, 0x40,
0x39, 0x31, 0x57, 0x6B, 0x42, 0x4E, 0x31, 0x39, 0x66, 0x5F, 0x33, 0x78, 0x3F, 0x55, 0x62, 0x71};
void iDecrypt(unsigned char* lpBuffer, int dwSize)
{
for (int i = 0; i < dwSize; ++i)
{
lpBuffer[i] -= lpKey[i % 32];
}
}
Code: Select all
fseek(fi, -16, SEEK_END);
Code: Select all
struct KFSHeader
{
uint32_t dwID; //0xFF0D2C3A
uint32_t dwTotalFiles;
uint32_t dwTableSize;
uint32_t dwTableOffset;
};
struct KFSEntry
{
uint16_t wFileNameLength; //shl 1 or *2 = as you wish :)
uint8_t bUnknown1; //0
uint32_t dwUnknown1; //1
uint32_t dwSize;
uint32_t dwZSize;
uint32_t dwOffset; //???? -> IMUL ECX,DWORD PTR DS:[EAX],0x9E3779B1 , AND ECX,0x7FFFFFFF
};