Chief-NET

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Chief-NET » Базовый хакинг » Помогите новичку с переводом


Помогите новичку с переводом

Сообщений 81 страница 100 из 152

81

Патч v1.3 для Castlevania II: Belmont's Revenge
Castlevania II - Belmont's Revenge (U) [!] [T+Rus_Ace Lightning v1.3].exe

Изменения:
-Слово "ВРЕМЯ" заменено на изображение часов
-Изменен шрифт
-Запятая придвинута ближе к букве, после которой она стоит

Отредактировано Ace Lightning (2011-05-08 17:11:29)

82

В Castlevania: Legends никак не могу найти титульный экран в тайловом редакторе... это признак того, что графика сжата?

83

В Castlevania: Legends никак не могу найти титульный экран в тайловом редакторе... это признак того, что графика сжата?

Либо сжата, либо не в том формате ищешь.
Если есть проблемы с нахождением картинки, можно поискать Поганкой или аналогичным корруптером.

Отредактировано TrickZter (2011-05-13 11:54:30)

84

Самый простой способ - посмотреть содержимое видеопамяти во время заставки и найти такую же последовательность байт в РОМЕ.

85

Самый простой способ - посмотреть содержимое видеопамяти во время заставки и найти такую же последовательность байт в РОМЕ.

Если графика пожата, то там совсем другая последовательность  :)

86

Смотря чем она пожата, если LZ, то первые уникальные идущие подряд 3-4 байта будут совпадать - проверено.

А какая платформа-то,  GB?

Отредактировано alex_231 (2011-05-13 14:16:46)

87

Нашел - графика пожата, данные начинаются с 0x28C47, начало пакета - ориентировочно 0x28C46, но некогда разбираться, алгоритм - разновидность LZ, не очень сложный.

Отредактировано alex_231 (2011-05-14 14:24:23)

88

Смотря чем она пожата, если LZ, то первые уникальные идущие подряд 3-4 байта будут совпадать - проверено.

LZ тоже бывает разный. Если LZ78, то может и не быть, а с LZ77, конечно, будут совпадать - это особенность алгоритма.

Отредактировано TrickZter (2011-05-13 16:18:03)

89

Сжатая графика - это уже другой раздел форума, но вы не могли бы пояснить немного как вы смогли определить метод сжатия?

И ещё, как я понимаю, чтобы разжать графику нужно написать распаковщик? Но как именно узнать алгоритм сжатия? Из дебаггера? Тогда ещё один вопрос: как в самом отладчике поймать эту самую процедуру разжатия графики?

90

Алгоритм LZ сжатия легко определяется "на глаз" - достаточно сравнить несжатое изображение со сжатым. Например в LZ77 на ГБА алгоритм такой:

Заголовок из 4-х байт
1 флаговый байт
8 блоков
1 флаговый байт
8 блоков
1 флаговый байт
8 блоков
и т.д.

Заголовок представляет из себя 4-ку байт, первый из которых обязательно равен h10, три других байта - это размер запакованных данных.

Биты флагового байта указывают нам какого типа блоки идут после него, если бит равен 0, значит идёт 1 не пожатый байт, если же равен 1, то идёт пара байт сжатия.
Допустим флаговый байт равен h44, представим его в двоичном виде: 01000100
Это значит что сначала идёт 1 несжатый байт, потом идёт пара байт сжатия, потом идёт 3 несжатых байта, потом опять пара сжатия, потом ещё два несжатых байта.

Что представляет из себя пара сжатия? Это количество копируемых байтов и смещение (отсылка назад) - указатель с какого байта начинать копирование. Рассмотрим пример, допустим пара байт сжатия у нас такая: 80 01, представим её в двоичном виде:
10000000 00000001
Подчёркнутые биты - это длина отрезка, остальные - это смещение.
1000 в десятичном виде - это 8, добавляем к нему 3 и получаем длину копируемого отрезка - 11 байт. 000000000001 в десятичном виде - это 1, добавляем к нему 1 и получаем величину смещения 2, то есть копировать байты нужно начиная с 2-го байта с конца.

Отредактировано TrickZter (2011-05-14 07:22:52)

91

Неясным для меня остаётся то, как alex_231 нашёл точное расположение титульного экрана в роме?

92

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

1 флаговый байт
8 блоков
1 флаговый байт
8 блоков
1 флаговый байт
8 блоков
и т.д.

1-й байт - флаговый в обратном порядке (1-байт,0-код), например:
по байту FD (11111101) блоки идут так:

11111101
87654321

обработка блоков:
1-й блок - 1байт копируется без каких-либо операций
2-й блок - 2байта - код отправляющий копировать определенное число байт из указанного места
3-й блок - 1байт копируется без каких-либо операций
4-й блок - 1байт копируется без каких-либо операций
5-й блок - 1байт копируется без каких-либо операций
6-й блок - 1байт копируется без каких-либо операций
7-й блок - 1байт копируется без каких-либо операций
8-й блок - 1байт копируется без каких-либо операций
затем опять читается флаговый байт и всё по-новой.

Обработка кода:
2 байта:
0000|1010|0000|0001
0123 4567 89AB CDEF

биты BCDEF - количество копируемых байт из исходника, для копирования увеличивается на 2 (в примере будет скопировано 3 байта)

биты 01234567 - указатель на исходник для копирования
однако к значению 0123 (в примере: 0) нужно прибавить 2, и к значению 4567 (в примере: 10) тоже нужно прибавить 2, таким образом в примере получается, что будет скопировано 3 байта начиная с h2С от начала пакета.

Назначение бит 89A мне пока не ясно.

Однако:
вариант E261
1110|0000|0110|0001
0123 4567 89AB CDEF

ссылается на 2-й байт от начала пакета:
1110 = hE + h2 = h10, 0000 = 0 + 2 = 2, а так как
_1__0____2
_1|0000|0010
-1|0123|4567
то, значение десятков отбрасывается.
Причём, я заметил, что когда биты 012 = 111, то биты 89A = 011.

93

Я же сказал: посмотреть в памяти эмулятора как выглядит графика заставки в незапакованном виде и попробовать найти часть последовательности в роме.
Я искал так:
1. запустил игру,
2. дождался заставки,
3. открыл окно Tile Viewer, чтобы узнать в каком месте памяти лежит искомая графика (0x8800),
4. открыл окно Memory viewer, перешел по найденному адресу
5. открыл ром в Translhextion,
6. задал HEX-поиск: 0F103020 (идущие подряд четыре уникальных неповторяющихся байта недалеко от адреса 0x8800 из видеопамяти)
7. нашел искомую комбинацию по адресу 0x28C53,
а дальше - откатился по рому назад, до начала пакета, сопоставляя ром и содержимое видеопамяти.

Кстати графика заставки побита на две части. вторую сможешь сам найти по описанной методике? ;)

94

Да, сумел найти. Вторая часть располагается с адреса  0x2869D. Чтож, теперь осталось разобраться с алгоритмом сжатия.. а то я не сильно въезжаю пока в то, что вы написали про него выше   :wacko:

Отредактировано Ace Lightning (2011-05-14 17:46:51)

95

а то я не сильно въезжаю пока в то, что вы написали про него выше   :wacko:

В мой пост можешь особо не вникать, там про другой алгоритм сказано. А если когда и надо будет его распаковать (LZ в GBA и NDS играх) - обращайся ко мне, дам тулзу, которая сама находит все пожатые данные. Я её пока не публикую, так как ещё не все задуманные фишки доделал  :rolleyes:

Отредактировано TrickZter (2011-05-14 18:04:36)

96

Обязательно обращусь:)

97

Вот не сжатая последовательность байт (в памяти эмулятора):
03 02 01 01 00 00 00 00 00 00 01 01 0F 0F 10 30
курсивом обозначил байты, которые были сжаты

Вот сжатая последовательность (в самом роме):
03 02 03 02 01 01 00 E4 62 FF 01 01 0F 0F 10
А вот эти байты, которые я выдели жирным, видимо отвечают за сжатие.

Запишем их так:
1110 0100 0110 0010

E+2=10
4+2=6

00010=2
2+2=4

Получается, что копируется 4 байта с адреса h06 от начала пакета. Но Что-то как-то не вяжется, т.к мне нужно скопировать 5 байт.. или я чего-то не понимаю?

P.S. Да, и ещё меня напрягают некоторые байты, которые находятся в изначальной последовательности, но их нет, когда я просматриваю уже разжатую последовательность в эмуляторе. Вот как раз в данном примере в последовательности откуда-то взялся байт FF:
03 02 03 02 01 01 00 E4 62 FF 01 01 0F 0F 10

Я посмотрел чуть ниже, там ещё встречался байт FB..

98

Вот сжатая последовательность (в самом роме):
03 02 03 02 01 01 00 E4 62 FF 01 01 0F 0F 10

Ты забыл ещё флаговый байт, который стоит перед первым байтом пожатой картинки. И кстати почему в разжатой картинке у тебя 03 02, а не 03 02 03 02? Разжатую ты, похоже, тоже не с начала смотришь.

Вот как раз в данном примере в последовательности откуда-то взялся байт FF:
03 02 03 02 01 01 00 E4 62 FF 01 01 0F 0F 10

FF - как раз флаговый байт. В нём бит равный единице означает, что идёт несжатый байт, а 0 - пара байт сжатия. То есть, если стоит FF, значит последующие 8 байт не сжаты. Затем идёт ещё один флаговый байт и т.д.

2+2=4

Получается, что копируется 4 байта с адреса h06 от начала пакета. Но Что-то как-то не вяжется, т.к мне нужно скопировать 5 байт.. или я чего-то не понимаю?

Значит нужно добавлять не 2, а 3. И это было бы разумнее с точки зрения эффективности алгоритма сжатия. Сам посуди, какой смысл сжимать 2 байта двумя же байтами? Никакого. С точки зрения эффективности лучше всего за 0 принять длину в три байта. На ГБА, кстати, как раз и прибавляется 3.

Отредактировано TrickZter (2011-05-15 06:11:20)

99

Ты забыл ещё флаговый байт, который стоит перед первым байтом пожатой картинки.


Перед всей последовательностью стоит 7F=01111111, т.е. теперь понятно, что последний байт сжимается.

И кстати почему в разжатой картинке у тебя 03 02, а не 03 02 03 02? Разжатую ты, похоже, тоже не с начала смотришь.

Ой.. тут я просто опечатался) правильнее, конечно, будет 03 02 03 02..

Вообще занятная вещь эти алгоритмы сжатия.. теперь мне в принципе всё понятно. А дальше для удобства нужно написать программу для разжатия? Давно я программ не писал, которые работают с файлами.. думаю Visual Basic подойдёт для этих целей?

100

А дальше для удобства нужно написать программу для разжатия?

Да, для разжатия и для сжатия.

думаю Visual Basic подойдёт для этих целей?

Подойдёт любой язык программирования :)


Вы здесь » Chief-NET » Базовый хакинг » Помогите новичку с переводом