Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Разбор ресурсов. Наполовину разобранный файл анимациии - требуется помощь

78K
17 июня 2013 года
albeoris
20 / / 17.05.2013
Доброго времени суток!
Разбираю формат ресурсного файла. Он упорно не поддаётся. Нужна помощь более опытных коллег.

Что известно:
Это файлы, содержащию анимацию.

Содержат заголовок, палитру, и непосредственно кадры.

Заголовок:

 
Код:
Word        4h  2h
Word        6h  2h
Word        8h  2h
Word        Ah  2h
Word        Ch  2h
Word        Eh  2h // Количество кадров

 
Код:
// Непонятно что, обычно забито 00

Byte        10h 1h
Byte        11h 1h
Byte        12h 1h
Byte        13h 1h
Byte        14h 1h
Byte        16h 1h
Byte        17h 1h

 
Код:
// Каждый кадр описывается 4 значениями типа Word. Вероятно, что-то из этого ширина (или то, из чего можно получить ширину).
Word[]      18h 180h

Update:
Word №1 - смещение по OX от мистического центра тяжести, знаковый (влияет только на отображение)
Word №2 - смещение по OY от мистического центра тяжести, знаковый (влияет только на отображение)
Word №3 - ширина кадра, беззнаковый, используется при декодировании (от него зависят данные)
Word №4 - высота кадра, беззнаковый, используется при декодировании (от него не зависят данные)

 
Код:
// Палитра из 64 значений. RGBA. A - всегда 00.
Dword[]     198h    100h

 
Код:
// Каждый кадр описывается одним значением - смещение на начало данных от 358h
Dword[]     298h    C0h
Начиная с 358h находится содержимое кадров.

Самый маленький (в приложенном файле Snow.dlr) выглядит так:

 
Код:
Длина: 54h(84) байта
Заголовок кадра: 8400 5C00 0C00 0800

Кадр:
02042E2E2E2E060001063C4444442E2E050000082E44444444443C36040000083C44444444442E360400
00082E44444444442E36040000082E3C4444443C3622040001062E2E3C2E362205000204363636220600

Вот то немногое, что удалось узнать. Осталось самое трудное - превратить содержимое в матрицу индексов, ссылающихся на палитру цветов.
В этом и требуется помощь.

Есть страшная партянка дизасемблированного кода, в которой происходит обработка этого файла. К сожалению, моих скромных познаний и вместимости сознания хватило лишь на то, чтобы предположить, что самый первый двойной цикл - это пропуск не интересующих данных. В остальном всё очень грустно, я уже плохо себе представляю какие из 10 аргументов в себе что содержат и откуда это взялось.

При необходимости, могу предоставиться программу. Замечательно дебажится как OlyDbg, так и IDA.


Код:
CPU Disasm
Address   Hex dump          Command                                            Comments
0045167E  /$  55            PUSH EBP
0045167F  |.  8BEC          MOV EBP,ESP
00451681  |.  53            PUSH EBX
00451682  |.  56            PUSH ESI
00451683  |.  57            PUSH EDI
00451684  |.  FC            CLD
00451685  |.  B8 80020000   MOV EAX,280
0045168A  |.  0345 20       ADD EAX,DWORD PTR SS:[ARG.7]
0045168D  |.  A3 96184500   MOV DWORD PTR DS:[451896],EAX
00451692  |.  8B75 0C       MOV ESI,DWORD PTR SS:[ARG.2]
00451695  |.  8B7D 14       MOV EDI,DWORD PTR SS:[ARG.4]
00451698  |.  8D3CBF        LEA EDI,[EDI*4+EDI]
0045169B  |.  C1E7 07       SHL EDI,7
0045169E  |.  037D 10       ADD EDI,DWORD PTR SS:[ARG.3]
004516A1  |.  037D 08       ADD EDI,DWORD PTR SS:[ARG.1]
004516A4  |.  037D 20       ADD EDI,DWORD PTR SS:[ARG.7]
004516A7  |.  8B4D 28       MOV ECX,DWORD PTR SS:[ARG.9]
004516AA  |.  890D A9184500 MOV DWORD PTR DS:[4518A9],ECX
004516B0  |.  890D 2F1A4500 MOV DWORD PTR DS:[451A2F],ECX
004516B6  |.  33C0          XOR EAX,EAX
004516B8  |.  8B5D 1C       MOV EBX,DWORD PTR SS:[ARG.6]
004516BB  |.  0BDB          OR EBX,EBX
004516BD  |.  74 13         JE SHORT 004516D2
004516BF  |>  8BD1          /MOV EDX,ECX                ; Пропускаем что-то
004516C1  |>  8A06          |/MOV AL,BYTE PTR DS:[ESI]
004516C3  |.  46            ||INC ESI
004516C4  |.  2BD0          ||SUB EDX,EAX
004516C6  |.  8A06          ||MOV AL,BYTE PTR DS:[ESI]
004516C8  |.  46            ||INC ESI
004516C9  |.  03F0          ||ADD ESI,EAX
004516CB  |.  2BD0          ||SUB EDX,EAX
004516CD  |.^ 75 F2         |\JNE SHORT 004516C1
004516CF  |.  4B            |DEC EBX
004516D0  |.^ 75 ED         \JNE SHORT 004516BF
004516D2  |>  33C9          XOR ECX,ECX
004516D4  |.  8B5D 24       MOV EBX,DWORD PTR SS:[ARG.8]
004516D7  |>  8B55 18       MOV EDX,DWORD PTR SS:[EBP+18]
004516DA  |>  8A0E          MOV CL,BYTE PTR DS:[ESI]
004516DC  |.  46            INC ESI
004516DD  |.  3BD1          CMP EDX,ECX
004516DF  |.  77 09         JA SHORT 004516EA
004516E1  |.  2BCA          SUB ECX,EDX
004516E3  |.  8B55 20       MOV EDX,DWORD PTR SS:[EBP+20]
004516E6  |.  EB 21         JMP SHORT 00451709
004516E8  |.^ EB 1A         JMP SHORT 00451704
004516EA  |>  2BD1          SUB EDX,ECX
004516EC  |.  8A0E          MOV CL,BYTE PTR DS:[ESI]
004516EE  |.  46            INC ESI
004516EF  |.  3BD1          CMP EDX,ECX
004516F1  |.  77 0B         JA SHORT 004516FE
004516F3  |.  2BCA          SUB ECX,EDX
004516F5  |.  03F2          ADD ESI,EDX
004516F7  |.  8B55 20       MOV EDX,DWORD PTR SS:[EBP+20]
004516FA  |.  EB 1A         JMP SHORT 00451716
004516FC  |.^ EB 06         JMP SHORT 00451704
004516FE  |>  2BD1          SUB EDX,ECX
00451700  |.  03F1          ADD ESI,ECX
00451702  |.^ EB D6         JMP SHORT 004516DA
00451704  |>^ EB D4         JMP SHORT 004516DA
00451706  |>  8A0E          MOV CL,BYTE PTR DS:[ESI]
00451708  |.  46            INC ESI
00451709  |>  2BD1          SUB EDX,ECX
0045170B  |.  0F8C 95010000 JL 004518A6
00451711  |.  2BF9          SUB EDI,ECX
00451713  |.  8A0E          MOV CL,BYTE PTR DS:[ESI]
00451715  |.  46            INC ESI
00451716  |>  2BD1          SUB EDX,ECX
00451718  |.  0F8E A0010000 JLE 004518BE
0045171E  |.  83F9 08       CMP ECX,8
00451721  |.  73 77         JNB SHORT 0045179A
00451723  |.  0BC9          OR ECX,ECX
00451725  |.  74 6E         JE SHORT 00451795
00451727  |.  F7C7 01000000 TEST EDI,00000001
0045172D  |.  75 25         JNE SHORT 00451754
0045172F  |.  D1E9          SHR ECX,1
00451731  |.  66:9C         PUSHFW
00451733  |.  0BC9          OR ECX,ECX
00451735  |.  74 11         JE SHORT 00451748
00451737  |>  66:8B06       /MOV AX,WORD PTR DS:[ESI]
0045173A  |.  83EF 02       |SUB EDI,2
0045173D  |.  86E0          |XCHG AL,AH
0045173F  |.  83C6 02       |ADD ESI,2
00451742  |.  66:8907       |MOV WORD PTR DS:[EDI],AX
00451745  |.  49            |DEC ECX
00451746  |.^ 75 EF         \JNE SHORT 00451737
00451748  |>  66:9D         POPFW
0045174A  |.  73 49         JNB SHORT 00451795
0045174C  |.  8A06          MOV AL,BYTE PTR DS:[ESI]
0045174E  |.  4F            DEC EDI
0045174F  |.  46            INC ESI
00451750  |.  8807          MOV BYTE PTR DS:[EDI],AL
00451752  |.  EB 41         JMP SHORT 00451795
00451754  |>  8A06          MOV AL,BYTE PTR DS:[ESI]
00451756  |.  4F            DEC EDI
00451757  |.  46            INC ESI
00451758  |.  8807          MOV BYTE PTR DS:[EDI],AL
0045175A  |.  D1E9          SHR ECX,1
0045175C  |.  72 1E         JB SHORT 0045177C
0045175E  |.  49            DEC ECX
0045175F  |.  0BC9          OR ECX,ECX
00451761  |.  74 11         JE SHORT 00451774
00451763  |>  66:8B06       /MOV AX,WORD PTR DS:[ESI]
00451766  |.  83EF 02       |SUB EDI,2
00451769  |.  86E0          |XCHG AL,AH
0045176B  |.  83C6 02       |ADD ESI,2
0045176E  |.  66:8907       |MOV WORD PTR DS:[EDI],AX
00451771  |.  49            |DEC ECX
00451772  |.^ 75 EF         \JNE SHORT 00451763
00451774  |>  8A06          MOV AL,BYTE PTR DS:[ESI]
00451776  |.  4F            DEC EDI
00451777  |.  46            INC ESI
00451778  |.  8807          MOV BYTE PTR DS:[EDI],AL
0045177A  |.  EB 19         JMP SHORT 00451795
0045177C  |>  0BC9          OR ECX,ECX
0045177E  |.  0F84 08010000 JE 0045188C
00451784  |>  66:8B06       /MOV AX,WORD PTR DS:[ESI]
00451787  |.  83EF 02       |SUB EDI,2
0045178A  |.  86E0          |XCHG AL,AH
0045178C  |.  83C6 02       |ADD ESI,2
0045178F  |.  66:8907       |MOV WORD PTR DS:[EDI],AX
00451792  |.  49            |DEC ECX
00451793  |.^ 75 EF         \JNE SHORT 00451784
00451795  |>  E9 F2000000   JMP 0045188C
0045179A  |>  53            PUSH EBX
0045179B  |.  F7C7 01000000 TEST EDI,00000001
004517A1  |.  75 70         JNE SHORT 00451813
004517A3  |.  F7C7 02000000 TEST EDI,00000002
004517A9  |.  75 2D         JNE SHORT 004517D8
004517AB  |.  8BD9          MOV EBX,ECX
004517AD  |.  C1E9 02       SHR ECX,2
004517B0  |.  83E3 03       AND EBX,00000003
004517B3  |.  0BC9          OR ECX,ECX
004517B5  |.  74 0F         JE SHORT 004517C6
004517B7  |>  8B06          /MOV EAX,DWORD PTR DS:[ESI]
004517B9  |.  83EF 04       |SUB EDI,4
004517BC  |.  0FC8          |BSWAP EAX
004517BE  |.  83C6 04       |ADD ESI,4
004517C1  |.  8907          |MOV DWORD PTR DS:[EDI],EAX     ; Выдираем данные и копируем вкуда-то
004517C3  |.  49            |DEC ECX
004517C4  |.^ 75 F1         \JNE SHORT 004517B7
004517C6  |>  0BDB          OR EBX,EBX
004517C8  |.  74 09         JE SHORT 004517D3
004517CA  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]
004517CC  |.  4F            |DEC EDI
004517CD  |.  46            |INC ESI
004517CE  |.  4B            |DEC EBX
004517CF  |.  8807          |MOV BYTE PTR DS:[EDI],AL
004517D1  |.^ 75 F7         \JNE SHORT 004517CA
004517D3  |>  E9 B3000000   JMP 0045188B
004517D8  |>  66:8B06       MOV AX,WORD PTR DS:[ESI]
004517DB  |.  83EF 02       SUB EDI,2
004517DE  |.  86E0          XCHG AL,AH
004517E0  |.  83C6 02       ADD ESI,2
004517E3  |.  66:8907       MOV WORD PTR DS:[EDI],AX
004517E6  |.  83E9 02       SUB ECX,2
004517E9  |.  8BD9          MOV EBX,ECX
004517EB  |.  C1E9 02       SHR ECX,2
004517EE  |.  83E3 03       AND EBX,00000003
004517F1  |.  0BC9          OR ECX,ECX
004517F3  |.  74 0F         JE SHORT 00451804
004517F5  |>  8B06          /MOV EAX,DWORD PTR DS:[ESI]
004517F7  |.  83EF 04       |SUB EDI,4
004517FA  |.  0FC8          |BSWAP EAX
004517FC  |.  83C6 04       |ADD ESI,4
004517FF  |.  8907          |MOV DWORD PTR DS:[EDI],EAX
00451801  |.  49            |DEC ECX
00451802  |.^ 75 F1         \JNE SHORT 004517F5
00451804  |>  0BDB          OR EBX,EBX
00451806  |.  74 09         JE SHORT 00451811
00451808  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]
0045180A  |.  4F            |DEC EDI
0045180B  |.  46            |INC ESI
0045180C  |.  4B            |DEC EBX
0045180D  |.  8807          |MOV BYTE PTR DS:[EDI],AL
0045180F  |.^ 75 F7         \JNE SHORT 00451808
00451811  |>  EB 78         JMP SHORT 0045188B
00451813  |>  F7C7 02000000 TEST EDI,00000002
00451819  |.  74 41         JE SHORT 0045185C
0045181B  |.  8A06          MOV AL,BYTE PTR DS:[ESI]
0045181D  |.  4F            DEC EDI
0045181E  |.  46            INC ESI
0045181F  |.  8807          MOV BYTE PTR DS:[EDI],AL
00451821  |.  66:8B06       MOV AX,WORD PTR DS:[ESI]
00451824  |.  83EF 02       SUB EDI,2
00451827  |.  86E0          XCHG AL,AH
00451829  |.  83C6 02       ADD ESI,2
0045182C  |.  66:8907       MOV WORD PTR DS:[EDI],AX
0045182F  |.  83E9 03       SUB ECX,3
00451832  |.  8BD9          MOV EBX,ECX
00451834  |.  C1E9 02       SHR ECX,2
00451837  |.  83E3 03       AND EBX,00000003
0045183A  |.  0BC9          OR ECX,ECX
0045183C  |.  74 0F         JE SHORT 0045184D
0045183E  |>  8B06          /MOV EAX,DWORD PTR DS:[ESI]
00451840  |.  83EF 04       |SUB EDI,4
00451843  |.  0FC8          |BSWAP EAX
00451845  |.  83C6 04       |ADD ESI,4
00451848  |.  8907          |MOV DWORD PTR DS:[EDI],EAX
0045184A  |.  49            |DEC ECX
0045184B  |.^ 75 F1         \JNE SHORT 0045183E
0045184D  |>  0BDB          OR EBX,EBX
0045184F  |.  74 09         JE SHORT 0045185A
00451851  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]
00451853  |.  4F            |DEC EDI
00451854  |.  46            |INC ESI
00451855  |.  4B            |DEC EBX
00451856  |.  8807          |MOV BYTE PTR DS:[EDI],AL
00451858  |.^ 75 F7         \JNE SHORT 00451851
0045185A  |>  EB 2F         JMP SHORT 0045188B
0045185C  |>  8A06          MOV AL,BYTE PTR DS:[ESI]
0045185E  |.  4F            DEC EDI
0045185F  |.  46            INC ESI
00451860  |.  8807          MOV BYTE PTR DS:[EDI],AL
00451862  |.  49            DEC ECX
00451863  |.  8BD9          MOV EBX,ECX
00451865  |.  C1E9 02       SHR ECX,2
00451868  |.  83E3 03       AND EBX,00000003
0045186B  |.  0BC9          OR ECX,ECX
0045186D  |.  74 0F         JE SHORT 0045187E
0045186F  |>  8B06          /MOV EAX,DWORD PTR DS:[ESI]
00451871  |.  83EF 04       |SUB EDI,4
00451874  |.  0FC8          |BSWAP EAX
00451876  |.  83C6 04       |ADD ESI,4
00451879  |.  8907          |MOV DWORD PTR DS:[EDI],EAX
0045187B  |.  49            |DEC ECX
0045187C  |.^ 75 F1         \JNE SHORT 0045186F
0045187E  |>  0BDB          OR EBX,EBX
00451880  |.  74 09         JE SHORT 0045188B
00451882  |>  8A06          /MOV AL,BYTE PTR DS:[ESI]
00451884  |.  4F            |DEC EDI
00451885  |.  46            |INC ESI
00451886  |.  4B            |DEC EBX
00451887  |.  8807          |MOV BYTE PTR DS:[EDI],AL
00451889  |.^ 75 F7         \JNE SHORT 00451882
0045188B  |>  5B            POP EBX
0045188C  |>  0BD2          OR EDX,EDX
0045188E  |.^ 0F85 72FEFFFF JNE 00451706
00451894  |>  81C7 78563412 ADD EDI,12345678
0045189A  |.  4B            DEC EBX
0045189B  |.^ 0F85 36FEFFFF JNE 004516D7                        ; Пока не отработаем все строчки
004518A1  |.  5F            POP EDI
004518A2  |.  5E            POP ESI
004518A3  |.  5B            POP EBX
004518A4  |.  C9            LEAVE
004518A5  |.  C3            RETN
Прикрепленные файлы:
1 Кб
Загрузок: 1.2K
1.3Мб
Загрузок: 1.2K
49 Кб
Загрузок: 1.2K
3 Кб
Загрузок: 1.2K
78K
19 июня 2013 года
albeoris
20 / / 17.05.2013
Расковырял заголовки кадров:

Word №1 - смещение по OX от мистического центра тяжести, знаковый (влияет только на отображение)
Word №2 - смещение по OY от мистического центра тяжести, знаковый (влияет только на отображение)
Word №3 - ширина кадра, беззнаковый, используется при декодировании (от него зависят данные)
Word №4 - высота кадра, беззнаковый, используется при декодировании (от него не зависят данные)

Теперь, зная ширину и высоту, можно подумать, как распотрошить эти жуткие циферки во вменяемые пиксели... Хотя идей пока нет. Похоже, это не просто RLE.

В конце кадра всегда XX00.

Update:

Что-то мне подсказывает, что изображение, блок которого приведен выше, вот так бьётся по строчкам:

 
Код:
02042E2E2E2E0600
01063C4444442E2E050000
082E44444444443C36040000
083C44444444442E36040000
082E44444444442E36040000
082E3C4444443C36220400
01062E2E3C2E36220500
0204363636220600
Очень напоминает примитивный RLE, где числа меньше, скажем 08 - длина последовательности, а больше - цвета. Проблема в том, что образуются лишние 00, которые не совсем присываются в данную концепцию (да и 08 больше похоже на длину, чем на цвет):

 
Код:
04 04 2E 2E 2E 2E 00 00 00 00 00 00
06 3C 44 44 44 2E 2E 00 00 00 00 00
08 2E 44 44 44 44 44 3C 36 00 00 00 00
08 3C 44 44 44 44 44 2E 36 00 00 00 00
08 2E 44 44 44 44 44 2E 36 00 00 00 00
08 2E 3C 44 44 44 3C 36 22 00 00 00 00
06 2E 2E 3C 2E 36 22 00 00 00 00 00
04 04 36 36 36 22 00 00 00 00 00 00
Отрезать их что ли?.. >_>

