| Разработка и ромхакинг > Ромхакинг и программирование |
| Gens Rerecording 11 Win32 r57shell mod |
| << < (2/4) > >> |
| Марат:
А, по-моему, надо в настройках в еxecutable files добавить путь к nasmw.exe, разве нет? |
| Segaman:
у меня nasmw.exe на всём жёстком диске нет :'( Добавлено позже: обьясните нубу как этим пользоваться он тока и знает что выдавать тупые ошибки |
| Ti_:
nasmw.exe |
| Segaman:
и куда его совать, что запускать блин :wall: Добавлено позже: всё короче удалаю всё к чертям! в гробу я всё это видел |
| r57shell:
--- Цитата: r57shell от 03 Апрель 2010, 23:31:57 ---Толкнул в корень nasm/nasmw и всё заработало. --- Конец цитаты --- Добавлено позже: забыл уточнить - в корень ДИСКА. |
| r57shell:
Call stack поправил, надо будет его ещё улучшить ) и добавил фишку, главную из-за которой выкладываю ^__^. Берём в иде запускаем gens.idc (который мной написан) выбираем файл "for ida.txt" который должен появится в папке с этим эмулем после каких либо действий в Debug этого эмуля. Видим внизу в иде сообщение OK значит всё круто. Теперь переход в Debug Gens-а будет сопровождаться с переходом в Ida только при условии что переход больше чем на 5 строчек. Делал на соплях, поэтому работать должно если открыт IDA View. Если в других случаях неработает... значит бажит, делал для себя поэтому если не будет хватать то полюбому улучшу ^^. Теперь почему минимум через 5 строчек - а потому что иначе долго отлаживать. И ещё, эту фичу не отключить, опцию "включить выключить jmp в ида" может потом добавлю %). Тестировал на Ida Pro v5.2 |
| evgeny:
C ida - это хорошо придумал, только нужно подробнее было объяснить все. Что надо загрузить ром сеги в ida, открыть этот же ром эмулем, запустить новый дебаг, загрузить в ида скрипт idc, for ida.txt, нажать кнупку генс. и.т.п. А то ведь непонятно совсем. А инструмент впечатляет. Я еще для себя добавил в скрипт после прыжка на адрес MakeCode, чтобы дизассемблеровалось сразу. Еще бы в процессе игры дебаг обнавлялся автоматически, тогда вобще бы все само сабой дизассемблеровалось. |
| r57shell:
Благодарю за коментарий. Выложи скрипт... Я добавлю кнопку в эмуле для сохранения карты кода (как он по твоему дизассэмблит у меня). и другим скриптом можно будет сразу все участки не дизассэмблированные дизассмить за один проход... (после минут 5 игры). Вот такие вот пироги. Магическую кнопку ждать... сча сделаю. Добавлено позже: буду рад если ты напишешь(и выложишь!) скрипт который из этой карты сделает то что выше описал ) ато времени жуть мало. Добавлено позже: А да, формат карты такой: битовая маска на все 4 мегабайт рома, а т.к. код только на чётных адрессах, то только чётные биты в битовой маске. то есть если бит j единица, то по оффсету j*2 код. Добавлено позже: Вот, терь есть галочка, и Load/Save map. |
| evgeny:
Не совсем понял ход твоих мыслей. Я просто в твой скрипт добавил после строчки Jump(xtol(s)) строчку MakeCode(xtol(s)) и все. Если бы дебаг был автообновляемым, активным при игре, все само бы в иде пригало и дизасмилось по ходу работы. А что с картой этой делать мне не совсем понятно. Скрипты для IDA не писал никогда, вобще сегодня только обратил внимания на эту функцию. Кстати, там вроде бы на С пишутся скрипты(или что-то похожее), если я правильно понял, а я С не владею. ... Ты наверное хочешь сделать файл- битовую карту, чтобы бит сопоставлялся байту рома? Если 0 -то байт не использовался, 1- код исполнялся и потом все байты где исполнился код автоматом диззасемблировать? Честно говоря я пока почти не представляю как написать такой скрипт в IDA. Нужно сначала язык этот изучить. |
| r57shell:
--- Цитата: r57shell от 24 Май 2010, 19:00:34 ---А да, формат карты такой: битовая маска на все 4 мегабайт рома, а т.к. код только на чётных адрессах, то только чётные биты в битовой маске. то есть если бит j единица, то по оффсету j*2 код. --- Конец цитаты --- чуешь сходство? --- Цитата: evgeny от 24 Май 2010, 19:25:37 ---Ты наверное хочешь сделать файл- битовую карту, чтобы бит сопоставлялся байту рома? Если 0 -то байт не использовался, 1- код исполнялся и потом все байты где исполнился код автоматом диззасемблировать? --- Конец цитаты --- Сходство во всём, только у меня более подробно описано, и я не хочу сделать, я уже сделал!) эта карта была уже в первой версии которую выкладывал в этой теме, просто сохранение очень лень делать было. --- Цитата: evgeny от 24 Май 2010, 19:25:37 ---Ты наверное хочешь Честно говоря я пока почти не представляю как написать такой скрипт в IDA. Нужно сначала язык этот изучить. --- Конец цитаты --- Я язык не изучил, но вить написал!) :] да я такой, ничего не изучая делаю, собсно потому что изучить полностью невозможно, и вообще зачем это, если надо только область. Всегда копаю только область. |
| evgeny:
Может найдутся примеры подобных скриптов в интернете. Если получится что-нибудь со скриптом, то выложу. У самого времени мало свободного. |
| r57shell:
Да, забыл сказать что по 4 байта реверснуто... ну да ладно уже сделал скрипт, и некоторые фиксы эмуля... Всё в архиве (эмуль + 2 скрипта). gens.idc для синхронизации с идой. gensmap.idc чтобы загружать *.map которые Gens Debug генерит мой ). В скрипте есть закоментированная строчка - вывод тех оффсетов где было произведено НОВОЕ дизассемблирование. Добавлено позже: Раскажу несколько хитрых планов. 1) План "полный дизасм": Сидим шпилим несколько часов в игру, пытаемся делать всё что в ней можно... можно даже когда выходишь, сохранять *.map и потом если снова засел шпилить - подгружать. И когда надоест, сохраняем *.map и грузим в Ida через скрипт, ТаДа - все места кода которые были выполнены - в иде дизассмены. 2) План "Что было несколько секунд?": Нужна сноровка) Для начала нужно сделать сэйв, затем, закрыть ром, открыть его сразу на этом сэйве, и подождать эти заветные несколько секунд, и сразу в дебаге нажать например Step Into (чтобы ром на паузу поставить) или просто Esc. Сохраняем карту, и теперь нужно иде как-то сказать что всё данные... (полюбому как-то можно быстро это сделать, лень сча это рыть). И опять же запустить скрипт с подгрузкой map. А блин, ида все деревья возможные продизасмит сама, вот ацтой, может есть опция где это отключить, незнаю, ладно, я то просто делал также только я там где код - сохранял в отдельный файл, итого получалась вырезка только того что выполнялось. так... 3) План без названия, да и хрен кто его наверно выполнит... берём играем играем, и какое-то действие не делаем заведомо ни разу. затем сохраняем *.map, потом делаем это действие, и сохраняем в другое место *.map потом сравниваем 2 файла каким-нить filecompare например, и те байты в которых различие с большой вероятностью отвечают за это действие. Теперь как из байтов вычислить оффсет? (byteoffset/4)*64+(3-byteoffset%4)*8+bitoffset*2 - да вот такая сложная формула. %4 - взять остаток от деления на 4. bitoffset - номер бита несовпадающего (от 0 до 7) если сильно точно не надо то можно на bitoffset забить. Собственно планов хитрых можно много напридумывать... для отловки... "план перехват". |
| evgeny:
Здорово. По поводу сравнения файлов: тут нужно просто получить два рома, в которых будут только исполненные быйты записаны их уже и сравнивать. Удобнее было бы, если сам эмулятор сохранял такой ром (в эмуляторе НЕС fceuxdsp такое есть). Но можно и програмку написать, чтобы нулевые биты карты заполняли соответствующие байты рома. |
| r57shell:
Да, только вот карта указывает только на начала операций, такчто чтобы лишнее не занулить нужно ещё уметь определять длину операци :) ну эт легко ). Я сча думаю над другой вещью - нормальных watch-ах. |
| evgeny:
Я по правде говоря не понимаю какой толк в этих watch. И нормальные это какие? |
| r57shell:
Объясняю. Мне легче всего на примерах Rock 'n' Roll Racing обьяснять. Первый пример: мы незнаем что такое по адрессу 12345 (от фанаря сказал) но от этого зависит что происходит в данном участке кода. Ставим вотч по адрессу 12345 и смотрим (играя в игру эту), что там творится(как меняется значение), например если там всегда 0 и иногда проскальзывает 1 то это скорее всего какой-то флаг, например мёртв или нет игрок. Или если постоянно какоето значение, и иногда увеличивается, иногда уменьшается - так выгледит например поведение высоты на которой едет тачка в RRR или если значение меняется при движении камеры - то это камера ну и много примеров короче можно узнать о чём переменная. Но это можно узнать и смотря в RAM Dump, то есть это не самое важное применение. Второй пример: (вот что значит НОРМАЛЬНЫЕ watch-и) начну из далека. Ты поставил бряк(Breakpoint) и от него начинаешь отлаживать, у тебя какие-то переменные изменяются, часто они раскиданы жутко по памяти (в смысле адреса у них жутко разные и в RAM Dump например не уследишь за всеми) и тогда ты можешь смотреть на все изменения переменных через Watch но это ещё не всё. Нормальные Watch это когда ты можешь смотреть не просто по адрессу, а можно следить за некоторым выражением(expression). например *((char *)12345)*2-*((char *)3210)*3 Так бы в C++ выгледело бы взять по адрессу 12345 байтовое знаковое значение, умножить на 2 и вычесть байтовое знаковое значение по адрессу 3210 умноженное на 3. (выражение (char*)12345 означает что число 12345 перевести в тип "адресс на биайтовое знаковое значение" после чего *p ,где p - указатель (адресс), означает "разименовать" (взять значение по адрессу). То есть ты не будишь как дурак сидеть и каждый шаг отладки на калькуляторе считать это выражение, а больше, ты сможешь в реальном времени (играя) смотреть сразу значение. Вот такие дела. Третий пример: С нормальными watch удобно массивы например перебирать. ((char*)(12345)) - указатель, а все указатели в C++ можно использовать как массивы. Индекс указывается в квадратных скобках. То есть в Watch просто пишешь ((char *)(12345))[1] - второй элемент массива (индексы с нуля). Собственно и хочу сделать чтобы можно было писать такие выражения. Только охото чтобы они быстро вычислялись поэтому надо использовать дерево для обратной польской нотации, а это очень лень ). Можно ещё добавить список для переменных, чтобы не вводить 12345 каждый раз а определить допустим life=(char*)12345 и писать сразу life[10]. Хмм или чтобы постоянно (char *) не писать, дать к числу приписывать символ например 12345C - это пусть указатель на 12345 а не просто число. в C++ шестнадцатеричные числа обозначаются c ведущим 0x например 0x123E2C. Поидее обычно в watch пишутся выражения на том же языке который отлаживают, (в С++ на С++, в Java на Java и т д...) но тут непонятно как можно в watch написать lea ($12345),a0... ))) |
| evgeny:
Мне кажется наблюдения за динамично-изменяющейся памятью достаточно. Согласен есть моменты, когда watch полезны, но мне это не кажется особо важным. |
| r57shell:
считаю нужность того/иного в зависимости от того на сколько мне затраты времени сокращает, по моему опыту - на много. Добавлено позже: и если сделаешь такой watch то не проблема сделать breakpoint по условию. |
| Ti_:
Хорошая вещь. А вот как можно ещё улучшить, смотрим: скриншот из эмулятора NES'а FCEUX2.14a - они сделали такой же логгер, только неизв. для иды или чего. И тут от себя добавлю надо сделать в карте (+data для трех типов .b .w .l ), т.е. получим области Code+data+неизв. Плюс скрипт должен проводить исправление ошибок иды (когда неправильно определяет) - но тут главное, чтобы не вышло такое, когда данные являются одновременно и кодом и данными , а также когда данные могут считаться как byte, а в другой раз как word(зависимости от ситуации). Но полного дизасма таким способом неполучить даже если 99% игры пройти, потому что есть 'пустые' участки (вырезанные,неисользуемые и т.д.), А есть вообще нонсенс вроде дюны, куда 2резета запихнули - я раньше так думал, а сейчас изучая ром вижу - на самом деле все 2картирджа прям вместе с заголовком! --- Код: ---ROM:00029BB0 dc.l RESERV3F ROM:00029BB4 dc.b 'SEGA GENESIS (C)T-70 1994.APRDUNE - THE BATTLE FOR ARRAKIS ' ROM:00029BB4 dc.b ' ' ROM:00029C04 dc.b 'DUNE - THE BATTLE FOR ARRAKIS ' ROM:00029C34 dc.b 'GM T-70246 -00' ROM:00029C42 cheksum_clone: dc.b 'êUJ ' ; DATA XREF: ROM:0002C3F0r ROM:00029C54 dc.l 0 ROM:00029C58 rom_size_clone: dc.l $FFFFF ; DATA XREF: ROM:0002C3ECr ROM:00029C5C dc.l $FF0000 ROM:00029C60 dc.l $FFFFFF ROM:00029C64 dc.b ' ' ROM:00029C64 dc.b ' U ' ROM:00029CB4 ROM:00029CB4 ; =============== S U B R O U T I N E ======================================= ROM:00029CB4 ROM:00029CB4 ROM:00029CB4 RESET2: ROM:00029CB4 tst.l (IO_CT1_CTRL_).l ROM:00029CBA bne.s loc_29CC2 --- Конец кода --- Как минимум клон до $2DD5C. (включаю клон кода Z80). Что они там накурились- (я конечно много бреда видел вроде move.w ($12345678).l,d1, или проверка tst.w (абс.адрес) -по нему $FFFF, надо проверить $FFFF там ли 0) - я не понимаю, да и бол-во jsr/jmp адресов от клона ведет к реальному коду, поэтому запустить игру отсуда нельзя(было предположении о бета-копии начала). Да еще и неиспользуемые дубликаты или вариации кода. |
| evgeny:
А у меня на новом компьютере этот эмулятор стал работать с бешенной скоростью. И не помогает даже futo frame skip (на других версиях генса помогает) |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |