Сейчас на форуме: _MBK_, UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Разбор формата файлов в игре.
Посл.ответ Сообщение


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 07 августа 2011 12:55
· Личное сообщение · #1

Мало занимался такой темой, да вот понадобилось. Файл с графикой игра разжимает в память. После чего эту память кусками кормит в DDRAW. Но куски без заголовков, просто набор байт:
Code:
  1. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  2. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  3. 61 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  4. 81 10 61 10 81 10 81 10 81 10 81 10 81 10 81 10
  5. 81 10 81 10 A2 10 81 10 81 10 81 10 81 10 81 10
  6. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  7. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  8. 81 10 81 10 61 10 81 10 81 10 81 10 81 10 81 10
  9. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  10. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  11. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  12. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  13. 81 10 81 10 81 10 81 10 81 10 81 10 A2 10 81 10
  14. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10
  15. 81 10 81 10 81 10 81 10 81 10 81 10 81 10 81 10


Мне кажется что это Bitmap, но как узнать какого формата и как это дело вообще посмотреть? Как редактировать? Кто кодит под DDRAW - что это за формат?

-----
Yann Tiersen best and do not fuck




Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 07 августа 2011 13:45
· Личное сообщение · #2

DirectX Logger rustem'а не поможет?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 07 августа 2011 13:54
· Личное сообщение · #3

Может и поможет. Просто в DDRAW видимо можно задавать битмапы без заголовков, вот и хотел узнать какие форматы он держит и как распознать в каком формате конкретная игра работает.

-----
Yann Tiersen best and do not fuck





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 августа 2011 14:00
· Личное сообщение · #4

ddraw это ж поверхность, а не формат
и она настраивается через api call
если и грузится палитра то отдельно
поэтому что бы узнать в каком формате нужно слогировать апи вызовы и посмотреть под какой формат настраивается эта самая поверхность
http://www.gamedev.ru/code/terms/DXDebug

хотя нельзя исключать и вариант того что ктото сразу угадает формат




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 07 августа 2011 14:21
· Личное сообщение · #5

Насколько я понял дебаг версия работает начиная с dx8 у меня используется 7.

-----
Yann Tiersen best and do not fuck





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 августа 2011 14:28 · Поправил: reversecode
· Личное сообщение · #6

можно еще поискать некое подобие
blackninja2000.narod.ru/rus/directx_logger.html

либо реверснуть приложение и найти место в котором грузится этот битмап и посмотреть в какой формат он устанавливается

ну или вообще под олькой поискать апи вызов



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 07 августа 2011 15:23 · Поправил: vden
· Личное сообщение · #7

PE_Kill пишет:
После чего эту память кусками кормит в DDRAW

там скорее всего эти куски пишутся в новосозданные поверхности, т.е. тебе нужно подсмотреть описание этих поверхностей (lpDDSurfaceDesc) когда вызвается CreateSurface, примерно так:

Code:
  1.   memset(&G_DESC, 0, 0x7Cu);
  2.   G_DESC.dwSize = 124;
  3.   G_DESC.dwFlags = 7;
  4.   G_DESC.dwWidth = 100;
  5.   G_DESC.dwHeight = 200;
  6.   G_DESC.ddsCaps.dwCaps = 2112;
  7.   if ( g_lpDD7a->lpVtbl->CreateSurface(g_lpDD7a, &G_DESC, &Surface, 0) >= 0 )
  8.   {
  9.            if ( Surface->lpVtbl->Lock(Surface, 0, &Desc, 1u, 0) >= 0 )
  10.            {
  11.                  заполнение поверхности
  12.            }
  13.            Surface->lpVtbl->UnLock(0);
  14.   };





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 07 августа 2011 19:20 · Поправил: ToBad
· Личное сообщение · #8

PE_Kill что-бы узнать битмап или нет, можно воспользоватся другой утилиткой от Рустама.

4e8b_07.08.2011_EXELAB.rU.tgz - imggrab.rar

p.s. Что за игра если не секрет?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 07 августа 2011 22:35 · Поправил: PE_Kill
· Личное сообщение · #9

vden ну да нашел такое:
Code:
  1. .text:00408831                 push    7Ch             ; size_t
  2. .text:00408833                 push    0               ; int
  3. .text:00408835                 push    offset G_DESC   ; void *
  4. .text:0040883A                 call    _memset
  5. .text:0040883F                 mov     eax, lpDD
  6. .text:00408844                 add     esp, 0Ch
  7. .text:00408847                 push    0
  8. .text:00408849                 push    offset dword_6EC0D4
  9. .text:0040884E                 mov     G_DESC.dwSize, 7Ch
  10. .text:00408858                 mov     G_DESC.dwFlags, 21h
  11. .text:00408862                 mov     G_DESC.dwBackBufferCount, 1
  12. .text:0040886C                 mov     G_DESC.ddsCaps.dwCaps, 218h

О чем это говорит?

ADD: Я так понимаю мне нужно увидеть установку поля ddpfPixelFormat.dwRGBBitCount? Но я не нашел его заполнения, выходит, что после memset оно равно 0.

-----
Yann Tiersen best and do not fuck





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 августа 2011 23:23 · Поправил: reversecode
· Личное сообщение · #10

формат сарфеса может менятся дальше, а это просто инициализация что бы работать с "хендлом"
тебе нужно найти chm от DirectX SDK и дамп апи вызовов для этой игры,
что бы уже разобратся какая апи устанавливает формат, и какой это формат
там ведь наверняка в игрухе есть опции которые меняют разрешения екрана, а значит меняется и формат

http://vertexland.narod.ru/data/directx.htm




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 08 августа 2011 02:40 · Поправил: PE_Kill
· Личное сообщение · #11

ToBad спасибо за наводку, рустему спасибо за утиль. С помощью него выяснил, что это 16 битные бимапы без заголовков. Буду копать дальше.

vden спасибо за пример кода, теперь я понял как нарезается память под картинки, ширина, высота и прочее. Ты был прав, сначала создаются поверхности. Потом в цикле лочатся, заполняются и анлочатся.

-----
Yann Tiersen best and do not fuck




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 08 августа 2011 11:05 · Поправил: vden
· Личное сообщение · #12

PE_Kill тоже приходилось выдирать картинки из старых игр

когда инфа об изображении будет, сконвертить в bmp уже дело техники. в делфи например создать TBitmap, задать высоту, ширину, формат пикселей (что-то может ешё, забыл), скопировать пиксели из поверхности и SaveToFile.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 08 августа 2011 14:16
· Личное сообщение · #13

Я это сразу же реализовал для отладки. В принципе уже и утиль написал, все ресурсы распарсил, включая аудио.

-----
Yann Tiersen best and do not fuck




Ранг: 74.1 (постоянный), 34thx
Активность: 0.030
Статус: Участник

Создано: 09 августа 2011 20:11
· Личное сообщение · #14

PE_Kill Что за игра то? Если секрет, можно в личку




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 10 августа 2011 00:40
· Личное сообщение · #15

Rustem пишет:
PE_Kill Что за игра то? Если секрет, можно в личку


Я уже спрашивал... Не признается...


 eXeL@B —› Программирование —› Разбор формата файлов в игре.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати