форум группы Chief-Net » » Экстрим хакинг » Сжатие в NES играх

Страниц (1): [1]
 

1. alex_231 - 10 Февраля, 2016 - 07:44:43 - перейти к сообщению
alex_231
Встречался ли кто-нибудь со сжатием в NES-овских играх?
Приведите, пожалуйста, примеры.
P.S.: вопрос вызывает профессиональный интерес.
2. Guyver - 10 Февраля, 2016 - 07:45:12 - перейти к сообщению
Guyver
А ещё лучше скажите - кто-нибудь видет как текст сжимают в графике (?) - мне это очень интересно... Запакованная графика, а на самом деле текст - такое может быть?
3. alex_231 - 10 Февраля, 2016 - 07:45:30 - перейти к сообщению
alex_231
Ты не очень правильно понял что такое сжатие.
Оно может быть как графическое, так и текстовое - всё одним алгоритмом пожато (например, в Chrono Trigger'е используется 1 алгоритм сжатия, а жмётся всё подряд: текст, графика, карты и т.д.)
4. chiefexb - 10 Февраля, 2016 - 07:45:51 - перейти к сообщению
chiefexb
Сжатие в НЕС, видел по тексту.
The Adventure in magic kingdom.nes мте кодировка.
есть словарь наиболее употребимых слов, и в игре они вызываются двумя байтами f6(f7)<номер слова в словаре>
Final fantazy.nes (первая часть финалки на нес) DTE слоговое сжатие. со словарем слогов.
по графике:
Duck tales 2.nes если там он и не сжат просмотреть его очень проблематично. Надо пробовать джиновкий tilemapper.
Пока все.
5. chiefexb - 10 Февраля, 2016 - 07:46:24 - перейти к сообщению
chiefexb
Цитата:
А ещё лучше скажите - кто-нибудь видет как текст сжимают в графике (?) - мне это очень интересно... Запакованная графика, а на самом деле текст - такое может быть?


Таких вещей я не видел может речь об алгоритме сжатия, что графика, что текст это последовательность байтов. И ее можно сжать разными алгоритмами.
Пример: Пример картинку можно сжать Winrar, а можно и Jpeg. А текст можно сжать архиватором ha.exe будет лучше даже чем рар. Проведи аналогии к хакингу.
Что касается текста в графике, это прям из james bond'a есть вариант в картинке написать послание в хексредакторе. это и будет скрытый текст, но к хакингу это не имеет отношения.
6. Guyver - 10 Февраля, 2016 - 07:46:54 - перейти к сообщению
Guyver
Ну ладно, а как вы например приходите к выводу - что и как в игре пожато... Как находите алгоритм сжатия или в словарной системе как разбираетесь - какой там алгоритм - я вот беру игру - и не могу определить, что да как в ней пожато или как слова из словаря вызываются в игре (?)... Что делать - какой план работ должет быть, этапы так сказать поиска решений...
У меня вот что в игре есть, пусть там например такой текст:
Вышел Ваня погулять
Чтоб врагам накостылять
Этот Ваня очень крут
Носит он с собою кнут
Так вот - я нахожу и перевожу без проблем следующее
--------- Ваня погулять
--------- накостылять
--------- очень крут
--------- собою кнут
Причем весь текст в роме идет по-порядку:
Ваня погулять накостылять очень крут собою кнут
А для слов -------- Вообще получается нет места в роме, и как они попадают тогда в игру??? Получается экран делится наполовину - в правой части все слова текста идут друг за другом по-порядку в роме - они не пожаты и их легко найти, а левую часть я как не искал - не нашёл... Уж очень сильно её зашифровали разработчики ;о)
7. Guyver - 10 Февраля, 2016 - 07:47:19 - перейти к сообщению
Guyver
В общем я игру перевёл на 90%, а потом бросил - так и не одолел пока...
У меня игр переведённых процентов на 80-90 уже много, но я их бросаю - потому что сталкиваюсь с неразрешимыми МНОЮ проблемами, а недопереводы плодить не хочется - вот уже пол-года у меня ни одного перевода нового нет <:о) Эх - учиться надо преодолевать трудности, а временя мало!!!
8. alex_231 - 10 Февраля, 2016 - 07:47:47 - перейти к сообщению
alex_231
Цитата:
Сжатие в НЕС, видел по тексту.
The Adventure in magic kingdom.nes мте кодировка.
есть словарь наиболее употребимых слов, и в игре они вызываются двумя байтами f6(f7)<номер слова в словаре>
Final fantazy.nes (первая часть финалки на нес) DTE слоговое сжатие. со словарем слогов.
по графике:
Duck tales 2.nes если там он и не сжат просмотреть его очень проблематично. Надо пробовать джиновкий tilemapper.
Пока все.


Нет, MTE и DTE я сжатием не считаю (сугубо личное мнение, так как они ломаются на ура), я в вопросе имел ввиду конкретное сжатие в пакеты.
9. alex_231 - 10 Февраля, 2016 - 07:48:08 - перейти к сообщению
alex_231
Цитата:
...а как вы например приходите к выводу - что и как в игре пожато... Как находите алгоритм сжатия или в словарной системе как разбираетесь - какой там алгоритм - я вот беру игру - и не могу определить, что да как в ней пожато или как слова из словаря вызываются в игре (?)... Что делать - какой план работ должет быть, этапы так сказать поиска решений...


Для каждой игры по своему, но нужно знание ассемблера, или наличие программиста (со знанием ассемблера)
А для поиска словаря и работы с ним где-то я видел доку, по-моему на мэджиктиме.
Как игра называется, которую ты переводишь?
Может чем помогу, всё равно пока перевожу тексты, дома делать практически нечего.
10. chiefexb - 10 Февраля, 2016 - 07:48:56 - перейти к сообщению
chiefexb
Цитата:


У меня вот что в игре есть, пусть там например такой текст:

Вышел Ваня погулять
Чтоб врагам накостылять
Этот Ваня очень крут
Носит он с собою кнут

Так вот - я нахожу и перевожу без проблем следующее

--------- Ваня погулять
--------- накостылять
--------- очень крут
--------- собою кнут


надо смотреть РОМ в hex-редакторе как правило там будет подобное:

CODE:
F601 Ваня погулять
F602 F603накостылять
F604 F605 очень крут
F606 F607 собою кнут


И ГДЕ ТО В РОМЕ ЕСТЬ ПОДОБНОЕ:

CODE:
вышелFFчтобFFврагамFFэтотFFваняFFноситFFон


Это словарная система система как искать словарь: как правило словарь и текст закодированны одной кодировкой поискать слова "вышел", "чтоб", и т. д.

Я так нашел в Adventure in Magic kingdom
словарь.
Далее я начал переводить фразы заменяя слова словаря на нужные мне по тексту слова, но тут нужно знание поинтеров. Иначе толку от словарного сжатия. Я вбил в этот словарь много длинных слов и получил выгрыш в месте.
как вбивал текст:

в моем случае коду слова предшествовали байты f6(f7)проанализировав словарь и текст я пришел к выводу, что коды слова так и идут попарядку, т.е. не указатель на место в роме а просто первое, второе слово. А байт f6 -вывод слова с пробелом, f7-без пробела. и начал вбивать перевод в Gold finger.

11. chiefexb - 10 Февраля, 2016 - 08:12:04 - перейти к сообщению
chiefexb
Цитата:
В общем я игру перевёл на 90%, а потом бросил - так и не одолел пока...
У меня игр переведённых процентов на 80-90 уже много, но я их бросаю - потому что сталкиваюсь с неразрешимыми МНОЮ проблемами, а недопереводы плодить не хочется - вот уже пол-года у меня ни одного перевода нового нет <:о) Эх - учиться надо преодолевать трудности, а временя мало!!!


Я могу тебе помочь с доделкой этих игр. Примешь мою помощь.
12. alex_231 - 10 Февраля, 2016 - 08:15:02 - перейти к сообщению
alex_231
Сейчас все как кинутся помогать, так получится, как в той поговорке.
13. Guyver - 10 Февраля, 2016 - 08:15:30 - перейти к сообщению
Guyver
Да ладно - я сам доделать их надеюсь, вот только будет свободное время с ними разобраться - как правило у меня одна проблема - просто не могу найти часть текста, в основном на заставках или в меню...
Вот у меня есть почти переведённая игра про рыбалку (моя самая любимая на нес) - я там не могу найти несколько слов буквально... Если нужно - могу кинуть на мыло... Я просто не знаю - как их найти, хотя подозреваю, что это легко - просто я такой тормоз <:о)
14. Guyver - 10 Февраля, 2016 - 08:15:49 - перейти к сообщению
Guyver
Я, кстати, к своему огромному стыду подвожу одного человека - он мне прислал свои наработки из игры КРИСТАЛИС на гейм бой колор - взломал её как мог - есть всё - и поинтеры все известны - вставляй текст как хочешь, лишь бы не превышал 15 символов в строке... Одна беда - текста там ОЧЕНЬ много... Я перевёл процентов 53 - и всё, склеил ласты... Уже пол-года к ней не подхожу - а он ждёт результатов... Надеется на мою совесть... Эх... А вот тоже так взялся помогать... Плохо быть неответственным...
15. chiefexb - 10 Февраля, 2016 - 08:16:21 - перейти к сообщению
chiefexb
Сбрасывай на мыло я прям сейчас гляну и скажу смогу тебе помочь или нет.
здесь и мыло и аська
16. alex_231 - 10 Февраля, 2016 - 08:16:57 - перейти к сообщению
alex_231
Можешь и мне кинуть, я тут всё равно по вечерам без дела маюсь.
17. alex_231 - 10 Февраля, 2016 - 08:19:20 - перейти к сообщению
alex_231
Да, товарищи, решил вынести на всеобщее обозрение вопрос темы:
на восьмибитных консолях, я лично, кроме пресловутого RLE-сжатия никакого другого алгоритма не видел, только на Sega Master System оно немного посложнее, а на NES вообще - проще пареной репы.
P.S.: по желанию, могу описать оба алгоритма, спрашивайте, если кому надо.
18. CaHbl4 - 10 Февраля, 2016 - 08:19:50 - перейти к сообщению
CaHbl4
Bee 52(U).nes - давно ещё хотел её перевести(графика очень красивая, да игруха классная), да по ходу дела там графика вся пожата (правильнее сказать закодирована) ХЗ каким способом...
19. Griever - 10 Февраля, 2016 - 08:20:15 - перейти к сообщению
Griever
Цитата:
на восьмибитных консолях, я лично, кроме пресловутого RLE-сжатия никакого другого алгоритма не видел


Ты видел на текст в Dragon Warrior 2? :huh:
Кстати, CaHbl4, задавал вопрос на шедевре. Я тоже бы хотел увидеть сырцы какого-нибудь packer/unpacker'a. Пусть даже для DTE
Ты как Alex?
20. alex_231 - 10 Февраля, 2016 - 08:20:41 - перейти к сообщению
alex_231
Да, я видел текст в Dragon Warrior 2, даже нашел, где находятся запакованные тексты (но не записал и пока не полностью разобрался в коде).
Bee 52(U).nes - говорите, погляжу.
DTE алгоритм довольно прост, у меня в скриптере для Chrono Trigger используется алгоритм MTE (что по сути одно и то же, то есть закодировав MTE, можно не кодировать DTE).
С собой нет, но показать могу (попозже).
21. Griever - 10 Февраля, 2016 - 09:39:14 - перейти к сообщению
Griever
Цитата:
даже нашел, где находятся запакованные тексты

Это ты про байты в районе $B4B9?
Цитата:
С собой нет, но показать могу (попозже).


Вот это было бы здорово! Укатываюсь
22. alex_231 - 10 Февраля, 2016 - 09:39:55 - перейти к сообщению
alex_231
Нет, там хранится таблица MTE, а текст в районе $14C00

Извлечение:
CODE:
//Названия домов
memo2.Lines.add('{Названия домов}');
label6.caption:='Извлечение Названия домов';
refresh;
dialogpoint:=456194;     //адрес первого поинтера (не используется,так на всякий случай)
dicbuf:=1;     //номер буфера (чисто для ориентации)
dicrow:=7;     //номер таблицы в буфере
diccol:=62978;     //адрес поинтера в таблице (в буфере)
decpoint:=(ord(buf1[dicrow,diccol+2])+2)*256+ord(buf1[dicrow,diccol+1])+1;     //адрес начала текста в таблице (в буфере)
s:='';     //обнуление строки
for i:=1 to 111 do begin     // всего 111 сообщений в блоке
progressbar1.position:=progressbar1.position+1;
s:=buf1[dicrow,decpoint];     //ну это так для страховки
st:='';     //обнуление подстроки
while ord(s[1])<>0 do begin
s:=buf1[dicrow,decpoint];
if ord(s[1])<160 then st:=st+dictionary[ord(s[1])] else     //dictionary - таблица MTE (от 0 до 159, в соответствии с кодами)
st:=st+coder(s);     //coder - функция применения таблицы кодировки (перевод в английский)
inc(decpoint,1);
end;
decpoint:=(ord(buf1[dicrow,diccol+2+(2*i)])+2)*256+ord(buf1[dicrow,diccol+1+(2*i)])+1;     //вычисляется адрес для следующего сообщения
memo2.Lines.add(st);
end;


