Гипат.org

MODный форум - EIRES Extractor

Баттерс - 24 ноября 2009, 17:20
Вот написал экстрактор для архивов игры (*res файлов). Частичная замена консольному ResBuild'у.
Что умеет:
Парсить файлы ресурсов и отображать информацию об их содержимом (имена файлов, их вес, время модификации и оффсет в архиве).
Извлекать файлы из архива на диск. Можно извлечь 1 файл, можно 2. А можно сразу все.
Для удобства прикручена поддержка командной строки (Можно выбрать "Открыть с помощью" из проводника).
Все. Больше программа ничово не умеет. :D
Если автор преодолеет лень, то, возможно, программа научится еще добавлять и удалять файлы в/из архива.
Скреншод:

Sagrer - 25 ноября 2009, 02:38
я так понимаю, там не используется резбилд, автор написал свой парсер res-ов....

Только один вопрос: зачем?

:roll:

З.Ы. разве что, исходник в виде читабельного и юзабельного класса на паскале или С++ был бы полезен кому-нибудь из мододелов и разработчиков утилит. Просто GUI для резбилда целая куча на самом деле, и реально пользоваться просто для распаковки\запаковки будут таки тем что основано на резбилде. Опять же насчёт запаковки - если алгоритм хеширования не разобран - смысла от пакующей утилиты нет при наличии резбилда, res-ы с хешами игра по идее должна обрабатывать быстрее чем без оных.
Баттерс - 25 ноября 2009, 12:29
Пока отреверсен только алгоритм распаковки. Там хэши не используются. Алгоритм запаковки отреверсить тоже не проблема. Только времени бы побольше.
Класс пока выкладывать не буду. Все равно без запаковки смысла в нем нет. Да и там непричесано там все как-то.
Могу пока выложить шаблон для вывода структуры файла в 010 Editor.
Код:
//--------------------------------------
//--- 010 Editor v3.0.4 Binary Template
//
// File: CMappedResource
// Author: Butters
// Revision: 1.0
// Purpose: Defines a template for
//    parsing Evil Islands RES files.
//--------------------------------------

typedef struct {
    signed int  Hash;
    DWORD   filesize;
    DWORD   fileoffset<format=hex>;
    time_t  filetime; //32 bit
    WORD    FileNameLen;
    DWORD   FileNameOffset;
} FILEINFO;

typedef struct {
    DWORD       dwType<format=hex>;//0x19ce23c
    DWORD       nFiles;
    DWORD       pFileInfoBlock<format=decimal>;
    DWORD       sizeof__FileNamesBlock;
} CMappedResourceHeader;

LittleEndian();
SetBackColor( cLtAqua );
CMappedResourceHeader header;

// Check for header
if( header.dwType !=  0x19ce23c)
{
    Warning( "File is not a CMappedResource file. Template stopped." );
    return -1;
}

if (FSeek(header.pFileInfoBlock)!=0)
{
    Warning( "Corrupted header." );
    return -1;
}

SetBackColor( cLtYellow );
FILEINFO fileinfoblock[header.nFiles];

SetBackColor( cLtGray );
string filenames;
FSeek(16);
SetBackColor( cLtGreen );
char FileContent[header.pFileInfoBlock - 16];

Кстати, я тут мельком заглянул в game.exe. По рудиментам отладочной печати стало понятно, что разрабы называли этот класс CMappedResource. Думаю, правильнее будет называть утилиту CMappedResource Extractor.

ЗЫ. А код там сложноват для анализа. Все смешано в кучу. И MFC туда же втюхали. :spy: Одних только потомков CObject порядка 200 штук. :ass: Эх, когда-то MFC был очень даже популярен. Вот, оказывается даже в играх его использовали.

ЗЫ2. Кстати, находка: (не знаю, известна ли она). Игра использует Miles Sound System. А та в свою очередь подгружает в качестве плагинов все файлы с расширением asi, положенные в корневую директорию игры. Итак, как написать свой плагин для игры? Очень просто: пишем dll и переименовываем в asi. Проверил - работает. :D

ЗЫ3. Этот же метод использовался в играх GTA 3, Vice City. Позже был внедрен в San Andreas и GTA 4 (но уже руками). Можно вот тут почитать.
Снайпер - 25 ноября 2009, 19:59
Про подгрузку "левых" библиотек - уже интереснее, избавляет от необходимости извращаться в стартере с памятью игры...
Sagrer - 26 ноября 2009, 02:53
ну, насчёт распаковки - формат известен %). Неясен только алгоритм хеширования, но если тут реверсится resbuild.exe - наверное скоро что-то будет %).

Насчёт asi спасибо за инфу, правда пока в голову не приходит как это можно использовать, если уже есть стартер %).
Баттерс - 26 ноября 2009, 17:11
ресбилд-то? Ну, если надо, то реверсится.
Прикол в том, что хэширования никакого нет. Похоже, что то, что я обозвал "хэш" - это просто какой-то порядковый номер. Для большинства файлов в ресурсе он равен -1. Для некоторых имеет какое-то вполне определенное и совсем даже не магическое число - 1, 2 ...
Попробовал изменить одну циферку на -1. В игре никаких отличий не обнаружил. После оптимизации ресбилдом циферка вернулась.
Думаю пока не запариваться по поводу этой циферки. После перепаковки всегда можно оптимизировать ресбилдом.

Не приходит в голову как использовать подгрузку библиотек? Ну, можно патчить процесс игры во время исполнения (для патчинга не перезаписываемых областей кода надо использовать функцию VirtualProtect) . Внедриться в игру. Заменить функции игры своими функциями... Можно делать все, что угодно. Мы в адресном пространстве процесса. А что еще нужно?
Sagrer - 27 ноября 2009, 02:53
Цитата:
Можно делать все, что угодно. Мы в адресном пространстве процесса. А что еще нужно?


просто уже есть addon.dll, которая делает то же самое.
visor - 20 февраля 2010, 23:33
Цитата (Баттерс):

DWORD fileoffset<format=hex>;
DWORD pFileInfoBlock<format=decimal>;

А ичто за диво такое? MS расширения?
Часовой пояс: GMT +4:00
Форумы Поселка созданы на базе phpBB2 2.0.4 © phpBB Group