Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   ArcheAge (https://forum.zone-game.info/forumdisplay.php?f=187)
-   -   [Мануал] Распаковка пака игры (https://forum.zone-game.info/showthread.php?t=32469)

Smiler 14.11.2013 16:50

[Мануал] Распаковка пака игры
 
В паке игры ( файл 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. База данных игры достается закриптованная, ее распаковка это отдельная тема.

Mooni 26.11.2013 10:34

Re: [Мануал] Распаковка пака игры
 
http://img11.imageshack.us/img11/3395/vcbr.jpg

Smiler 26.11.2013 11:29

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" поменяли.

Mooni 26.11.2013 12:51

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MHard (Сообщение 335793)
\x32\x1F\x2A\xEE\xAA\x58\x4A\xB4\x9A\x6C\x9E\x09\x D5\x9E\x9C\x6F

Спасибо - с новым ключом - помогло.

Kelax 30.11.2013 14:59

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MHard (Сообщение 333561)
PS. База данных игры достается закриптованная, ее распаковка это отдельная тема.

1.Планируется ли вообще эта отдельная тема?
2.Можешь хотя бы написать примерный алгоритм действий по пунктам?

Smiler 01.12.2013 11:20

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от Kelax (Сообщение 336467)
1.Планируется ли вообще эта отдельная тема?
2.Можешь хотя бы написать примерный алгоритм действий по пунктам?

1. пока не планируется.
2. тут все просто

а) находим ключ крипта файла базы данных.
б) в скрипте из первого поста находим и заменяем:

это
Цитата:

#set EXT extension NAME
#if EXT == "sqlite3"
# encryption aes? ???
#endif
log NAME OFFSET SIZE # don't use clog for the moment
#encryption "" ""
на

Цитата:

set EXT extension NAME
if EXT == "sqlite3"
encryption aes_128_cbc "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x00"
endif
log NAME OFFSET SIZE # don't use clog for the moment
encryption "" ""
вместо нулей пишем ключ базы

в) распаковываем базу методом из первого поста.
г) открываем базу например программой Navicat

zasranec111 01.12.2013 18:29

Re: [Мануал] Распаковка пака игры
 
А сколько примерно весят файлы после распаковки? Меня смущают распакованные файлы размером всего 6 гигов

MadHacker 01.12.2013 18:47

Re: [Мануал] Распаковка пака игры
 
Примерно не меньше, чем исходный файл.
Я когда пытался QuickBMS распаковать, он у меня падал где-то в районе 5-6 гигов с ошибкой. Я забил и сделал утилиту для просмотра содержимого без распаковки всего файла.

h4x0r 15.12.2013 14:16

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MadHacker (Сообщение 336696)
Примерно не меньше, чем исходный файл.
Я когда пытался QuickBMS распаковать, он у меня падал где-то в районе 5-6 гигов с ошибкой. Я забил и сделал утилиту для просмотра содержимого без распаковки всего файла.

Если какой либо архив больше чем 3.5Gb юзать надо quickbms_4gb_files и падать ничего не будет.

MadHacker 23.12.2013 19:29

Re: [Мануал] Распаковка пака игры
 
Обратите внимание на небольшой подарок от корейцев - файлик xlpack.dll.
Мейловский игровой центр скачивает его при проверке клиента и заботливо удаляет после.
Думаю комментарии к секции экспорта для этой библиотеки не нужны :)

PS. Базу всё равно надо распаковывать отдельно.

h4x0r 24.12.2013 20:03

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MadHacker (Сообщение 341187)
Обратите внимание на небольшой подарок от корейцев - файлик xlpack.dll.
Мейловский игровой центр скачивает его при проверке клиента и заботливо удаляет после.
Думаю комментарии к секции экспорта для этой библиотеки не нужны :)

Ну да есть такая либа для работы с пак файлом. Ей нужно подсовывать манифест с апдейтом или полный манифест со списком файлов для упаковки с 0

Цитата:

Сообщение от MadHacker (Сообщение 341187)
PS. Базу всё равно надо распаковывать отдельно.

