GCF Editor
-
- Эксперты no-Steam
- Сообщения: 2600
- Зарегистрирован: 15.02.2007
- Откуда: Москва
- Благодарил (а): 2 раза
- Поблагодарили: 43 раза
- Контактная информация:
может кто-нибудь всеже займется разработкой GCF редактора ?
думаю что эта прога могла бы многим пригодится, например создать
GCF файл Half Life с русификацией
я бы сам занялся, но увы я не кодер
думаю что эта прога могла бы многим пригодится, например создать
GCF файл Half Life с русификацией
я бы сам занялся, но увы я не кодер
- impulse666
- Полковник
- Сообщения: 7405
- Зарегистрирован: 08.12.2005
- Откуда: Atman
- Благодарил (а): 2340 раз
- Поблагодарили: 590 раз
fire64
аа, ты вроде добился какихто результатов, так выкладывай хотябы приблизительный алгоритм что там и как..
можно в ЛС..
аа, ты вроде добился какихто результатов, так выкладывай хотябы приблизительный алгоритм что там и как..
можно в ЛС..
-
- Эксперты no-Steam
- Сообщения: 2600
- Зарегистрирован: 15.02.2007
- Откуда: Москва
- Благодарил (а): 2 раза
- Поблагодарили: 43 раза
- Контактная информация:
давай рассмотрим структуру GCF файла
за пример возьмем файл sourceinit.gcf так как он самый простой
байт 8 имеет значение 06 ( 6 ) он определяет версию GCF файла
изменять версию не имеет никакого смысла так как изменяется только идентификатор версии
байт C имеет значение ca ( 202 ) это AppID gcf файла
дальше идет CRC файла и сам GCF формат ( здесь я не копался )
байт 3ED, здесь название файла
байт 688, здесь начинается файл sourceinit.dat и идет до конца файла
байты отвечающие за название файла и за начало файла в каждом файле разные
также каждый GCF файл имеет CRC в связи с этим необходимо что бы после редактирования GCF файла
контрольная сумма осталась прежней
вот образец http://ifolder.ru/4846736
файл имеет AppID 33
внутри GCF файла находится файл Half Life2.jpg
за пример возьмем файл sourceinit.gcf так как он самый простой
байт 8 имеет значение 06 ( 6 ) он определяет версию GCF файла
изменять версию не имеет никакого смысла так как изменяется только идентификатор версии
байт C имеет значение ca ( 202 ) это AppID gcf файла
дальше идет CRC файла и сам GCF формат ( здесь я не копался )
байт 3ED, здесь название файла
байт 688, здесь начинается файл sourceinit.dat и идет до конца файла
байты отвечающие за название файла и за начало файла в каждом файле разные
также каждый GCF файл имеет CRC в связи с этим необходимо что бы после редактирования GCF файла
контрольная сумма осталась прежней
вот образец http://ifolder.ru/4846736
файл имеет AppID 33
внутри GCF файла находится файл Half Life2.jpg
[fire64]
Открыв всего один файлик(причём не являющийся GCF-ом) скажу:
struct GCFHeader
{
hlUInt uiDummy0; // Always 0x00000001
hlUInt uiMajorVersion; // Always 0x00000001
hlUInt uiMinorVersion; // GCF version number.
hlUInt uiCacheID;
hlUInt uiLastVersionPlayed;
hlUInt uiDummy1;
hlUInt uiDummy2;
hlUInt uiFileSize; // Total size of GCF file in bytes.
hlUInt uiBlockSize; // Size of each data block in bytes.
hlUInt uiBlockCount; // Number of data blocks.
hlUInt uiDummy3;
};
struct GCFBlockEntryHeader
{
hlUInt uiBlockCount; // Number of data blocks.
hlUInt uiBlocksUsed; // Number of data blocks that point to data.
hlUInt uiDummy0;
hlUInt uiDummy1;
hlUInt uiDummy2;
hlUInt uiDummy3;
hlUInt uiDummy4;
hlUInt uiChecksum; // Header checksum.
};
struct GCFBlockEntry
{
hlUInt uiEntryFlags; // Flags for the block entry. 0x200F0000 == Not used.
hlUInt uiFileDataOffset; // The offset for the data contained in this block entry in the file.
hlUInt uiFileDataSize; // The length of the data in this block entry.
hlUInt uiFirstDataBlockIndex; // The index to the first data block of this block entry's data.
hlUInt uiNextBlockEntryIndex; // The next block entry in the series. (N/A if == BlockCount.)
hlUInt uiPreviousBlockEntryIndex; // The previous block entry in the series. (N/A if == BlockCount.)
hlUInt uiDirectoryIndex; // The index of the block entry in the directory.
};
Всё открыто и явно написано - что и как построено.
Часть исходников HLLib - библиотеки написанной одним из работников Valve
Проблема заклчюается в том что все заголовки данных имеют контрольную сумму а так же в файле GCF находится карта контрольных сумм для всех файлов которые в нём содержатся... Так что имитация контрольной суммы является практически невыполнимой...
Но есть ко всему этому делу workaround:
HLLib позволяет создавать GCF файлы что значит что можно распаковывать существующий GCF и создавать новый с нужными модификациями...
Параллельно CFTool помоему умеет редактировать GCF(или пользуется подобным workaround-м) :)
Открыв всего один файлик(причём не являющийся GCF-ом) скажу:
struct GCFHeader
{
hlUInt uiDummy0; // Always 0x00000001
hlUInt uiMajorVersion; // Always 0x00000001
hlUInt uiMinorVersion; // GCF version number.
hlUInt uiCacheID;
hlUInt uiLastVersionPlayed;
hlUInt uiDummy1;
hlUInt uiDummy2;
hlUInt uiFileSize; // Total size of GCF file in bytes.
hlUInt uiBlockSize; // Size of each data block in bytes.
hlUInt uiBlockCount; // Number of data blocks.
hlUInt uiDummy3;
};
struct GCFBlockEntryHeader
{
hlUInt uiBlockCount; // Number of data blocks.
hlUInt uiBlocksUsed; // Number of data blocks that point to data.
hlUInt uiDummy0;
hlUInt uiDummy1;
hlUInt uiDummy2;
hlUInt uiDummy3;
hlUInt uiDummy4;
hlUInt uiChecksum; // Header checksum.
};
struct GCFBlockEntry
{
hlUInt uiEntryFlags; // Flags for the block entry. 0x200F0000 == Not used.
hlUInt uiFileDataOffset; // The offset for the data contained in this block entry in the file.
hlUInt uiFileDataSize; // The length of the data in this block entry.
hlUInt uiFirstDataBlockIndex; // The index to the first data block of this block entry's data.
hlUInt uiNextBlockEntryIndex; // The next block entry in the series. (N/A if == BlockCount.)
hlUInt uiPreviousBlockEntryIndex; // The previous block entry in the series. (N/A if == BlockCount.)
hlUInt uiDirectoryIndex; // The index of the block entry in the directory.
};
Всё открыто и явно написано - что и как построено.
Часть исходников HLLib - библиотеки написанной одним из работников Valve
Проблема заклчюается в том что все заголовки данных имеют контрольную сумму а так же в файле GCF находится карта контрольных сумм для всех файлов которые в нём содержатся... Так что имитация контрольной суммы является практически невыполнимой...
Но есть ко всему этому делу workaround:
HLLib позволяет создавать GCF файлы что значит что можно распаковывать существующий GCF и создавать новый с нужными модификациями...
Параллельно CFTool помоему умеет редактировать GCF(или пользуется подобным workaround-м) :)
- andreil
- Разработчик
- Сообщения: 781
- Зарегистрирован: 14.08.2006
- Откуда: Светлогорск, Беларусь
- Поблагодарили: 2 раза
- Контактная информация:
vityan666
Кстати, я по этим хэадерам сейчас попробую сделать какой-нибудь вьювер ГЦФ-файлов, авось получится еще и чтение файлов сделать. Причем все - самому.
Кстати, я по этим хэадерам сейчас попробую сделать какой-нибудь вьювер ГЦФ-файлов, авось получится еще и чтение файлов сделать. Причем все - самому.
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).
- andreil
- Разработчик
- Сообщения: 781
- Зарегистрирован: 14.08.2006
- Откуда: Светлогорск, Беларусь
- Поблагодарили: 2 раза
- Контактная информация:
ЗЫ: дошел до небольшого ступора еще в чтении заголовка GCF файла. Разбираемся, разбираемся. Версию файла уже могу читать, как и общий размер упакованных файлов :)
fire64
Это он к тому, что там типо самые крутые хакеры сидят :)
fire64
Это он к тому, что там типо самые крутые хакеры сидят :)
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).
- impulse666
- Полковник
- Сообщения: 7405
- Зарегистрирован: 08.12.2005
- Откуда: Atman
- Благодарил (а): 2340 раз
- Поблагодарили: 590 раз
самые крутые крэкеры сидят здесь :D
пс andreil
у тебя не осталось исходняка витяновского ОпенПатча? я чтото немогу найти нигде (в 1 посте соседней темыв нет)
а то хотелосьбыв к аккменеджеру своему прикрутить...%)
пс andreil
у тебя не осталось исходняка витяновского ОпенПатча? я чтото немогу найти нигде (в 1 посте соседней темыв нет)
а то хотелосьбыв к аккменеджеру своему прикрутить...%)
- andreil
- Разработчик
- Сообщения: 781
- Зарегистрирован: 14.08.2006
- Откуда: Светлогорск, Беларусь
- Поблагодарили: 2 раза
- Контактная информация:
impulse666
неа, нету.
ЗЫ: крути мой патчер :) он прост как пробка :)
неа, нету.
ЗЫ: крути мой патчер :) он прост как пробка :)
[url=svn://forum.csmania.ru/andreil]Репозиторий с моими проектами[/url]
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).
Занимаюсь переносом всех своих библиотек на С++, а так же созданием их кроссплатформенных версий.
В команду переводчиков манги "Ah! My Goddess!" требуются переводчики с английского и тайперы (последних можем обучить, главное - желание).
Очень, бл, содержательно.
Модераторы, в пытошную его!
Модераторы, в пытошную его!