Автор Тема: My Sega Disassembler  (Прочитано 8020 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
My Sega Disassembler
« : 22 Апрель 2008, 05:49:26 »
Вот решил написать дизасм. Может, кому пригодится.
« Последнее редактирование: 23 Апрель 2008, 01:38:06 от GManiac »

Оффлайн Zephyr

  • Пользователь
  • Сообщений: 544
  • Пол: Мужской
  • coder
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #1 : 22 Апрель 2008, 10:11:02 »
угу  :)

Добавлено позже:
а исходняки не дашь?  :blush:

Оффлайн sergi

  • Пользователь
  • Сообщений: 1650
    • ВКонтакте
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #2 : 22 Апрель 2008, 15:08:53 »
А под винду его скомпилировать нельзя никак? а то этот фар и печатание меня угнетает психологически

+ вопрос - это дизасемблер именно для сеги, или это универсальный для любого кода M68K?
просто хотелось бы под сегу оптимизированный, ну чтобы там графические данные не пытался дизасемблить - как по трафарету и по общей архитектуре рома o_0

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #3 : 22 Апрель 2008, 17:28:00 »
Шутишь? Он и так под винду.
Это дизассемблер именно для сеговского MC68HC000 с его ограничениями и ему подобными, т.е. команды и режимы, недоступные для этого процессора, он не разбирает. Плюс он может читать сеговский заголовок как данные согласно формату, взятому из доки. Как и другие дизасмы.
Последнее предложение некорректно. Ты слышал про Неймановское "команды и данные в одной памяти"??? Статический дизасм дизасмит всё подряд, а отделить код от данных может только человек, и то не факт, что правильно.

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #4 : 22 Апрель 2008, 17:33:30 »
Цитата: GManiac
отделить код от данных может только человек
IDA Pro тоже пытается. =)

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #5 : 22 Апрель 2008, 17:57:35 »
Sergi, если не хочешь писать каждый раз все параметры, можно создать батник и написать туда:
segadasm -a -h -x %1 %2
Потом в файл-менеджере наводишь на батник, Ctrl+J, затем на нужный ром, Ctrl+J и дописываешь асмовое имя.
Или можно задать ассоциации для ромов: в "Моём компьютере": Сервис -> Свойства папки -> Типы файлов, доблавяешь расширение .gen, создаёшь действие "Disassemble", а в нижней строке - действие:
"XXX" -a -h -x %1 %1.asm
где XXX - полный путь к дизасму.
Если это действие по умолчанию, просто щёлкаешь на ром и рядом появляется файл с его дизасмовым кодом.
Какие проблемы?

Цитата
IDA Pro тоже пытается.
Все хорошие дизасмы пытаются. OllyDbg в экзешниках тоже удачно выявляет подпрограммы, циклы и switch-конструкции. Но в нормальных экзешниках чисто данные всегда отделены, а внешние данные вроде графики и пр. вообще часто бывают вне экзешника. А в роме - как угодно. Плюс вычисляемые прыжки для switch в ромах часто не совсем разборчивы, плюс некоторые игры любят пихать кусок кода из рома в оперативку и выполнять его там, плюс код вообще можно создавать. В экзешниках таких трюков нет - винда не позволит и нормальный компилятор так извращаться не будет.
« Последнее редактирование: 22 Апрель 2008, 18:00:45 от GManiac »

Оффлайн sergi

  • Пользователь
  • Сообщений: 1650
    • ВКонтакте
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #6 : 23 Апрель 2008, 00:05:49 »
 <_< ну в общем очередная поделка как мне кажется

лучше я тогда свой напишу и данные от графики и т.п. отделю - только не нужно говорить что это невозможно ;)

Оффлайн aL1eN

  • Пользователь
  • Сообщений: 170
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #7 : 23 Апрель 2008, 00:17:00 »
сорри за оффтоп...
Цитата
В экзешниках таких трюков нет - винда не позволит
есть такие трюки, и винда это позволяет. я могу вообще в один сегмент прогу написать. правда заголовок никуда не денется.
Цитата
и нормальный компилятор так извращаться не будет.
тут ты, в принципе, прав, но что ты подразумеваешь под нормальным компилятором?

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

имхо лень тебе анализатор писать задаром =)

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #8 : 23 Апрель 2008, 01:37:00 »
<_< ну в общем очередная поделка как мне кажется

лучше я тогда свой напишу
Напиши, а то ты всё грозишься что-то сделать... :) Вроде бы собирался писать ассемблер, где он?

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

Цитата
тут ты, в принципе, прав, но что ты подразумеваешь под нормальным компилятором?
Наверно, любой неасмовый, если ты пишешь "нормальную" структурированную программу, а не балуешься с указателями и пр.

Цитата
интересно, как ты позиционируешь свой дизасм. пока он от своих поделок-собратьев отличается только тем, что под винду
Что-то я не пойму, что вы всё "поделка" да "поделка"? :) До этого из консольных дизасмов сеги были входящий в sega-asm и diss от Никодима. Ну, может ещё какие, но они наверно не лучше. В обоих меня не устраивали неточности и кривости, а у diss - ещё очень низкая скорость. Я просто решил исправить это и вообще написал его так, для себя (не в смысле "для своих целей", а для собственного удовлетворения, ну вы поняли).

Цитата
имхо лень тебе анализатор писать задаром =)
При разговоре об анализаторах все сразу вспоминают ИДУ. Я с ней пока не разбирался, но кое-какие её особенности мне не очень. Но конечно, граф. интерфейс и построение графа - это круто. Вот если ты сделаешь мне граф. интерфейс, хотя бы такой текстовый редактор (можно ещё стрелки прыжков, как слева) и подобные окна и код в тултипах, я анализатор наваяю.
Анализатор можно хоть консольный сделать, но кто будет с ним работать?

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #9 : 23 Апрель 2008, 02:34:17 »
лучше я тогда свой напишу и данные от графики и т.п. отделю - только не нужно говорить что это невозможно ;)
Когда запатентуешь свой AI, который будет это делать - сообщи.

В РОМах может быть, ну например, вот так:
(не знаю асма сеги, условно обозначу прыжок как J)

J L1
<data>
L1:
J L2
<data>
L2:
J L3
<code>
L3:
J L4
<data>
L4:
J L5
<code>
L5:

И как ты енто собираешься отделять?
Причём теоретически в некоторых случаях данные могут являться и данными, и кодом, а данные зачастую являются криптованным/сжатым кодом.

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7492
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #10 : 23 Апрель 2008, 05:43:15 »
HoRRoR, пример примитивен. Сложнее вот:
<code>
jsr  PrintString
dc.b 'This is a char string, no a code!',0
<code>
На таком даже IDA спотыкается, а я такое применял еще в 89-90-х годах на компе "Специалист" на кружке. Если спросишь, как это работает - я скажу: при вызове подпрограммы содержимое вершины стека будет показывать прямо на следующую команду, а фактически на текст, останется извлечь его (я испольховал XTHL - обмен [HL] и вершины стека), напечатать нужное и опять обменять вершину стека (еще один XTHL) и все, при возврате адрес будет уже на код за текстом. И таких примеров много.

Оффлайн evgeny

  • Пользователь
  • Сообщений: 1390
  • Пол: Мужской
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #11 : 23 Апрель 2008, 06:23:36 »
Наверное самый лучший способ автодизассемблирования был бы, если дизасм в эмулятор встроен, и по ходу игры все дизассемблировалось постепенно, ну те ветки, в которые программа пока не заглядывала временно забивались нулями , например, чтобы адреса не смещались. т.е. чтобы весь код дизассемблировть это нужно все варианты протестить, все секреты открыть, всю игру пройти и.т.д. но зато должен верный код выйти.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #12 : 23 Апрель 2008, 08:33:14 »
HoRRoR, это самый простой случай. Всё, что может исполниться, то - код. Всё, что не код, то - дата ;) А может исполняться только последовательно за исключением условных прыжков - здесь надо рассмотреть оба варианта.

Дизассемблирование либо по ходу выполнения игры, либо методом просмотра прыжков исключает возможность нахождения недоделанных секретов в играх. Так что сплошной дизасем ещё никому не мешал.
Для меня в чём главный плюс моего дизасма - в том, что за счёт его виндовости можно сделать ассоциацию с расширением рома и прописать в качестве outfile "%1.asm". Потом достаточно нажать на роме Enter, и сразу появляется его дизасм. А с досовскими приходилось перекидывать ром в папку к дизасму или наоборот и немного возиться с командной строкой ("%1.asm" не прокатит из-за досовского ограничения, а обзывать все outfile одним словом неудобно). А потом ещё ждать минуту, пока он дизасмится.  :ohmy:

Добавлено позже:
Цитата
Наверное самый лучший способ автодизассемблирования...
Вообще говоря, нужно и то, и другое, и третье (например, показ дизасма созданного в процессе игры кода, ни один статические дизасм с этим не справится). Но "другое и третье" мне пока не под силу. Хотя всегда есть вариант переделывать Генс, это тоже нелегко.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #13 : 23 Апрель 2008, 09:45:15 »
Цитата
HoRRoR, пример примитивен. Сложнее вот:
Цитата
HoRRoR, это самый простой случай. Всё, что может исполниться, то - код. Всё, что не код, то - дата

GManiac, сам же говоришь :)
Цитата
Дизассемблирование либо по ходу выполнения игры, либо методом просмотра прыжков исключает возможность нахождения недоделанных секретов в играх.
А что, если какой-то кусок кода выполняется один раз за всю игру? Например, при её прохождении или при попадании в секретный уровень? Тогда невозможно понять, где что.

Оффлайн masyanya

  • Пользователь
  • Сообщений: 545
  • Пол: Мужской
  • ...there's no knowledge that is not power...
    • Youtube
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #14 : 23 Апрель 2008, 09:48:22 »
Дизасмов дохрена, и все кому не лень пытаються писать их, имхо это народу не нужно, мож кто интерпритатор напишет нормальный, вот тогда это будет супер.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1650
    • ВКонтакте
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #15 : 23 Апрель 2008, 10:06:22 »
я и так пишу - медленно все делается, ну как умеем
лично пишу и асемблер и дизасемблев вадном флаконе ^_^

только будет под винду из окошек и кнопки будет 2 - асемблить и дизасемблить

при чем что дизасемблил то с асемблю и будет тоже самое + возможность свапа байт и возможность проверки 2 файлов побайтно - ну вдруг есть сомнения что это не тоже самое получится

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

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #16 : 23 Апрель 2008, 12:09:52 »
Дизасмов дохрена, и все кому не лень пытаються писать их, имхо это народу не нужно, мож кто интерпритатор напишет нормальный, вот тогда это будет супер.
С чего-то же надо начинать. Может, тебе сразу эмулятор PS3 замутить?

Добавлено позже:
GManiac, сам же говоришь :)А что, если какой-то кусок кода выполняется один раз за всю игру? Например, при её прохождении или при попадании в секретный уровень? Тогда невозможно понять, где что.
Первая цитата не моя. Если в секретный уровень можно попасть без взлома, то этот код потенциально может выполниться (иначе не бывает), значит, автодизасм его найдёт. Но всё дело портят вычисляемые прыжки, которые есть во многих играх. Я же говорю о секретах, которые не доделали или вместо вызова которых поставлена заглушка. Их может найти только сплошной дизасм или человек. Часть таких секретов описана здесь (где написано "взлом"):
http://emu-russia.km.ru/forum/viewtopic.php?f=21&t=16

Оффлайн HardWareMan

  • Модератор
  • Сообщений: 7492
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #17 : 23 Апрель 2008, 12:23:28 »
Самый косяк в дизасме, он же самый смак в программинге - это табличные переходы. Обычно, это переход по значению в регистре или еще более хитрым методом адресации. В любом случае, тупой дизасм его не возмет - он просто не знает, что может храниться в регистре. Более того, значение регистра может быть взято из таблицы в памяти, адрес которой может вычисляться на ходу, а то и вовсе вычисляться полностью. Здесь справится только человек. Причем, если у ВМ80 это всего одна команда PCHL, у Z80 их три (JP HL, JP IX и JP IY), то у того же М68К их просто тонна. Причем, валидны такие извращенные методы адресации, что неподготовленный человек вообще потухнет!. Я писал в свое время дизасм сеговский, могу дать. Забросил конечно, может его воскресить....

Оффлайн aL1eN

  • Пользователь
  • Сообщений: 170
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #18 : 23 Апрель 2008, 23:50:36 »
все переходы реально выследить (теоретически)
основываясь на архитектуре интелов, могу сказать, что реально дизассемблировать программу, начиная от точки входа, и двигаясь по логике исполнения (запоминая все переходы, и потом возвращаясь к ним). тем более, что все возможные способы переходов мы знаем.
да и дисасмить, пора бы уже, интерактивно

Цитата
Насчёт создания кода что-то не помню... или у программы должны быть определённые привилегии.
можно.... даже привилегий никаких не надо

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

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: My Sega Disassembler
« Ответ #19 : 24 Апрель 2008, 00:29:44 »
Частные случаи я уже разжеал на эму-раше. aL1eN, всё отнюдь не так просто. Если имеется в виду статический дизасм, который ничего не знает о значениях памяти/регистров, надо извращаться. Если интерпретатор, можно получить только то, что выполнится, но останется ещё то, что не выполнилось, но куда не был табличный переход.