Хотя нет, в логике явно есть какая-то ошибка, потому что выше - явно читается красивый кружок. А тут он уже скособочен.

Очень смущали лишние 00 в конце. Но если их отбросить, все кажется достаточно просто:
Вначале идет число либо прозрачных цветов, либо цветов фона (тогда берется следующий байт). В конце, когда добрались до 00, считываем предыдущий байт - число прозрачных\фоновых цветов до конца строки и переход на новую строчку.

Количество 00 в конце может быть обусловлено способом чтения (н.п. добивали до кратности чего-либо, но не факт).

Буду экспериментировать. То что вначале казалось жутким, уже не вызывает суеверного страха.

---

А снежинку я разбил неправильно:
 
Код:
02042E2E2E2E0600
01063C4444442E2E0500
00082E44444444443C360400
00083C44444444442E360400
00082E44444444442E360400
00082E3C4444443C36220400
01062E2E3C2E36220500
0204363636220600
Вот так надо. И нет там лишних 00 на конце. Всем спасибо за внимание и стимуляцию мозговой деятельности. :D

Последнее добавление:

Первый байт: количество прозрачных байт
Второй байт: количество описывающих цвета байт
Если их сумма меньше ширины кадра - за ними идет количество прозрачных байт после и 00.

---
Самая последняя правка:

Пока строчка не завершена, читаем два байта.
Первый - прозрачные байты, второй - значимые байты.
Читаем число значимых байт, уменьшаем оставшееся число пикселей в строчке на число значимых и прозрачных пикселей.

326
15 декабря 2013 года
sadovoya
757 / / 19.11.2005
Столько труда и какая пакость в результате (я о картинке) :)
78K
16 декабря 2013 года
albeoris
20 / / 17.05.2013
Зато сколько знаний и опыта!
Сейчас переписываю игру на Unity3D, с использованием старых ресурсов. Снова учусь. Вся жизнь программиста - познание нового. :)
326
16 декабря 2013 года
sadovoya
757 / / 19.11.2005
Согласен. Без этого она была бы самым нудным из всех ремесел.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог