https://play.google.com/store/apps/deta ... oent.gb_en
Hi, I need help with extracting models from this game. I've tried other scripts sadly none of them can open the .arc file

Sample:
https://mega.nz/#!TBhUQAaY!3i91OSXytyX5 ... bgl5O3Om1k
aluigi wrote:The DFL file only contains the list of files in the archive folder.
The arc files are archives, "ARCC" header, but their content seems obfuscated probably with blowfish.
Don't have ways to know key/algorithm without working on the game (I can't now).
Code: Select all
/* rJson::load(MtStream&) */
bool __thiscall rJson::load(rJson *this,MtStream *param_1)
{
uint uVar1;
uchar *puVar2;
uchar *puVar3;
int iVar4;
int iVar5;
int iVar6;
bool bVar7;
MtDataReader aMStack1240 [24];
MtMemoryStream aMStack1216 [24];
MtDataReader aMStack1192 [4];
int *local_4a4;
MtDataWriter aMStack1168 [808];
MtCipher aMStack360 [320];
int iStack40;
iStack40 = (int)__stack_chk_guard;
MtDataReader::MtDataReader(aMStack1192,param_1,0x1000);
uVar1 = (**(code **)(*local_4a4 + 0x48))();
puVar2 = (uchar *)(**(code **)(**(int **)(MtMemory::mpInstance + 0x128) + 0x1c))
(*(int **)(MtMemory::mpInstance + 0x128),uVar1,0x10);
puVar3 = (uchar *)(**(code **)(**(int **)(MtMemory::mpInstance + 0x128) + 0x1c))
(*(int **)(MtMemory::mpInstance + 0x128),uVar1 + 0x400,0x10);
MtDataReader::read(aMStack1192,puVar2,uVar1);
MtCipher::MtCipher(aMStack360);
MtCipher::setKeyString(aMStack360,"VMmpt7L9vQE8");
MtCipher::initializeBF(aMStack360);
MtCipher::decryptBF(aMStack360,puVar2,puVar3,uVar1);
MtMemoryStream::MtMemoryStream(aMStack1216,puVar3,uVar1,3);
MtDataReader::MtDataReader(aMStack1240,(MtStream *)aMStack1216,0x1000);
iVar4 = MtDataReader::readU32(aMStack1240);
iVar5 = MtDataReader::readU32(aMStack1240);
MtDataReader::readU32(aMStack1240);
if (iVar4 == 0x4e4f534a) {
MtDataWriter::MtDataWriter(aMStack1168,(MtStream *)aMStack1216,uVar1,0x1000);
*(undefined4 *)(puVar3 + 4) = 0;
iVar4 = MtCRC::getCRC(puVar3,uVar1,0xffffffff);
if (iVar4 != iVar5) {
MtDebug::crashLog((MtDebug *)MtDebug::mInstance,
"C:\\app\\jenkins\\workspace\\guns_android_na\\BNE\\client\\App\\AndroidGUNSBoot\\guns\\src\\resource\\json\\rJson.cpp"
,0x9d,"E",&DAT_01380819);
}
else {
iVar6 = MtDataReader::getPosition(aMStack1240);
MtString::operator=((MtString *)(this + 0xa0),(char *)(puVar3 + iVar6));
(**(code **)(**(int **)(MtMemory::mpInstance + 0x128) + 0x28))
(*(int **)(MtMemory::mpInstance + 0x128),puVar2);
(**(code **)(**(int **)(MtMemory::mpInstance + 0x128) + 0x28))
(*(int **)(MtMemory::mpInstance + 0x128),puVar3);
}
bVar7 = iVar4 == iVar5;
MtDataWriter::~MtDataWriter(aMStack1168);
}
else {
MtDebug::crashLog((MtDebug *)MtDebug::mInstance,
"C:\\app\\jenkins\\workspace\\guns_android_na\\BNE\\client\\App\\AndroidGUNSBoot\\guns\\src\\resource\\json\\rJson.cpp"
,0x93,"E",&DAT_013807e1);
bVar7 = false;
}
MtDataReader::~MtDataReader(aMStack1240);
MtMemoryStream::~MtMemoryStream(aMStack1216);
MtCipher::~MtCipher(aMStack360);
MtDataReader::~MtDataReader(aMStack1192);
if ((int)__stack_chk_guard != iStack40) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return bVar7;
}
Code: Select all
/* MtCipher::MtCipher() */
MtCipher * __thiscall MtCipher::MtCipher(MtCipher *this)
{
undefined4 uVar1;
MtBigInt *this_00;
MtBigInt *this_01;
MtBigInt aMStack232 [64];
MtBigInt aMStack168 [64];
MtBigInt aMStack104 [68];
int local_24;
this_01 = (MtBigInt *)(this + 0xc);
local_24 = (int)__stack_chk_guard;
this_00 = (MtBigInt *)(this + 0x4c);
*(undefined ***)this = &PTR_~MtCipher_01526180;
MtBigInt::MtBigInt(this_01);
MtBigInt::MtBigInt(this_00);
MtBigInt::MtBigInt((MtBigInt *)(this + 0x8c));
MtBigInt::MtBigInt((MtBigInt *)(this + 0xcc));
setKeyString(this,"mofumofu capcom(^-^)");
MtBigInt::MtBigInt(aMStack104,"0x0001bed0dbf11fc0420c3d83");
__aeabi_memcpy(this_01,aMStack104,0x40);
MtBigInt::MtBigInt(aMStack104,"0x000064aa206d48ff5be4a9c3");
__aeabi_memcpy(this_00,aMStack104,0x40);
MtBigInt::MtBigInt(aMStack104,"0x00026063");
__aeabi_memcpy((MtBigInt *)(this + 0xcc),aMStack104,0x40);
MtBigInt::MtBigInt(aMStack168,this_00);
MtBigInt::operator*(aMStack104,SUB41(this_01,0));
__aeabi_memcpy((MtBigInt *)(this + 0x8c),aMStack104,0x40);
MtBigInt::MtBigInt(aMStack232,this_00);
MtBigInt::operator*(aMStack104,SUB41(this_01,0));
uVar1 = MtBigInt::getUsedByteSize(aMStack104);
*(undefined4 *)(this + 0x10c) = uVar1;
*(undefined4 *)(this + 0x110) = 0;
*(undefined4 *)(this + 0x114) = 0;
if ((int)__stack_chk_guard != local_24) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return this;
}
chrrox wrote:Possible code for blowfish.
[/code]
Code: Select all
cQuickSortFilter * __thiscall cQuickSortFilter::cQuickSortFilter(cQuickSortFilter *this)
{
undefined4 *puVar1;
int iVar2;
cQuickSavedata::cQuickSavedata((cQuickSavedata *)this,"PCr7RXW09R2rRmDy",10);
iVar2 = 0x27;
puVar1 = (undefined4 *)(this + 0x10);
*(undefined ***)this = &PTR_~cQuickSortFilter_014eba34;
do {
puVar1[-1] = &PTR_~FilterData_014eba84;
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = &PTR_~MtObject_014ebab0;
__aeabi_memclr4(puVar1 + 3,0x6c);
iVar2 = iVar2 + -1;
puVar1 = puVar1 + 0x1f;
} while (iVar2 != 0);
initDefaultSort(this);
initDefaultFilter(this);
*(uint *)(this + 0x98) = *(uint *)(this + 0x98) | 1;
*(uint *)(this + 0x114) = *(uint *)(this + 0x114) | 1;
*(uint *)(this + 0x950) = *(uint *)(this + 0x950) | 1;
cQuickSavedata::load((cQuickSavedata *)this);
return this;
}
cQuickSortFilter * __thiscall cQuickSortFilter::cQuickSortFilter(cQuickSortFilter *this)
{
undefined4 *puVar1;
int iVar2;
cQuickSavedata::cQuickSavedata((cQuickSavedata *)this,"PCr7RXW09R2rRmDy",10);
iVar2 = 0x27;
puVar1 = (undefined4 *)(this + 0x10);
*(undefined ***)this = &PTR_~cQuickSortFilter_014eba34;
do {
puVar1[-1] = &PTR_~FilterData_014eba84;
*puVar1 = 0;
puVar1[1] = 0;
puVar1[2] = &PTR_~MtObject_014ebab0;
__aeabi_memclr4(puVar1 + 3,0x6c);
iVar2 = iVar2 + -1;
puVar1 = puVar1 + 0x1f;
} while (iVar2 != 0);
initDefaultSort(this);
initDefaultFilter(this);
*(uint *)(this + 0x98) = *(uint *)(this + 0x98) | 1;
*(uint *)(this + 0x114) = *(uint *)(this + 0x114) | 1;
*(uint *)(this + 0x950) = *(uint *)(this + 0x950) | 1;
cQuickSavedata::load((cQuickSavedata *)this);
return this;
}
chrrox wrote:You can try following this code
https://gitlab.com/svanheulen/mhff/-/bl ... ds/arcc.py
or info on this post
viewtopic.php?t=1684