| Разработка и ромхакинг > Ромхакинг и программирование |
| My Sega Disassembler |
| (1/1) |
| GManiac:
Вот решил написать дизасм. Может, кому пригодится. |
| Zephyr:
угу :) Добавлено позже: а исходняки не дашь? :blush: |
| sergi:
А под винду его скомпилировать нельзя никак? а то этот фар и печатание меня угнетает психологически + вопрос - это дизасемблер именно для сеги, или это универсальный для любого кода M68K? просто хотелось бы под сегу оптимизированный, ну чтобы там графические данные не пытался дизасемблить - как по трафарету и по общей архитектуре рома o_0 |
| GManiac:
Шутишь? Он и так под винду. Это дизассемблер именно для сеговского MC68HC000 с его ограничениями и ему подобными, т.е. команды и режимы, недоступные для этого процессора, он не разбирает. Плюс он может читать сеговский заголовок как данные согласно формату, взятому из доки. Как и другие дизасмы. Последнее предложение некорректно. Ты слышал про Неймановское "команды и данные в одной памяти"??? Статический дизасм дизасмит всё подряд, а отделить код от данных может только человек, и то не факт, что правильно. |
| Йобан Матич:
--- Цитата: GManiac --- отделить код от данных может только человек --- Конец цитаты --- IDA Pro тоже пытается. =) |
| GManiac:
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 в ромах часто не совсем разборчивы, плюс некоторые игры любят пихать кусок кода из рома в оперативку и выполнять его там, плюс код вообще можно создавать. В экзешниках таких трюков нет - винда не позволит и нормальный компилятор так извращаться не будет. |
| sergi:
<_< ну в общем очередная поделка как мне кажется лучше я тогда свой напишу и данные от графики и т.п. отделю - только не нужно говорить что это невозможно ;) |
| aL1eN:
сорри за оффтоп... --- Цитата ---В экзешниках таких трюков нет - винда не позволит --- Конец цитаты --- есть такие трюки, и винда это позволяет. я могу вообще в один сегмент прогу написать. правда заголовок никуда не денется. --- Цитата ---и нормальный компилятор так извращаться не будет. --- Конец цитаты --- тут ты, в принципе, прав, но что ты подразумеваешь под нормальным компилятором? по сабжу, к сожалению, не могу ничего сказать (т.к. не сильно знаком с архитектурой m68k)... интересно, как ты позиционируешь свой дизасм. пока он от своих поделок-собратьев отличается только тем, что под винду имхо лень тебе анализатор писать задаром =) |
| GManiac:
--- Цитата: sergi от 23 Апрель 2008, 00:05:49 --- <_< ну в общем очередная поделка как мне кажется лучше я тогда свой напишу --- Конец цитаты --- Напиши, а то ты всё грозишься что-то сделать... :) Вроде бы собирался писать ассемблер, где он? --- Цитата: aL1eN от 23 Апрель 2008, 00:17:00 ---есть такие трюки, и винда это позволяет. я могу вообще в один сегмент прогу написать. правда заголовок никуда не денется. --- Конец цитаты --- Насчёт создания кода что-то не помню... или у программы должны быть определённые привилегии. --- Цитата ---тут ты, в принципе, прав, но что ты подразумеваешь под нормальным компилятором? --- Конец цитаты --- Наверно, любой неасмовый, если ты пишешь "нормальную" структурированную программу, а не балуешься с указателями и пр. --- Цитата ---интересно, как ты позиционируешь свой дизасм. пока он от своих поделок-собратьев отличается только тем, что под винду --- Конец цитаты --- Что-то я не пойму, что вы всё "поделка" да "поделка"? :) До этого из консольных дизасмов сеги были входящий в sega-asm и diss от Никодима. Ну, может ещё какие, но они наверно не лучше. В обоих меня не устраивали неточности и кривости, а у diss - ещё очень низкая скорость. Я просто решил исправить это и вообще написал его так, для себя (не в смысле "для своих целей", а для собственного удовлетворения, ну вы поняли). --- Цитата ---имхо лень тебе анализатор писать задаром =) --- Конец цитаты --- При разговоре об анализаторах все сразу вспоминают ИДУ. Я с ней пока не разбирался, но кое-какие её особенности мне не очень. Но конечно, граф. интерфейс и построение графа - это круто. Вот если ты сделаешь мне граф. интерфейс, хотя бы такой текстовый редактор (можно ещё стрелки прыжков, как слева) и подобные окна и код в тултипах, я анализатор наваяю. Анализатор можно хоть консольный сделать, но кто будет с ним работать? |
| HoRRoR:
--- Цитата: sergi от 23 Апрель 2008, 00:05:49 ---лучше я тогда свой напишу и данные от графики и т.п. отделю - только не нужно говорить что это невозможно ;) --- Конец цитаты --- Когда запатентуешь свой AI, который будет это делать - сообщи. В РОМах может быть, ну например, вот так: (не знаю асма сеги, условно обозначу прыжок как J) J L1 <data> L1: J L2 <data> L2: J L3 <code> L3: J L4 <data> L4: J L5 <code> L5: И как ты енто собираешься отделять? Причём теоретически в некоторых случаях данные могут являться и данными, и кодом, а данные зачастую являются криптованным/сжатым кодом. |
| HardWareMan:
HoRRoR, пример примитивен. Сложнее вот: <code> jsr PrintString dc.b 'This is a char string, no a code!',0 <code> На таком даже IDA спотыкается, а я такое применял еще в 89-90-х годах на компе "Специалист" на кружке. Если спросишь, как это работает - я скажу: при вызове подпрограммы содержимое вершины стека будет показывать прямо на следующую команду, а фактически на текст, останется извлечь его (я испольховал XTHL - обмен [HL] и вершины стека), напечатать нужное и опять обменять вершину стека (еще один XTHL) и все, при возврате адрес будет уже на код за текстом. И таких примеров много. |
| evgeny:
Наверное самый лучший способ автодизассемблирования был бы, если дизасм в эмулятор встроен, и по ходу игры все дизассемблировалось постепенно, ну те ветки, в которые программа пока не заглядывала временно забивались нулями , например, чтобы адреса не смещались. т.е. чтобы весь код дизассемблировть это нужно все варианты протестить, все секреты открыть, всю игру пройти и.т.д. но зато должен верный код выйти. |
| GManiac:
HoRRoR, это самый простой случай. Всё, что может исполниться, то - код. Всё, что не код, то - дата ;) А может исполняться только последовательно за исключением условных прыжков - здесь надо рассмотреть оба варианта. Дизассемблирование либо по ходу выполнения игры, либо методом просмотра прыжков исключает возможность нахождения недоделанных секретов в играх. Так что сплошной дизасем ещё никому не мешал. Для меня в чём главный плюс моего дизасма - в том, что за счёт его виндовости можно сделать ассоциацию с расширением рома и прописать в качестве outfile "%1.asm". Потом достаточно нажать на роме Enter, и сразу появляется его дизасм. А с досовскими приходилось перекидывать ром в папку к дизасму или наоборот и немного возиться с командной строкой ("%1.asm" не прокатит из-за досовского ограничения, а обзывать все outfile одним словом неудобно). А потом ещё ждать минуту, пока он дизасмится. :ohmy: Добавлено позже: --- Цитата ---Наверное самый лучший способ автодизассемблирования... --- Конец цитаты --- Вообще говоря, нужно и то, и другое, и третье (например, показ дизасма созданного в процессе игры кода, ни один статические дизасм с этим не справится). Но "другое и третье" мне пока не под силу. Хотя всегда есть вариант переделывать Генс, это тоже нелегко. |
| HoRRoR:
--- Цитата ---HoRRoR, пример примитивен. Сложнее вот: --- Конец цитаты --- --- Цитата ---HoRRoR, это самый простой случай. Всё, что может исполниться, то - код. Всё, что не код, то - дата --- Конец цитаты --- GManiac, сам же говоришь :) --- Цитата ---Дизассемблирование либо по ходу выполнения игры, либо методом просмотра прыжков исключает возможность нахождения недоделанных секретов в играх. --- Конец цитаты --- А что, если какой-то кусок кода выполняется один раз за всю игру? Например, при её прохождении или при попадании в секретный уровень? Тогда невозможно понять, где что. |
| masyanya:
Дизасмов дохрена, и все кому не лень пытаються писать их, имхо это народу не нужно, мож кто интерпритатор напишет нормальный, вот тогда это будет супер. |
| sergi:
я и так пишу - медленно все делается, ну как умеем лично пишу и асемблер и дизасемблев вадном флаконе ^_^ только будет под винду из окошек и кнопки будет 2 - асемблить и дизасемблить при чем что дизасемблил то с асемблю и будет тоже самое + возможность свапа байт и возможность проверки 2 файлов побайтно - ну вдруг есть сомнения что это не тоже самое получится а так про трафареты говорил чтобы тот кто имеет опыт в какойто одной игре тупо и просто написал трафарет по которому подобную или эту же игру можно с максимальной точностью дисамемблить и даже с указаниями комментариев |
| GManiac:
--- Цитата: masyanya от 23 Апрель 2008, 09:48:22 ---Дизасмов дохрена, и все кому не лень пытаються писать их, имхо это народу не нужно, мож кто интерпритатор напишет нормальный, вот тогда это будет супер. --- Конец цитаты --- С чего-то же надо начинать. Может, тебе сразу эмулятор PS3 замутить? Добавлено позже: --- Цитата: HoRRoR от 23 Апрель 2008, 09:45:15 ---GManiac, сам же говоришь :)А что, если какой-то кусок кода выполняется один раз за всю игру? Например, при её прохождении или при попадании в секретный уровень? Тогда невозможно понять, где что. --- Конец цитаты --- Первая цитата не моя. Если в секретный уровень можно попасть без взлома, то этот код потенциально может выполниться (иначе не бывает), значит, автодизасм его найдёт. Но всё дело портят вычисляемые прыжки, которые есть во многих играх. Я же говорю о секретах, которые не доделали или вместо вызова которых поставлена заглушка. Их может найти только сплошной дизасм или человек. Часть таких секретов описана здесь (где написано "взлом"): http://emu-russia.km.ru/forum/viewtopic.php?f=21&t=16 |
| HardWareMan:
Самый косяк в дизасме, он же самый смак в программинге - это табличные переходы. Обычно, это переход по значению в регистре или еще более хитрым методом адресации. В любом случае, тупой дизасм его не возмет - он просто не знает, что может храниться в регистре. Более того, значение регистра может быть взято из таблицы в памяти, адрес которой может вычисляться на ходу, а то и вовсе вычисляться полностью. Здесь справится только человек. Причем, если у ВМ80 это всего одна команда PCHL, у Z80 их три (JP HL, JP IX и JP IY), то у того же М68К их просто тонна. Причем, валидны такие извращенные методы адресации, что неподготовленный человек вообще потухнет!. Я писал в свое время дизасм сеговский, могу дать. Забросил конечно, может его воскресить.... |
| aL1eN:
все переходы реально выследить (теоретически) основываясь на архитектуре интелов, могу сказать, что реально дизассемблировать программу, начиная от точки входа, и двигаясь по логике исполнения (запоминая все переходы, и потом возвращаясь к ним). тем более, что все возможные способы переходов мы знаем. да и дисасмить, пора бы уже, интерактивно --- Цитата ---Насчёт создания кода что-то не помню... или у программы должны быть определённые привилегии. --- Конец цитаты --- можно.... даже привилегий никаких не надо --- Цитата --- Вот если ты сделаешь мне граф. интерфейс, хотя бы такой текстовый редактор (можно ещё стрелки прыжков, как слева) и подобные окна и код в тултипах, я анализатор наваяю. --- Конец цитаты --- я, конечно, могу попробовать, но ничего не обещаю (скорее наоборот). да и лень мне (плюс курсовая в этом году......) |
| GManiac:
Частные случаи я уже разжеал на эму-раше. aL1eN, всё отнюдь не так просто. Если имеется в виду статический дизасм, который ничего не знает о значениях памяти/регистров, надо извращаться. Если интерпретатор, можно получить только то, что выполнится, но останется ещё то, что не выполнилось, но куда не был табличный переход. |
| Навигация |
| Главная страница сообщений |