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
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 - высота кадра, беззнаковый, используется при декодировании (от него не зависят данные)
Word[] 18h 180h
Update:
Word №1 - смещение по OX от мистического центра тяжести, знаковый (влияет только на отображение)
Word №2 - смещение по OY от мистического центра тяжести, знаковый (влияет только на отображение)
Word №3 - ширина кадра, беззнаковый, используется при декодировании (от него зависят данные)
Word №4 - высота кадра, беззнаковый, используется при декодировании (от него не зависят данные)
Код:
// Палитра из 64 значений. RGBA. A - всегда 00.
Dword[] 198h 100h
Dword[] 198h 100h
Код:
// Каждый кадр описывается одним значением - смещение на начало данных от 358h
Dword[] 298h C0h
Dword[] 298h C0h
Самый маленький (в приложенном файле Snow.dlr) выглядит так:
Код:
Длина: 54h(84) байта
Заголовок кадра: 8400 5C00 0C00 0800
Кадр:
02042E2E2E2E060001063C4444442E2E050000082E44444444443C36040000083C44444444442E360400
00082E44444444442E36040000082E3C4444443C3622040001062E2E3C2E362205000204363636220600
Заголовок кадра: 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
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
Word №1 - смещение по OX от мистического центра тяжести, знаковый (влияет только на отображение)
Word №2 - смещение по OY от мистического центра тяжести, знаковый (влияет только на отображение)
Word №3 - ширина кадра, беззнаковый, используется при декодировании (от него зависят данные)
Word №4 - высота кадра, беззнаковый, используется при декодировании (от него не зависят данные)
Теперь, зная ширину и высоту, можно подумать, как распотрошить эти жуткие циферки во вменяемые пиксели... Хотя идей пока нет. Похоже, это не просто RLE.
В конце кадра всегда XX00.
Update:
Что-то мне подсказывает, что изображение, блок которого приведен выше, вот так бьётся по строчкам:
Код:
02042E2E2E2E0600
01063C4444442E2E050000
082E44444444443C36040000
083C44444444442E36040000
082E44444444442E36040000
082E3C4444443C36220400
01062E2E3C2E36220500
0204363636220600
01063C4444442E2E050000
082E44444444443C36040000
083C44444444442E36040000
082E44444444442E36040000
082E3C4444443C36220400
01062E2E3C2E36220500
0204363636220600
Код:
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
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
01063C4444442E2E0500
00082E44444444443C360400
00083C44444444442E360400
00082E44444444442E360400
00082E3C4444443C36220400
01062E2E3C2E36220500
0204363636220600
Последнее добавление:
Первый байт: количество прозрачных байт
Второй байт: количество описывающих цвета байт
Если их сумма меньше ширины кадра - за ними идет количество прозрачных байт после и 00.
---
Самая последняя правка:
Пока строчка не завершена, читаем два байта.
Первый - прозрачные байты, второй - значимые байты.
Читаем число значимых байт, уменьшаем оставшееся число пикселей в строчке на число значимых и прозрачных пикселей.
Столько труда и какая пакость в результате (я о картинке) :)
Сейчас переписываю игру на Unity3D, с использованием старых ресурсов. Снова учусь. Вся жизнь программиста - познание нового. :)
Согласен. Без этого она была бы самым нудным из всех ремесел.