Вот так можно ее распаковать отдельно
Код:

quickbms_4gb_files -f "*.sqlite3" ArcheAge.bms "d:\Games\ArcheAge\game_pak" "d:\Games\game_pak"

MadHacker 24.12.2013 23:34

Re: [Мануал] Распаковка пака игры
 
Возможности этой либы намного шире. :)

h4x0r 25.12.2013 00:14

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MadHacker (Сообщение 341506)
Возможности этой либы намного шире. :)

Нету там больше ничего интересного.

MadHacker 25.12.2013 02:35

Re: [Мануал] Распаковка пака игры
 
http://i031.radikal.ru/1312/eb/ac06ede94699.png
И многое другое. И никакой возни с ключами.

h4x0r 25.12.2013 09:51

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MadHacker (Сообщение 341558)

Это что вообще?

Цитата:

Сообщение от MadHacker (Сообщение 341558)
И многое другое. И никакой возни с ключами.

Эм... А разьве с ними была возьня :) ?

MadHacker 25.12.2013 18:56

Re: [Мануал] Распаковка пака игры
 
Это небольшая командная оболочка над функциями библиотеки.
Список файлов, копирование, отображение.

MadHacker 26.12.2013 21:17

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;
}
 
Code: C++

trixiejack 26.12.2013 21:21

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MadHacker (Сообщение 341931)
По просьбам трудящихся, исходник представленного на скрине шела.
Код кривоват. Английский скорее всего тоже. Не стоит бездумно копировать код в свои утилиты ;)
В таком варианте гдето память течёт при копировании большого количества файлов.
#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;
}
 
Code: C++

Ну вот, испортили весь кайф от разработки с вашими подсказками ;)

MadHacker 26.12.2013 21:22

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от trixiejack (Сообщение 341932)
Ну вот, испортили весь кайф от разработки с вашими подсказками ;)

Лучше потратьте освободившееся время на поиск ключа к базе или ещё чего нибудь интересного :)

К тому же самое интересное - запись файлов - осталось за кадром :) Впрочем не думаю что это кому нибудь понадобится.
В крайнем случае перемонтировать мастер на запись и скопировать готовый файл.

Кстати не выяснял детально, но кажется там есть всё необходимое, чтоб заменить файл сохранив его оригинальную MD5, что спасёт от перезаписи файла при проверке ресурсов игры.
Но если файл в списке обновляемых, то разумеется перезапишется.

Quake 31.12.2013 21:56

Re: [Мануал] Распаковка пака игры
 
Подскажите, как распаковать compact.sqlite3 ?

ehnoah 06.01.2014 01:22

Re: [Мануал] Распаковка пака игры
 
So you found how to get compact.sqlite3 Key?

Smiler 10.01.2014 18:45

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MHard (Сообщение 336621)
1. пока не планируется.
2. тут все просто

а) находим ключ крипта файла базы данных.
б) в скрипте из первого поста находим и заменяем:

это


на



вместо нулей пишем ключ базы

в) распаковываем базу методом из первого поста.
г) открываем базу например программой Navicat

ну раз база уже доступна, вот вам и мои 5 копеек ;)

ключ sqlite3 базы от текущего ру-клиента (клиент 14.12.13)

encryption aes_128_cbc "\x7C\x65\x10\x32\x20\x04\x26\xA7\x02\x93\xE3\x3E\ x3E\xc6\x53\x1F"

ehnoah 10.01.2014 19:33

Re: [Мануал] Распаковка пака игры
 
Edited ! For some!

Smiler 10.01.2014 19:40

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от ehnoah (Сообщение 345112)
Thank you so much!!!

Can you say us how key is crypted in File?

Because I know key is flipped with a Formula

At this time I cant reveal all secrets

Kelax 11.01.2014 15:56

Re: [Мануал] Распаковка пака игры
 
А ключ зашифровки такой же или надо искать? И в xlcommon.dll есть проверка по md5 ?

<~Kp@$o†ka~> 11.01.2014 23:52

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MHard (Сообщение 345089)
ну раз база уже доступна, вот вам и мои 5 копеек ;)

ключ sqlite3 базы от текущего ру-клиента (клиент 14.12.13)

encryption aes_128_cbc "\x7C\x65\x10\x32\x20\x04\x26\xA7\x02\x93\xE3\x3E\ x3E\xc6\x53\x1F"

Вопрос а старый ключ был от какого клиента ? если не сложно напиши

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"

да если не затруднит сылочку в лс кинь на этот клиент //

Smiler 12.01.2014 20:38

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от <~Kp@$o†ka~> (Сообщение 345302)
Вопрос а старый ключ был от какого клиента ? если не сложно напиши

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"

да если не затруднит сылочку в лс кинь на этот клиент //

В скрипта Луиджи ключ от пака (он неменяется ), а не от базы

Ключ от базы в этом скрипта вставляется сюда :

#set EXT extension NAME
#if EXT == "sqlite3"
# encryption aes? ???

<~Kp@$o†ka~> 13.01.2014 07:01

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от MHard (Сообщение 345420)
В скрипта Луиджи ключ от пака (он неменяется ), а не от базы

Ключ от базы в этом скрипта вставляется сюда :

#set EXT extension NAME
#if EXT == "sqlite3"
# encryption aes? ???

спс за подсказку босс

get ZSIZE long MEMORY_FILE # ???

интересно тут после # что то должно быть указано или нет .

trixiejack 13.01.2014 11:24

Re: [Мануал] Распаковка пака игры
 
Цитата:

Сообщение от <~Kp@$o†ka~> (Сообщение 345522)
спс за подсказку босс

get ZSIZE long MEMORY_FILE # ???

интересно тут после # что то должно быть указано или нет .

# - знак комментария, который обычно используется для того, чтобы объяснить ту или иную функцию.

kripto289 16.01.2014 12:17

Re: [Мануал] Распаковка пака игры
 
А для чего нужен compact.sqlite3 ?
Как я понял, распаковка и упаковка файлов возможна без его участия?
Хочу сделать ретекстур в игре. Не могу смотреть без слёз, как корейцы сделали на CryEgine3 вот такое http://i.imgur.com/nLSNoSr.jpg

MadHacker 16.01.2014 18:38

Re: [Мануал] Распаковка пака игры
 
Это игровая база. Параметры, локализация.
Для текстур думаю не пригодится.

kripto289 16.01.2014 19:19

Re: [Мануал] Распаковка пака игры
 
Отлично. Блин, я так и думал, что когда-нибудь мне придётся освоить синтаксис с++, и вот он момент истины ><
Ещё вопрос. Где то выше, был дан совет, что для записи, надо перемонтировать какой-то мастер. Что это?

IncSW 05.02.2014 19:57

Re: [Мануал] Распаковка пака игры
 
Есть у кого ключики к последней версии збт клиента?

JGOORDAH 09.03.2014 19:21

Re: [Мануал] Распаковка пака игры
 
2 уапроса от ньюфага:
Каким образом мне сконвертировать все ддски в пнгшечки (или хотя бы снять крипт, ибо обычными вьюерами фиг посмотришь, ошибку бьет)
Где лежат файлы локализации? (тот щит что в базе на корейском, где русский то?)
Заранее благодарен :)

MadHacker 09.03.2014 22:57

Re: [Мануал] Распаковка пака игры
 
1 - imagemagick. А посмотреть можно Windows Texture Viewer от Nvidia
2 - локализации 2. В дллке - стартовый сплеш и что-то ещё. И в базе. В корейской версии локализации естественно нет. В остальных версиях корейская и локаль той версии. Такого, чтоб все локали сразу - нету.

MadHacker 12.03.2014 21:11

Re: [Мануал] Распаковка пака игры
 
В https://github.com/madhacker666/aainfo добавлен исходник шелла. Я его уже публиковал пару страниц назад. В репозитории более прокомментированная версия.


Текущее время: 09:35. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot