Автор Тема: [Snes] Дизассемблирование Snes  (Прочитано 3750 раз)

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

Оффлайн Doomguard45

  • Пользователь
  • Сообщений: 237
    • Просмотр профиля
[Snes] Дизассемблирование Snes
« : 23 Октябрь 2015, 07:01:16 »
Приветствую, есть вопросы относительно разбора игры под Snes. Я не нашел для IDA плагин/лоадер, который бы позволил дизассемблировать SNES ромы. Да, после версии 6.2 IDA имеет встроенный loader под snes, однако, он некорректно воспроизводит в код некоторые элементы, например те, что находятся вместе:

.00:9E1C            .BYTE $A9 ; й
.00:9E1D                 .BYTE $FF
.00:9E1E                 .BYTE $8D
.00:9E1F                 .BYTE $B5 ; ¦
.00:9E20                 .BYTE  $D

  воспринимается как

.00:9E1C       LDA     #$8DFF
.00:9E1F                 LDA     D,$D,X

Преобразование A9 FF, при образовании верной функции не происходит, и код выглядит так:
00:9E1C                 .BYTE $A9
.00:9E1D                 .BYTE $FF
.00:9E1E ; ---------------------------------------------------------------------------
.00:9E1E                 STA     RAM_PlayerLives+1

Что не является верным, а таких участков в коде очень много, что затрудняет нормальную работу в IDA. Существует ли аналоги или loader для IDA, который бы адекватно воспроизводил код?

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #1 : 23 Октябрь 2015, 09:29:21 »
Doomguard45, это не лодырь неправильно воспроизводит, а процессорный модуль для снес-процессора неправильно интерпретирует эти команды.
Пофиксить это можно, написав дополнительный плагин, фиксящий именно это поведение, и только. Или попробуй поотключать в Kernel options 1 некоторые опции.
Дай мне скрин этого окошка, и я скажу какие галки попробуй.

Оффлайн Doomguard45

  • Пользователь
  • Сообщений: 237
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #2 : 23 Октябрь 2015, 10:02:33 »
А, кстати, еще вопрос - как сделать трехбайтовый оффсэт? Чаще всего баг проявляется именно перед 8D , и при LDA LDY LDX, а также не распознается CMP, почему последнее не воспринимает - я не понимаю
« Последнее редактирование: 23 Октябрь 2015, 10:12:50 от Doomguard45 »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #3 : 23 Октябрь 2015, 11:52:38 »
Попробуй сделать настройки такими, как на скрине и сделать Reanalyze program. Возможно, поможет. Если нет, тогда траблы в проц-модуле, а это уже сложнее.

Оффлайн Doomguard45

  • Пользователь
  • Сообщений: 237
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #4 : 23 Октябрь 2015, 12:05:28 »
Уоу ,вроде помогло, еще потестирую, точно скажу, а что на счет оффсэта в три байта?

Помогло, но не везде, где то также упорно не хочет в код переводить.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #5 : 23 Октябрь 2015, 12:11:24 »
Doomguard45, трехбайтовые оффсеты, увы, нельзя делать. Есть внутренний тип данных у иды:
#define dt_3byte        15      // 3-byte dataНо я не знаю, можно ли его ставить вручную. На автомате то можно, но это работа проц-модуля. Пофиксить это только сторонним плагином можно. Но, заняться этим я не смогу - нет времени.

Оффлайн Doomguard45

  • Пользователь
  • Сообщений: 237
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #6 : 23 Октябрь 2015, 12:15:57 »
Doomguard45, трехбайтовые оффсеты, увы, нельзя делать. Есть внутренний тип данных у иды:
#define dt_3byte        15      // 3-byte dataНо я не знаю, можно ли его ставить вручную. На автомате то можно, но это работа проц-модуля. Пофиксить это только сторонним плагином можно. Но, заняться этим я не смогу - нет времени.

Не, проблема не решилась, как то странно всё это

            .BYTE $A2
.00:8D2E                 .BYTE   6
.00:8D2F unk_8D2F:       .BYTE $BD ; -           ; CODE XREF: GM04DoDMA+37j
.00:8D30                 .BYTE $97
.00:8D31                 .BYTE $8D ; Н

в

00:8D2D loc_8D2D:                               ; CODE XREF: GM04DoDMA+37j
.00:8D2D                 LDX     #$BD06
.00:8D30                 STA     [D,$8D],Y

и если опять отделять, то

8D2A ; ---------------------------------------------------------------------------
.00:8D2D                 .BYTE $A2
.00:8D2E                 .BYTE   6
.00:8D2F ; ---------------------------------------------------------------------------
.00:8D2F
.00:8D2F loc_8D2F:                               ; CODE XREF: GM04DoDMA+37j
.00:8D2F                 LDA     $8D97,X

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #7 : 23 Октябрь 2015, 12:20:36 »
Doomguard45, ну, к сожалению, больше ничем не подскажу.. Не силен в снесовском азме.

Оффлайн Doomguard45

  • Пользователь
  • Сообщений: 237
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #8 : 23 Октябрь 2015, 12:23:11 »
Doomguard45, ну, к сожалению, больше ничем не подскажу.. Не силен в снесовском азме.

Нельзя создать своё правило? или что-то в этом роде

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #9 : 23 Октябрь 2015, 12:26:26 »
Doomguard45, как я уже ранее сказал, надо дополнять/исправлять поведение процессорного модуля, написав плагин, который бы перехватывал команду вывода инструкций, и выводил именно в этом случае в нужном тебе виде. Но, писать, увы, браться не буду.

Оффлайн Doomguard45

  • Пользователь
  • Сообщений: 237
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #10 : 23 Октябрь 2015, 12:35:36 »
Doomguard45, как я уже ранее сказал, надо дополнять/исправлять поведение процессорного модуля, написав плагин, который бы перехватывал команду вывода инструкций, и выводил именно в этом случае в нужном тебе виде. Но, писать, увы, браться не буду.

Хммм ,есть ли тогда смысл взять просто дизассемблер на снэс, чтобы данные все таки корректно отображал и опкоды.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #11 : 23 Октябрь 2015, 13:51:48 »
Doomguard45, не очень понимаю твое предложение.

Оффлайн Doomguard45

  • Пользователь
  • Сообщений: 237
    • Просмотр профиля
Re: [Snes] Дизассемблирование Snes
« Ответ #12 : 23 Октябрь 2015, 14:24:09 »
Doomguard45, не очень понимаю твое предложение.

ну я думал, что аналог ИДЫ может нормально работающий со снэс есть , а тут вообще мрак. Только чистый дизасм. А есть ли способ посмотреть, что именно делает IPS патч - где у него команды, а где информация, ибо исходник более менее есть, а вот исходник хака нет.