Возвращение:
CODE:
full:
msgscount:=1;     //счетчик сообщений
setlength(msgs,msgscount);     //msgs - массив встречавшихся ранее сообщений
case dicbuf of     //dicbuf - номер буфера
1: decpoint:=(ord(buf1[dicrow,diccol+2])+2)*256+ord(buf1[dicrow,diccol+1])+1;     //адрес (глобальный) первого сообщения для первого буфера (он остается тот же, что и раньше)
...
8: decpoint:=(ord(buf8[dicrow,diccol+2])+2)*256+ord(buf8[dicrow,diccol+1])+1;     //адрес (глобальный) первого сообщения для восьмого буфера (он остается тот же, что и раньше)
end;
n:=0;     //локальный индикатор использования таблицы MTE, используется ниже (должен быть Boolean, но как-то я об этом тогда не подумал)
fullbeg:
case dicbuf of
1:buf1[dicrow,diccol+1]:=chr((decpoint-1)mod 256);     //записывается старший байт поинтера
.
.
8:buf8[dicrow,diccol+1]:=chr((decpoint-1)mod 256);
end;
case dicbuf of
1:buf1[dicrow,diccol+2]:=chr(trunc(((decpoint-1)/256)-2));     //записывается младший байт поинтера
.
.
8:buf8[dicrow,diccol+2]:=chr(trunc(((decpoint-1)/256)-2));
end;
if memo3.lines.strings[rowcount]<>'' then begin     //если строка в memo не пустая, то начинается обработка
msgsind:=0;     //локальный индикатор повторяющегося сообщения
for i:=1 to msgscount do begin
if (msgsind=0)and(memo3.lines.strings[rowcount]=msgs[i-1]) then begin
msint:=i;     //номер уже использованного сообщения, которое вводится повторно
case dicbuf of
1:buf1[dicrow,diccol+1]:=buf1[dicrow,diccol-((msgscount-i)*2)+1];     //записывается старший байт поинтера из уже записанного ранее
.
.
8:buf8[dicrow,diccol+1]:=buf8[dicrow,diccol-((msgscount-i)*2)+1];
end;
case dicbuf of
1:buf1[dicrow,diccol+2]:=buf1[dicrow,diccol-((msgscount-i)*2)+2];     //записывается младший байт поинтера из уже записанного ранее
.
.
8:buf8[dicrow,diccol+2]:=buf8[dicrow,diccol-((msgscount-i)*2)+2];
end;
msgsind:=1;     //есть повторение
end;
end;
if msgsind=1 then begin
msgs[msgscount-1]:=msgs[msint];
inc(msgscount);
setlength(msgs,msgscount);
end;
if msgsind=0 then begin
s:=memo3.lines.strings[rowcount];     //rowcount - номер строки в memo
msgs[msgscount-1]:=s;
inc(msgscount);
setlength(msgs,msgscount);
i:=1;
while i<=length(s) do begin
if s[i]='<' then begin     //обработка управляющих кодов, выделенных <ХХ>
case dicbuf of
1:buf1[dicrow,decpoint]:=chr(strtoint(copy(s,i+1,2)));
.
.
8:buf8[dicrow,decpoint]:=chr(strtoint(copy(s,i+1,2)));
end;
inc(decpoint);
if decpoint>65536 then begin     //размер таблицы в буфере 65536
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
inc(i,4);
end else begin
for j:=1 to 159 do begin     //обработка словаря MTE
if (n=0)and(pos(dictionary[j],s)=i)then
begin
n:=1;
p:=j;
l:=length(dictionary[j]);
delete(s,i,l);
insert(chr(p),s,i);
{end else
if (n=0)and(pos('...',s)=i)then
begin
n:=1;
p:=241;
l:=3;
delete(s,i,l);
insert(chr(p),s,i);}
end;
end;
if n=1 then begin
n:=0;
inc(i);
case dicbuf of
1:buf1[dicrow,decpoint]:=chr(p);
.
.
8:buf8[dicrow,decpoint]:=chr(p);
end;
inc(decpoint);
if decpoint>65536 then begin
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
end else begin
case dicbuf of
1:buf1[dicrow,decpoint]:=decoder(s[i])[1];
.
.
8:buf8[dicrow,decpoint]:=decoder(s[i])[1];
end;
inc(decpoint);
if decpoint>65536 then begin
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
inc(i);
end;
end;
end;
case dicbuf of
1:buf1[dicrow,decpoint]:=chr(0);
.
.
8:buf8[dicrow,decpoint]:=chr(0);
end;
inc(decpoint);
if decpoint>65536 then begin
decpoint:=1;
inc(dicrow);
if dicrow>8 then begin
dicrow:=1;
inc(dicbuf);
end;
end;
end;
end else begin
case dicbuf of
1:buf1[dicrow,diccol+1]:=chr((decpoint-2)mod 256);
.
.
8:buf8[dicrow,diccol+1]:=chr((decpoint-2)mod 256);
end;
case dicbuf of
1:buf1[dicrow,diccol+2]:=chr(trunc(((decpoint-2)/256)-2));
.
.
8:buf8[dicrow,diccol+2]:=chr(trunc(((decpoint-2)/256)-2));
end;
end;
inc(rowcount);
inc(diccol,2);
progressbar1.position:=rowcount;
if memo3.lines.strings[rowcount]='' then goto fullbeg;
if memo3.lines.strings[rowcount][1]='{' then
goto beg else goto fullbeg;

en:
end;

Я тут кое-что лишнее повырезал, а то много слишком получается, а кое-где не успел описание написать, завтра дополню, если что не понятно.
23. Griever - 10 Февраля, 2016 - 09:40:20 - перейти к сообщению
Griever
Шокирован Вот это ни хрена себе! Честно говоря, думал будет несколько проще...
Мне в этом месяца три разбираться...
Большое спасибо!
24. alex_231 - 10 Февраля, 2016 - 09:40:38 - перейти к сообщению
alex_231
Да тут, вроде, ничего сложного нет, просто много различных условий и все.
25. Griever - 10 Февраля, 2016 - 09:40:58 - перейти к сообщению
Griever
Нда, я просто раньше имел дело с чистым паскалем и с соответствующей спецификой программ - в области прикладной математики... Улыбка
26. chiefexb - 10 Февраля, 2016 - 09:41:18 - перейти к сообщению
chiefexb
А это чистый паскаль просто построенный а объектах Win
27. alex_231 - 10 Февраля, 2016 - 09:41:41 - перейти к сообщению
alex_231
Цитата:
Ты видел на текст в Dragon Warrior 2? :huh:


А теперь я полностью разобрался в алгоритме сжатия текста, пишу программу (точнее дописываю, так как она уже частично вынимать умеет, осталось поинтеры обработать).

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®