[Мануал] Распаковка пака игры
В паке игры ( файл game_pak ) содержаться :
текстуры, видео, озвучка, база данных игры и т.п. для распаковки нам понадобиться утилита QuickBMS офф сайт : http://aluigi.altervista.org/quickbms.htm прямой линк на скачку : http://aluigi.altervista.org/papers/quickbms.zip также понадобиться скрипт для распаковки прямой линк на скачку : http://aluigi.altervista.org/papers/...s/archeage.bms скрипт ложим в папку с утилитой QuickBMS Как использовать:Развернуть ↓PS. База данных игры достается закриптованная, ее распаковка это отдельная тема. |
Re: [Мануал] Распаковка пака игры
|
Re: [Мануал] Распаковка пака игры
в самом файле паке есть контрольные байты (зашифрованы) те самые WIBO которые ищет распаковщик.
т.к. нет полного лога работы программы могу сделать 2 предположения: 1. не правильно указан путь к паку, или пытаетесь раскрыть не тот файл. 2. ключ распаковки encryption aes_128_cbc "\x32\x1F\x2A\xEE\xAA\x58\x4A\xB4\x9A\x6C\x9E\x09\ xD5\x9E\x9C\x6F" поменяли. |
Re: [Мануал] Распаковка пака игры
Цитата:
|
Re: [Мануал] Распаковка пака игры
Цитата:
2.Можешь хотя бы написать примерный алгоритм действий по пунктам? |
Re: [Мануал] Распаковка пака игры
Цитата:
2. тут все просто а) находим ключ крипта файла базы данных. б) в скрипте из первого поста находим и заменяем: это Цитата:
Цитата:
в) распаковываем базу методом из первого поста. г) открываем базу например программой Navicat |
Re: [Мануал] Распаковка пака игры
А сколько примерно весят файлы после распаковки? Меня смущают распакованные файлы размером всего 6 гигов
|
Re: [Мануал] Распаковка пака игры
Примерно не меньше, чем исходный файл.
Я когда пытался QuickBMS распаковать, он у меня падал где-то в районе 5-6 гигов с ошибкой. Я забил и сделал утилиту для просмотра содержимого без распаковки всего файла. |
Re: [Мануал] Распаковка пака игры
Цитата:
|
Re: [Мануал] Распаковка пака игры
Обратите внимание на небольшой подарок от корейцев - файлик xlpack.dll.
Мейловский игровой центр скачивает его при проверке клиента и заботливо удаляет после. Думаю комментарии к секции экспорта для этой библиотеки не нужны :) PS. Базу всё равно надо распаковывать отдельно. |
Re: [Мануал] Распаковка пака игры
Цитата:
Цитата:
Код:
quickbms_4gb_files -f "*.sqlite3" ArcheAge.bms "d:\Games\ArcheAge\game_pak" "d:\Games\game_pak" |
Re: [Мануал] Распаковка пака игры
Возможности этой либы намного шире. :)
|
Re: [Мануал] Распаковка пака игры
Цитата:
|
Re: [Мануал] Распаковка пака игры
|
Re: [Мануал] Распаковка пака игры
Цитата:
Цитата:
|
Re: [Мануал] Распаковка пака игры
Это небольшая командная оболочка над функциями библиотеки.
Список файлов, копирование, отображение. |
Re: [Мануал] Распаковка пака игры
По просьбам трудящихся, исходник представленного на скрине шела.
Код кривоват. Английский скорее всего тоже. Не стоит бездумно копировать код в свои утилиты ;) В таком варианте гдето память течёт при копировании большого количества файлов. #include <iostream> #include <vector> #include <string> #include <sstream> #include <windows.h> using namespace std; const char* libname = "xlpack.dll"; const char* pck_name = "game_pak"; const char* masterfs = "/master"; const char* realfs = "/fs"; typedef void* File; typedef void* findstruct; typedef void __cdecl (*loghandler)(const char *val, ...); void __cdecl (*SetFileLogHandler)(char const* filename, loghandler lh); void __cdecl (*CreateFileSystem)(void); void __cdecl (*DestroyFileLogHandler)(void *); void __cdecl (*DestroyFileSystem)(void); void __cdecl (*CreatePak)(const char* filename, bool xz); File * __cdecl(*lib_FOpen)(const char* filename, const char* filemode); void __cdecl(*lib_FClose)(File *f); int __cdecl(*lib_FEof)(File *f); int __cdecl(*lib_GetC)(File *f); void * __cdecl(*mount)(char const* filepath, char const* filename, bool writeble); int __cdecl(*umount)(const char * mountpath); int __cdecl(*copydir)(const char * from, const char * to); int __cdecl(*copyfile)(const char * from, const char * to); int __cdecl(*findfirst)(char const * param, findstruct st); int __cdecl(*findnext)(int serchHandle, findstruct st); int __cdecl(*findclose)(int serchHandle); bool __cdecl(*IsDirectory)(findstruct st); bool __cdecl(*IsFileExist)(const char* filename); const char * __cdecl(*GetFileName)(findstruct st); HINSTANCE xlpack; string globalpath; enum ConsoleColor { Black = 0, Blue = 1, Green = 2, Cyan = 3, Red = 4, Magenta = 5, Brown = 6, LightGray = 7, DarkGray = 8, LightBlue = 9, LightGreen = 10, LightCyan = 11, LightRed = 12, LightMagenta = 13, Yellow = 14, White = 15 }; void SetColor(ConsoleColor text, ConsoleColor background) { HANDLE hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsoleHandle, (WORD)((background << 4) | text)); } void __cdecl log(const char *val, ...){ SetColor(LightCyan, Black); cout << val; SetColor(LightGray, Black); } bool fillMethod(string basepath){ string fulllibname = basepath + libname; cout << "load " << fulllibname << "..." << endl; xlpack = LoadLibrary(fulllibname.c_str()); if (xlpack){ cout << "lib loaded" << endl; CreateFileSystem = (void (__cdecl *)(void)) GetProcAddress(xlpack, "?CreateFileSystem@@YA_NXZ"); if (NULL == CreateFileSystem) return false; SetFileLogHandler = (void (__cdecl *)(char const* a, loghandler b)) GetProcAddress(xlpack, "?SetFileLogHandler@@YAPAXPBDP6AX0ZZ@Z"); if (NULL == SetFileLogHandler) return false; DestroyFileLogHandler = (void (__cdecl *)(void *)) GetProcAddress(xlpack, "?DestroyFileLogHandler@@YAXPAX@Z"); if (NULL == DestroyFileLogHandler) return false; DestroyFileSystem = (void (__cdecl *)(void)) GetProcAddress(xlpack, "?DestroyFileSystem@@YAXXZ"); if (NULL == DestroyFileSystem) return false; CreatePak = (void (__cdecl *)(const char* filename, bool readonly)) GetProcAddress(xlpack, "?CreatePak@@YA_NPBD_N@Z"); if (NULL == CreatePak) return false; mount = (void * (__cdecl *)(char const* filename, char const* filepath, bool mode)) GetProcAddress(xlpack, "?Mount@@YAPAXPBD0_N@Z"); if (NULL == mount) return false; umount = (int (__cdecl *)(const char * mp)) GetProcAddress(xlpack, "?Unmount@@YA_NPBD@Z"); if (NULL == umount) return false; copydir = (int (__cdecl *)(const char * filename, const char * filepath)) GetProcAddress(xlpack, "?CopyDir@@YA_NPBD0@Z"); if (NULL == copydir) return false; copyfile = (int (__cdecl *)(const char * filename, const char * filepath)) GetProcAddress(xlpack, "?Copy@@YA_NPBD0@Z"); if (NULL == copyfile) return false; lib_FOpen = (File * (__cdecl*)(const char* filename, const char* filemode)) GetProcAddress(xlpack, "?FOpen@@YAPAUFile@@PBD0@Z"); if (NULL == lib_FOpen) return false; lib_FClose = (void (__cdecl *)(File * f)) GetProcAddress(xlpack, "?FClose@@YAXAAPAUFile@@@Z"); if (NULL == lib_FClose) return false; lib_FEof = (int (__cdecl *)(File * f)) GetProcAddress(xlpack, "?FEof@@YAHPAUFile@@@Z"); if (NULL == lib_FEof) return false; lib_GetC = (int (__cdecl *)(File * f)) GetProcAddress(xlpack, "?Getc@@YAHPAUFile@@@Z"); if (NULL == lib_GetC) return false; findfirst = (int (__cdecl *)(char const * param, findstruct st)) GetProcAddress(xlpack, "?FindFirst@@YAHPBDPAUafs_finddata@@@Z"); if (NULL == findfirst) return false; findnext = (int (__cdecl *)(int serchHandle, findstruct st)) GetProcAddress(xlpack, "?FindNext@@YAHHPAUafs_finddata@@@Z"); if (NULL == findnext) return false; findclose = (int (__cdecl *)(int serchHandle)) GetProcAddress(xlpack, "?FindClose@@YAHH@Z"); if (NULL == findclose) return false; IsDirectory = (bool (__cdecl *)(findstruct st)) GetProcAddress(xlpack, "?IsDirectory@@YA_NPBUafs_finddata@@@Z"); if (NULL == IsDirectory) return false; IsFileExist = (bool (__cdecl *)(const char * filename)) GetProcAddress(xlpack, "?IsFileExist@@YA_NPBD@Z"); if (NULL == IsFileExist) return false; GetFileName = (const char * (__cdecl *)(findstruct st)) GetProcAddress(xlpack, "?GetFileName@@YAPBDPBUafs_finddata@@@Z"); if (NULL == GetFileName) return false; CreateFileSystem(); string logfile = basepath + libname + ".log"; SetFileLogHandler(logfile.c_str(), &log); return true; } return false; } void freelib() { DestroyFileLogHandler(NULL); DestroyFileSystem(); cout << "unload lib ..." << endl; FreeLibrary(xlpack); cout << "end" << endl; } findstruct makefs(){ char *buf = new char[100]; for (int i = 0; i < 100; ++i) buf[i] = 0; return buf; } void freefs(findstruct fs){ delete[] fs; } void createPCK(string base){ string full_pck_name = base + pck_name; cout << "Create pck" << endl; CreatePak(full_pck_name.c_str(), true); cout << "mount fs" << endl; void * ret = mount("/master", full_pck_name.c_str(), true); ret = mount("/origin", base.c_str(), true); cout << "copy to fs" << endl; int iret = copydir( "/origin/pck_tool", "/master/pcktoo"); if (iret) cout << "copy ok" << endl; cout << "umount" << endl; int umret = umount("/master"); if (umret) cout << "umount ok" << endl; } bool mountBase(string base){ string full_pck_name = base + pck_name; cout << "mount " << base << " to " << realfs << endl; void * ret = mount(realfs, base.c_str(), true); if (NULL == ret) return false; cout << "readonly mount " << full_pck_name << " to " << masterfs << endl; ret = mount(masterfs, full_pck_name.c_str(), false); if (NULL == ret){ SetColor(LightRed, Black); cout << "Bad pck file " << full_pck_name << endl; SetColor(LightGray, Black); return false; } return true; } void umountBase(){ umount(masterfs); umount(realfs); } vector<string> &split(const string &s, char delim, vector<string> &elems) { stringstream ss(s); string item; while (getline(ss, item, delim)) { elems.push_back(item); } return elems; } vector<string> split(const string &s, char delim) { vector<string> elems; split(s, delim, elems); return elems; } string extractFilePath(const string base){ if (base.compare("/") == 0) return base; unsigned found = base.find_last_of("/\\"); return base.substr(0, found + 1); } string extractFileDir(const string base){ if (base.compare("/") == 0) return base; unsigned found = base.find_last_of("/\\"); return base.substr(0, found); } string absolutePath(const string path){ if (path.size() == 0) return globalpath; if (path.at(0) == '/' || path.at(0) == '\\') return path; if (path.size() == 1 && path.at(0) == '.') return globalpath; string base, relative; base = extractFileDir(globalpath); relative = path; while (relative.substr(0,2).compare("..") == 0){ base = extractFileDir(base); if (relative.size() < 3) relative = ""; else relative = relative.substr(3, relative.size() - 3); } return base + "/" + relative; } void cd(string path){ globalpath = absolutePath(path); if (globalpath.at(globalpath.size() - 1) != '/' && globalpath.at(globalpath.size() - 1) != '\\') globalpath += '/'; } void ls(string path){ if (path.compare("/") == 0) { SetColor(LightBlue, Black); cout << masterfs << " " << realfs << endl; SetColor(LightGray, Black); return; } path = absolutePath(path);// + "*"; cout << path << endl; if (path.at(path.size() - 1) == '/') path += "*"; findstruct fs = makefs(); int findhandle = findfirst(path.c_str(), fs); if (findhandle != -1){ int find; do{ if (IsDirectory(fs)) SetColor(LightBlue, Black); else SetColor(White, Black); cout << GetFileName(fs) << " "; find = findnext(findhandle, fs); }while(find != -1); findclose(findhandle); } else cout << "empty"; cout << endl; SetColor(LightGray, Black); freefs(fs); } void checkPath(string absolutePath, bool &exist, bool &dir){ exist = IsFileExist(absolutePath.c_str()); if (exist){ dir = false; return; } findstruct fs = makefs(); int findhandle = findfirst(absolutePath.c_str(), fs); exist = (findhandle != -1); dir = exist; // не сработает для пустых каталогов. findclose(findhandle); freefs(fs); } void cp(string src, string dest){ src = absolutePath(src); dest = absolutePath(dest); SetColor(White, Black); bool isExist = false, isDir = false; checkPath(src, isExist, isDir); if (!isExist){ cout << "bad source path: " << src << endl; SetColor(LightGray, Black); return; } if (isDir){ cout << "copy catalog " << src << " to " << dest << endl; copydir(src.c_str(), dest.c_str()); }else{ cout << "copy file " << src << " to " << dest << endl; copyfile(src.c_str(), dest.c_str()); } SetColor(LightGray, Black); } void cat(string path){ path = absolutePath(path); bool isExist, isDir; checkPath(path, isExist, isDir); SetColor(White, Black); if (!isExist){ cout << "bad path" << endl; SetColor(LightGray, Black); return; } if (isDir){ cout << "directory" << endl; SetColor(LightGray, Black); return; } File *f = lib_FOpen(path.c_str(), "r"); while (!lib_FEof(f)){ cout << (char) lib_GetC(f); } cout <<endl; SetColor(LightGray, Black); } void help(){ cout << "Arhe age game arhive shell" << endl; SetColor(White, Black); cout << "\thelp\t"; SetColor(LightGray, Black); cout << "show this message" << endl; SetColor(White, Black); cout << "\tls <path>\t"; SetColor(LightGray, Black); cout << "show file list" << endl; SetColor(White, Black); cout << "\tcd path\t"; SetColor(LightGray, Black); cout << "change catalog" << endl; SetColor(White, Black); cout << "\tcp src dest\t"; SetColor(LightGray, Black); cout << "copy file or catalog. Destination only /fs/" << endl; SetColor(White, Black); cout << "\tq\t"; SetColor(LightGray, Black); cout << "exit" << endl; } void parsecmd(const string &cmd){ std::vector<std::string> x; split(cmd, ' ', x); if (x.size() >= 1){ if (x.at(0).compare("help") == 0) help(); if (x.at(0).compare("ls") == 0){ if (x.size() >= 2) ls(x.at(1)); else ls(globalpath); } if (x.at(0).compare("cd") == 0 && (x.size() >= 2)) cd(x.at(1)); if (x.at(0).compare("cp") == 0 ){ if (x.size() == 3) cp(x.at(1), x.at(2)); else { SetColor(White, Black); cout << "usage: cp source destination \ndestination only in " << realfs << endl; SetColor(LightGray, Black); } } if (x.at(0).compare("cat") == 0 && (x.size() >= 2)) cat(x.at(1)); } } int main(int argc, char** argv) { globalpath = string(masterfs) + "/"; string workdir = extractFilePath(string(argv[0])); if (fillMethod(workdir)){ //createPCK(workdir); if (mountBase(workdir)){ help(); string cmd; for (;;){ cout << globalpath << " :> "; getline(cin, cmd); if (cmd.compare("q") == 0) break; parsecmd(cmd); } umountBase(); } freelib(); } return 0; } |
Re: [Мануал] Распаковка пака игры
Цитата:
|
Re: [Мануал] Распаковка пака игры
Цитата:
К тому же самое интересное - запись файлов - осталось за кадром :) Впрочем не думаю что это кому нибудь понадобится. В крайнем случае перемонтировать мастер на запись и скопировать готовый файл. Кстати не выяснял детально, но кажется там есть всё необходимое, чтоб заменить файл сохранив его оригинальную MD5, что спасёт от перезаписи файла при проверке ресурсов игры. Но если файл в списке обновляемых, то разумеется перезапишется. |
Re: [Мануал] Распаковка пака игры
Подскажите, как распаковать compact.sqlite3 ?
|
Re: [Мануал] Распаковка пака игры
So you found how to get compact.sqlite3 Key?
|
Re: [Мануал] Распаковка пака игры
Цитата:
ключ sqlite3 базы от текущего ру-клиента (клиент 14.12.13) encryption aes_128_cbc "\x7C\x65\x10\x32\x20\x04\x26\xA7\x02\x93\xE3\x3E\ x3E\xc6\x53\x1F" |
Re: [Мануал] Распаковка пака игры
Edited ! For some!
|
Re: [Мануал] Распаковка пака игры
Цитата:
|
Re: [Мануал] Распаковка пака игры
А ключ зашифровки такой же или надо искать? И в xlcommon.dll есть проверка по md5 ?
|
Re: [Мануал] Распаковка пака игры
Цитата:
http://aluigi.altervista.org/papers/...s/archeage.bms тут вот такой вижу в скрипте луиджи encryption aes_128_cbc "\x32\x1F\x2A\xEE\xAA\x58\x4A\xB4\x9A\x6C\x9E\x09\ xD5\x9E\x9C\x6F" да если не затруднит сылочку в лс кинь на этот клиент // |
Re: [Мануал] Распаковка пака игры
Цитата:
Ключ от базы в этом скрипта вставляется сюда : #set EXT extension NAME #if EXT == "sqlite3" # encryption aes? ??? |
Re: [Мануал] Распаковка пака игры
Цитата:
get ZSIZE long MEMORY_FILE # ??? интересно тут после # что то должно быть указано или нет . |
Re: [Мануал] Распаковка пака игры
Цитата:
|
Re: [Мануал] Распаковка пака игры
А для чего нужен compact.sqlite3 ?
Как я понял, распаковка и упаковка файлов возможна без его участия? Хочу сделать ретекстур в игре. Не могу смотреть без слёз, как корейцы сделали на CryEgine3 вот такое http://i.imgur.com/nLSNoSr.jpg |
Re: [Мануал] Распаковка пака игры
Это игровая база. Параметры, локализация.
Для текстур думаю не пригодится. |
Re: [Мануал] Распаковка пака игры
Отлично. Блин, я так и думал, что когда-нибудь мне придётся освоить синтаксис с++, и вот он момент истины ><
Ещё вопрос. Где то выше, был дан совет, что для записи, надо перемонтировать какой-то мастер. Что это? |
Re: [Мануал] Распаковка пака игры
Есть у кого ключики к последней версии збт клиента?
|
Re: [Мануал] Распаковка пака игры
2 уапроса от ньюфага:
Каким образом мне сконвертировать все ддски в пнгшечки (или хотя бы снять крипт, ибо обычными вьюерами фиг посмотришь, ошибку бьет) Где лежат файлы локализации? (тот щит что в базе на корейском, где русский то?) Заранее благодарен :) |
Re: [Мануал] Распаковка пака игры
1 - imagemagick. А посмотреть можно Windows Texture Viewer от Nvidia
2 - локализации 2. В дллке - стартовый сплеш и что-то ещё. И в базе. В корейской версии локализации естественно нет. В остальных версиях корейская и локаль той версии. Такого, чтоб все локали сразу - нету. |
Re: [Мануал] Распаковка пака игры
В https://github.com/madhacker666/aainfo добавлен исходник шелла. Я его уже публиковал пару страниц назад. В репозитории более прокомментированная версия.
|
Текущее время: 23:14. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot