Как зашифровать и расшифровать файлы .bmd в MU online на C++?

Автор DarkSim, 2012 Янв. 11, 21:33

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] mu onlinec++шифрование файлов

DarkSim

Пример паковки и распаковки .bmd файлов на C++, может кому и пригодиться.

.cpp
Спойлер
struct itemdata97
{
char cName[30];
unsigned char ucInt[34];
};

struct itemdatastruct97 //96y,97,98c
{
char cName[30];    //1ОпЖ·ГыіЖ
unsigned char ucHand;        //2 0µҐКЦЈ¬1Л«КЦ
unsigned char ucDroplv;    //3 ЛщµфОпЖ·µД№ЦОпµИј¶Level
unsigned char ucX;        //4 X,Y ЛщХјёсЧУ
unsigned char ucY;        //5
unsigned char ucDamMin;    //6 ЧоРЎ№Ґ»чБ¦
unsigned char ucDamMax;    //7 Чоґу№Ґ»чБ¦
unsigned char ucDefxx;    //8 ·АУщВК
unsigned char ucDef;        //9 ·АУщБ¦Def
unsigned char ucMagDef;    //10 00 MagDef Д§·Ё·АУщ?
unsigned char ucSpeed;    //11 №Ґ»чЛЩ¶И/»¤КЦµИКфРФ
unsigned char ucWalkSeed;    //12 WalkSpeed Р¬ЧУКфРФ
unsigned char ucDur;        //13 іЦѕГ¶И
unsigned char ucUnknown1;    //14 00
unsigned short usiReqStr; //15 Б¦Бї,ґЛБ¦Бї·ЗЛщЕеґшРиТЄБ¦Бї,КЗУРёцБ¦БїІОКэ*10 µГАґ /іэБЛ12ПоОпЖ·,ёГПоКЗЦ±ЅУ°ґЦµјЖЛг
unsigned short usiReqDex; //16 ГфЅЭ,ґЛБ¦Бї·ЗЛщЕеґшРиТЄГфЅЭ,КЗУРёцГфЅЭІОКэ*10 µГАґ /іэБЛ12ПоОпЖ·
//unsigned char ucUnknown2;  //17
//unsigned char ucUnknown3;      //18
unsigned char ucReqLev;    //19 ЧоРЎЕеґшОпЖ·µИј¶
unsigned char ucValue;        //20 14ПоОпЖ·јЖЛгјЫёсІОКэ
unsigned char ucUnknown4;    //21 ?Кй 12По·ЗБг
unsigned char ucUnknown5;        //22
unsigned char ucUnknown6;    //23 ? Кй ј«№вТФЙП·ЗБг
unsigned char ucUnknown7;    //24 00
unsigned char ucType1; //25 ?¶Ь04 ..·зН·04//Ч°±ёАа¶јОЄ04 ЖХНЁОдЖчµ¶ЅЈАа1 МмАЧ3,ВкСЕОдЖч0,№�еу2 ·ЁК¦ХИ03
unsigned char ucDs;        //26 ·ЁК¦
unsigned char ucDk;        //27 ХЅКї
unsigned char ucElf;        //28 ѕ«Бй
unsigned char ucMg;        //29 Д§ЅЈКї
unsigned char ucBing;        //30 ·А±щКфРФ
unsigned char ucDu;        //31 ·А¶ѕКфРФ
unsigned char ucLei;        //32 ·ААЧКфРФ
unsigned char ucHuo;        //33 ·А»рКфРФ
}; //64byte

void encryptItemBMD(const std::string& strSrcFilename, const std::string& strDestFilename)
{
CCsvFile csvFile;
if (csvFile.Open(strSrcFilename))
{
unsigned char buffer[512*64];
memset(buffer,0,512*64);
for (size_t i=0;i<512;++i)
{
itemdata97* pItem=(itemdata97*)(buffer+i*64);
itoa(i,pItem->cName,10);
}
while (csvFile.SeekNextLine())
{
int id = csvFile.GetInt(0)*32+csvFile.GetInt(1);
if (id>=512)
{
continue;
}
itemdata97* pItem=(itemdata97*)(buffer+id*64);
std::string strName = csvFile.GetStr(2);
strcpy(pItem->cName,strName.c_str());
for (size_t n=0;n<34;++n)
{
pItem->ucInt[n]=csvFile.GetInt(n+3);
}
}
csvFile.Close();
//
for (size_t i=0;i<512;++i)
{
decryptMuBufferXOR3(buffer+i*64,64);
}
DWORD dwCheck;
//
FILE* fp = fopen(strDestFilename.c_str(), "wb");
if (fp)
{
fwrite(buffer,512*64,1,fp);
fwrite(&dwCheck,4,1,fp);
fclose(fp);
}
}
}

void decryptItemBMD(const std::string& strSrcFilename, const std::string& strDestFilename)
{
FILE* fp = fopen(strSrcFilename.c_str(), "rb");
if (fp)
{
fseek(fp, 0, SEEK_END);
size_t size = ftell(fp);
fseek(fp, 0, SEEK_SET);
unsigned char* buffer = new unsigned char[size];
fread(buffer,size,1,fp);
fclose(fp);
fp = NULL;
for (size_t i=0;i<size/64;++i)
{
decryptMuBufferXOR3(buffer+i*64,64);
}

std::ofstream file;
file.open(strDestFilename.c_str(), std::ios::out);
if ( file.is_open() )
{
file << "·ЦЧй,ЛчТэ,ОпЖ·ГыіЖ,Л«КЦОдЖч,µф№ЦµИј¶,Хјёсїн¶И,ХјёсёЯ¶И,ЧоРЎ№Ґ»чБ¦,Чоґу№Ґ»чБ
¦,·АУщВК,·АУщБ¦,Д§·Ё·АУщ,№Ґ»чЛЩ¶И,Р¬ЧУКфРФ,ДНѕГ¶И,Д§·Ё№Ґ»чВК,Б¦БїРиЗу,ГфЅЭРиЗу,µИ
ј¶РиЗу,јЫёсІОКэ,Кй,22,Кйј«№вТФЙП·ЗБг,00,АаРН,9,9,9,9,·ЁК¦,ХЅКї,ѕ«Бй,Д§ЅЈКї,·А±щ,·
А¶ѕ,·ААЧ,·А»р"<< std::endl;
for (size_t i=0;i<size/64;++i)
{
itemdata97* pItem = (itemdata97*)(buffer+i*64);
if (strlen(pItem->cName)!=0)
{
file<<(i/32)<<","<<(i%32)<<","<<pItem->cName;
for (size_t n=0;n<34;++n)
{
file<<","<<(int)pItem->ucInt[n];
}
file<<std::endl;
}
}
}
file.close();

delete buffer;
}
}
[свернуть]

Функции
Спойлер
void decryptMuBufferXOR3(unsigned char* buffer, size_t size)
{
const unsigned char xorKeys[] = {0xFC, 0xCF, 0xAB};
for (size_t i=0; i<size; ++i)
{
*buffer ^= xorKeys[i%3];
buffer++;
}
}
void decryptMuFileXOR3(const std::string& strSrcFilename, const std::string& strDestFilename)
{
FILE* fp = fopen(strSrcFilename.c_str(), "rb");
if (fp)
{
fseek(fp, 0, SEEK_END);
size_t size = ftell(fp);
fseek(fp, 0, SEEK_SET);
unsigned char* buffer = new unsigned char[size];
fread(buffer,size,1,fp);
fclose(fp);
fp = NULL;
decryptMuBufferXOR3(buffer,size);
fp = fopen(strDestFilename.c_str(), "wb");
if (fp)
{
fwrite(buffer,size,1,fp);
fclose(fp);
}
delete buffer;
}
}
[свернуть]

Кредиты: Huihui Pan

Profesor08

а для Player.bmd нету случайно?

DarkSim

Profesor08
- нету, к сожалению)

Похожие темы (5)

Сообщений: 37
Просмотров: 22934

Сообщений: 127
Просмотров: 40407

Сообщений: 8
Просмотров: 7038