Автор |
Сообщение |
Баттерс
Загонщик
Пришел: 12.02.2009
Сообщения: 4
|
|
|
Sagrer
Убийца троллей
Пришел: 24.12.2001
Сообщения: 3548
Откуда: Курск
|
Добавлено: 25 ноября 2009, 02:38 |
|
|
я так понимаю, там не используется резбилд, автор написал свой парсер res-ов....
Только один вопрос: зачем?
З.Ы. разве что, исходник в виде читабельного и юзабельного класса на паскале или С++ был бы полезен кому-нибудь из мододелов и разработчиков утилит. Просто GUI для резбилда целая куча на самом деле, и реально пользоваться просто для распаковки\запаковки будут таки тем что основано на резбилде. Опять же насчёт запаковки - если алгоритм хеширования не разобран - смысла от пакующей утилиты нет при наличии резбилда, res-ы с хешами игра по идее должна обрабатывать быстрее чем без оных. _________________ Мы уйдем без следа, ни имен ни примет.
Этот мир простоит еще тысячи лет.
Нас и раньше здесь не было - после не будет.
Ни ущерба, ни пользы от этого нет. (с) Омар Хайям
|
|
|
Баттерс
Загонщик
Пришел: 12.02.2009
Сообщения: 4
|
Добавлено: 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 туда же втюхали. Одних только потомков CObject порядка 200 штук. Эх, когда-то MFC был очень даже популярен. Вот, оказывается даже в играх его использовали.
ЗЫ2. Кстати, находка: (не знаю, известна ли она). Игра использует Miles Sound System. А та в свою очередь подгружает в качестве плагинов все файлы с расширением asi, положенные в корневую директорию игры. Итак, как написать свой плагин для игры? Очень просто: пишем dll и переименовываем в asi. Проверил - работает.
ЗЫ3. Этот же метод использовался в играх GTA 3, Vice City. Позже был внедрен в San Andreas и GTA 4 (но уже руками). Можно вот тут почитать.
|
|
|
Снайпер
Зеленый гипатский зануда
Пришел: 18.01.2004
Сообщения: 3420
Откуда: Кызыл
|
Добавлено: 25 ноября 2009, 19:59 |
|
|
Про подгрузку "левых" библиотек - уже интереснее, избавляет от необходимости извращаться в стартере с памятью игры... _________________ Я желаю всем счастья!
|
|
|
Sagrer
Убийца троллей
Пришел: 24.12.2001
Сообщения: 3548
Откуда: Курск
|
Добавлено: 26 ноября 2009, 02:53 |
|
|
ну, насчёт распаковки - формат известен %). Неясен только алгоритм хеширования, но если тут реверсится resbuild.exe - наверное скоро что-то будет %).
Насчёт asi спасибо за инфу, правда пока в голову не приходит как это можно использовать, если уже есть стартер %). _________________ Мы уйдем без следа, ни имен ни примет.
Этот мир простоит еще тысячи лет.
Нас и раньше здесь не было - после не будет.
Ни ущерба, ни пользы от этого нет. (с) Омар Хайям
|
|
|
Баттерс
Загонщик
Пришел: 12.02.2009
Сообщения: 4
|
Добавлено: 26 ноября 2009, 17:11 |
|
|
ресбилд-то? Ну, если надо, то реверсится.
Прикол в том, что хэширования никакого нет. Похоже, что то, что я обозвал "хэш" - это просто какой-то порядковый номер. Для большинства файлов в ресурсе он равен -1. Для некоторых имеет какое-то вполне определенное и совсем даже не магическое число - 1, 2 ...
Попробовал изменить одну циферку на -1. В игре никаких отличий не обнаружил. После оптимизации ресбилдом циферка вернулась.
Думаю пока не запариваться по поводу этой циферки. После перепаковки всегда можно оптимизировать ресбилдом.
Не приходит в голову как использовать подгрузку библиотек? Ну, можно патчить процесс игры во время исполнения (для патчинга не перезаписываемых областей кода надо использовать функцию VirtualProtect) . Внедриться в игру. Заменить функции игры своими функциями... Можно делать все, что угодно. Мы в адресном пространстве процесса. А что еще нужно?
|
|
|
Sagrer
Убийца троллей
Пришел: 24.12.2001
Сообщения: 3548
Откуда: Курск
|
Добавлено: 27 ноября 2009, 02:53 |
|
|
Цитата: | Можно делать все, что угодно. Мы в адресном пространстве процесса. А что еще нужно? |
просто уже есть addon.dll, которая делает то же самое. _________________ Мы уйдем без следа, ни имен ни примет.
Этот мир простоит еще тысячи лет.
Нас и раньше здесь не было - после не будет.
Ни ущерба, ни пользы от этого нет. (с) Омар Хайям
|
|
|
visor
Охотник
Пришел: 15.03.2004
Сообщения: 77
|
Добавлено: 20 февраля 2010, 23:33 |
|
|
Цитата (Баттерс): |
DWORD fileoffset<format=hex>;
DWORD pFileInfoBlock<format=decimal>;
|
А ичто за диво такое? MS расширения?
|
|
|
|