PDA

Просмотр полной версии : GameBoy ROM disassembly



CityAceE
25.01.2017, 09:57
В рамках вот этой темы (http://zx-pk.ru/threads/25932-perenos-igr-s-game-boy-na-zx-spectrum.html) решил покопаться в потрохах GameBoy'евской Зельды. Вначале через эмулятор BGB. Там, конечно, и дизассемблер есть, и отладчик, но всё равно мало что понятно - хочется иметь полный листинг перед глазами, чтобы можно было процедуры и переменные переименовать для более глубокого понимания. Попробовал разные инструменты, которые смог найти, а именно:

1. Эмуляторы BGB (http://bgb.bircd.org) и no$gmb (http://problemkaputt.de/gmb.htm). Результат обоих эмуляторов совершенно одинаков, видимо, они близкие родственники. В общем-то, из них можно выгрузить дизассемблер доступной для Z80 памяти, но там есть лишние колонки и работать с метками в текстовом редакторе в итоге оказывается, мягко говоря, не слишком удобно. Опять же, нет доступа к коду, который располагается в неактивных в данный момент банках ПЗУ.



ROM0:28C5 2A ldi a,(hl)
ROM0:28C6 12 ld (de),a
ROM0:28C7 13 inc de
ROM0:28C8 0B dec bc
ROM0:28C9 78 ld a,b
ROM0:28CA B1 or c
ROM0:28CB 20 F8 jr nz,28C5
ROM0:28CD C9 ret


2. gb-disasm (https://github.com/mmuszkow/gb-disasm) - результат понравился. На выходе имеем полноценный листинг. Кроме того, данный дизассемблер пытается понять, что было переключение банка памяти и дизассемблирует этот дополнительный код. Но в результате работы остаётся слишком много мест, которые данный дизассемблер отказывается распознавать. В результате имеем такой листинг:



jmp_8b:
LD A,$0C
LD [$2100],A
RET

INCBIN "Legend of Zelda, The - Link's Awakening (USA, Europe).gb",$91,$100-$91

NOP
JP jmp_150

INCBIN "Legend of Zelda, The - Link's Awakening (USA, Europe).gb",$104,$150-$104

jmp_150:
CALL sub_2881
LD SP,$DFFF
XOR A
LDH [$47],A ;bg pal
LDH [$48],A ;obj pal0
LDH [$49],A ;obj pal1
LD HL,$8000
LD BC,$1800
CALL sub_2999
CALL sub_28a8
CALL sub_298a


3. GameBoy Assembler Plus (http://www.romhacking.net/forum/index.php?topic=14534.0) - может дизассемблировать куски кода, но при попытке дизассемблировать весь ROM начисто вешается. Получаемый листинг имеет такой вид:



#org 28C5
Label28C5:
ldi a,(hl)
ld (de),a
inc de
dec bc
ld a,b
or a,c
jr nz,Label28C5
ret


4. IDA Pro (https://www.hex-rays.com/products/ida/) - хотя эта программа в моём списке и последняя, но этот инструмент, самый первый, который приходит в голову, когда хочется что-то дизассемблировать. Инструмент очень мощный, с кучей возможностей, но, к сожалению, в силу отсутствия опыта и полноценной документации, у меня до конца не получается настроить эту среду на работу с образом GB-игры.

Прежде всего я снял дамп памяти из эмуляторы и с помощью IDA Pro попытался дизассемблировать его. Попереименовывал некоторые переменные и процедуры. Всё здорово: меняешь в одном месте - меняется везде! Кое-что с кодом начало проясняться. Но вот я добрался до переключения банков памяти. По началу всё было нормально - переключение использовалось для переброса данных из дополнительной памяти в ВидеоОЗУ. Но потом я добрался до таких конструкций:



ROM:03B5 ld a, 1
ROM:03B7 ld [BANK], a
ROM:03BA call sub_5D03
ROM:03BD ld a, $1F
ROM:03BF ld [BANK], a
ROM:03C2 call loc_7F80


Инструкция ld [BANK],a включает в адресное пространство #4000-#7FFF банк памяти, указанный в регистре a. И видно, что после этого вызывается код из этих страниц. В эмуляторе я могу всё это протрассировать, но как поступить в IDA Pro? Всё, что у меня получается сделать - это жёстко задать в указанном диапазоне какую-то одну страницу.

Поискал как народ поступает. Но всё, что удалось найти - это только лоадер (https://github.com/w4kfu/IDA_loader/blob/master/Nintendo_GB/nintendo_gb.py), который сам разбивает память на сегменты, распознаёт заголовок и задаёт имя стандартным системным переменным. Однако при использовании данного лоадера вообще игнорируется код, который располагается выше #4000. То есть дизассемблировать можно только первые 16к картриджа.

Не может быть, чтобы такая мощная программа, как IDA Pro, не умела бы переключать страницы ПЗУ! Но вот у меня никак не получается :( Может быть кто-то, кто более продвинут в IDA Pro, подскажет как это сделать? Или есть ещё какие-то мысли?

Shiny
25.01.2017, 10:52
IDA для х86 создает сегменты. Может, попробовать для gbz80? Не знаю как.

CityAceE
25.01.2017, 10:56
Может, попробовать для gbz80?
Пробовал по разному, но результата добиться не получается. И примеров найти в сети не могу.

Shiny
25.01.2017, 11:07
А можно ссылку на ROM Zelda?

CityAceE
25.01.2017, 11:14
Но, вот (https://www.emuparadise.me/Nintendo_Game_Boy_ROMs/Legend_of_Zelda,_The_-_Link's_Awakening_(USA,_Europe)/69120), например.

HardWareMan
25.01.2017, 13:33
Учись писать лодырь под ИДУ. Санч написал свой для NES и там нормально банки разбиваются и дизаются. Я написал свой для MD, но там переключений то и нет. И ты давай пиши нормальный.

CityAceE
25.01.2017, 16:17
Учись писать лодырь под ИДУ.
Я чем-то обидел? Почему я вижу хамство в свой адрес?

ram_scan
25.01.2017, 16:43
Я чем-то обидел? Почему я вижу хамство в свой адрес?

Да вроде никакого хамства. Через написание лодыря решается этот вопрос. SDK в комплекте с идой идет. А лодырь писать форумчане вам не будут. Не потому-что свиньи, а потому-что эт им не надо. А вам надо. Вам и писать.

HardWareMan
25.01.2017, 18:15
CityAceE, никакого хамства. ram_scan верно говорит. Мне нужен был лодырь на MD - никто не хотел писать, пришлось писать самому. А потом, что забавно, на основе моего лодыря сделали другой, с карточными играми и куртизанками, но уже буржуи в комьюнити по MD. Вот такая она, жизнь, много несправедливости в ней... (с)

solegstar
25.01.2017, 18:19
HardWareMan, ram_scan, ваш сленг просто не поняли.
CityAceE, лодырь=loader. :)

AlexG
25.01.2017, 18:29
злостный оффтоп:
есть "осёл на складе" (в смысле животное/бездарный работник на складе), а есть "осел на складе" (в смысле товар размещён на долгое хранение на складе).
Если писать "попсово" (как нынче пишут в "прессе") без буквы Ё - то смысл фразы кардинально меняется.
:v2_dizzy_vodka3:

HardWareMan
25.01.2017, 18:35
solegstar, от оно че, Михалыч... Не подумавши сказал, ага. Но ведь запятых нет!

- - - Добавлено - - -

AlexG, а вот Дизайнер Всея Руси не любит "Ё". Он даже имя изменил, чтобы исключить ее. :)

Shiny
25.01.2017, 18:55
странные вы люди. Можно подумать, что IDA все знают в совершенстве.

поправили бы образец скрипта, было бы легче.

HardWareMan
25.01.2017, 19:12
Шынни, я вообще далек не то что от ИДЫ, от VC на котором следует писать плагины к ней. Но я же разобрался. Да, была рыба, но ее найти в гугле без проблем. И кто странный теперь?

CityAceE
26.01.2017, 07:53
лодырь=loader


https://www.youtube.com/watch?v=M22hv-0uBkU

А я ведь реально не понял этого сленга! ;) И хорошо, что это было всего лишь моё недопонимание :)

В общем, слегка подкорректировал скрипт:

1. Загрузил ROM1 (16К) по адресу #8000.
2. С адреса #10000 сформировал 30 банков по 16K и загрузил туда соответствующие данные.

То есть теперь все данные загружены. Но я по-прежнему не знаю как сделать так, чтобы IDA Pro думала, что это именно банки, включаемые в одно окно, а не последовательно расположенные сегменты. И я даже не могу найти пример, чтобы посмотреть, как это должно выглядеть. Мне кажется, что это можно как-то задать даже в самой программе и не обязательно на этапе загрузки.

CityAceE
27.01.2017, 09:24
Дизассемблирование The Legand og Zelda для GameBoy оказалось хоть и увлекательным занятием, но довольно сложным и отнимающим много времени. А кроме того, на первоначально этапе работа идёт довольно медленно.



ROM0:0150 ; ---------------------------------------------------------------------------
ROM0:0150
ROM0:0150 beginning: ; CODE XREF: sub_38+C9j
ROM0:0150 call lcd_ini
ROM0:0153 ld sp, $DFFF
ROM0:0156 xor a
ROM0:0157 ld [BGP], a
ROM0:0159 ld [OBP0], a
ROM0:015B ld [OBP1], a
ROM0:015D ld hl, $8000
ROM0:0160 ld bc, $1800
ROM0:0163 call zero_fill_block
ROM0:0166 call clear_bg_data
ROM0:0169 call clear_user_stack_ram
ROM0:016C ld a, 1
ROM0:016E ld [bank], a
ROM0:0171 call dma_sub_transfer
ROM0:0174 call dma_put_sprite
ROM0:0177 call screen_init
ROM0:017A call from_c_to_tiles
ROM0:017D ld a, $44 ; 'D'
ROM0:017F ld [LCD_Status], a
ROM0:0181 ld a, $4F ; 'O'
ROM0:0183 ld [LY_Compare], a
ROM0:0185 ld a, 1
ROM0:0187 ld [bank_copy], a
ROM0:018A ld a, 1
ROM0:018C ld [IE], a
ROM0:018E ld a, 1
ROM0:0190 ld [bank], a
ROM0:0193 call clear_and_init
ROM0:0196 ld a, $1F
ROM0:0198 ld [bank], a
ROM0:019B call loc_4000 ; Init sound?
ROM0:019E ld a, $18
ROM0:01A0 ld [byte_FFB5], a
ROM0:01A2 ei
ROM0:01A3 jp start
ROM0:01A6 ; ---------------------------------------------------------------------------


Я предположил, что в IDA Pro должна быть возможность совместной работы над одним проектом. Изучение данного вопроса привело к The collabREate Plugin for IDA Pro (http://www.idabook.com/collabreate/). Чтобы совместно работать над каким-то проектом необходимо поднять сервер и установить плагин. Сервер я благополучно поднял. Плагин к нему коннектится. До конца, правда, не протестировал, так как я пока (?) только один пользователь.

Нет ли желающих присоединиться? Напомню, что в GameBoy установлена разновидность Z80. Так что для тех, кто знаком с программированием под ZX Spectrum, всё будет привычно. Если удастся распотрошить код игры, то в дальнейшем уже можно будет серьёзно подумать о портировании игры под ZX Spectrum.

Shiny
27.01.2017, 09:54
Если будет готовый исходник с комментариями, я бы попробовал.


ld [byte_FFB5], a

назначение переменной неясно, похоже, что переменная для игровой логики.

CityAceE
27.01.2017, 10:32
Если будет готовый исходник с комментариями, я бы попробовал.
Готовый исходник с комментариями чего? Я как раз и предлагаю совместными усилиями сделать исходник из бинарника и снабдить его комментариями.


назначение переменной неясно, похоже, что переменная для игровой логики.
С этой переменной я пока не разобрался - их там ещё вагон и маленькая тележка. Предыдущие переменные и процедуры в представленном куске я переименовывал сам, исходя из документации по архитектуре GameBoy и анализа работы игры под эмулятором. Собственно, этот кусок я и привёл в качестве примера того, что должно получится. А вот тот же кусок до моего вмешательства:



ROM:0150 loc_150: ; CODE XREF: sub_38+C9j
ROM:0150 call sub_2881
ROM:0153 ld sp, $DFFF
ROM:0156 xor a
ROM:0157 ld [byte_FF47], a
ROM:0159 ld [byte_FF48], a
ROM:015B ld [byte_FF49], a
ROM:015D ld hl, $8000
ROM:0160 ld bc, $1800
ROM:0163 call sub_2999
ROM:0166 call sub_28A8
ROM:0169 call sub_298A
ROM:016C ld a, 1
ROM:016E ld [byte_2100], a
ROM:0171 call sub_7D19
ROM:0174 call loc_FFC0
ROM:0177 call sub_40CE
ROM:017A call sub_2B6B
ROM:017D ld a, $44 ; 'D'
ROM:017F ld [byte_FF41], a
ROM:0181 ld a, $4F ; 'O'
ROM:0183 ld [byte_FF45], a
ROM:0185 ld a, 1
ROM:0187 ld [byte_DBAF], a
ROM:018A ld a, 1
ROM:018C ld [byte_FFFF], a
ROM:018E ld a, 1
ROM:0190 ld [byte_2100], a
ROM:0193 call sub_460F
ROM:0196 ld a, $1F
ROM:0198 ld [byte_2100], a
ROM:019B call loc_4000
ROM:019E ld a, $18
ROM:01A0 ld [byte_FFB5], a
ROM:01A2 ei
ROM:01A3 jp loc_3BD
ROM:01A6 ; ---------------------------------------------------------------------------

Shiny
27.01.2017, 10:40
Я как раз и предлагаю совместными усилиями сделать исходник из бинарника и снабдить его комментариями

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


Готовый исходник с комментариями чего?

В идеале - с комментариями при вызове процедур(если это возможно), заодно с картой банков - назначение(тайлы, процедуры).


С этой переменной я пока не разобрался - их там ещё вагон и маленькая тележка
не знаю, поможет ли нет: в 5.5 есть такая фича- навести курсор на метку и нажать X, появится окно с фрагментами кода, где метка фигурирует.

HardWareMan
27.01.2017, 10:46
http://savepic.ru/12760188m.jpg (http://savepic.ru/12760188.jpg)
Это страница из этого старого журнала (http://tv-games.ru/media/open/igrovie_pristavki_remont.html), он дает базовые знания. Там есть и примеры в конце.

Shiny
27.01.2017, 10:56
А вообще, начните с этого старого журнала, он даст базовые знания

Спасибо, мне итак хватает.

HardWareMan
27.01.2017, 11:05
Спасибо, мне итак хватает.
А зачем изменять комментарий? От этого и меняется смысл после написанного.

Shiny
27.01.2017, 11:17
А зачем изменять комментарий? От этого и меняется смысл после написанного

а о чем Вам скажет call sub_2881 ?

HardWareMan
27.01.2017, 11:38
а о чем Вам скажет call sub_2881 ?
Когда я писал ответ, в вашем посте было лишь LD (Byte_FFB3),A. И вы спрашивали за "непонятно имя переменной". Собственно, проехали уже.

Shiny
27.01.2017, 11:52
Когда я писал ответ, в вашем посте было лишь LD (Byte_FFB3),A. И вы спрашивали за "непонятно имя переменной". Собственно, проехали уже

Похоже, что Вы не читали доки по приведенной ссылке. Адрес $FF83 - свободная для записи область. Наверняка ячейка используется как переменная.

AndyD
27.01.2017, 12:37
Нет ли желающих присоединиться?
Интересно посмотреть как это работает,нужен сервер и порт (дефолтный 5042),да и наверно идовский *.IDB выложить того что есть,у меня ида 6.1

CityAceE
27.01.2017, 13:30
нужен сервер и порт
Ещё пользователя завести на сервере нужно.

HardWareMan
27.01.2017, 13:48
Похоже, что Вы не читали доки по приведенной ссылке. Адрес $FF83 - свободная для записи область. Наверняка ячейка используется как переменная.
Две вещи:
1. Я слепошара, ибо ваш пост никуда не делся, просто добавилось два больших, которые отодвинули ваш за поле зрения.
2. Вы не находите, что B это далеко не 8? А это уже не ОЗУ, тем более после нее сразу идет EI.
http://savepic.ru/12752781.png

AndyD
27.01.2017, 17:00
Ещё пользователя завести на сервере нужно.
Так сервер ,я так понимаю,у вас запущен и значит
Basic capabilities supported by the collabREate server manager:

Add, list, and edit users
List existing server connections
List, delete, import, and export projects
или как?

jerri
27.01.2017, 21:48
Учись писать лодырь под ИДУ. Санч написал свой для NES и там нормально банки разбиваются и дизаются. Я написал свой для MD, но там переключений то и нет. И ты давай пиши нормальный.

а как писать? где ознакомится?
а как оно вообще работать должно?

HardWareMan
27.01.2017, 22:53
jerri, можно почитать Криса Касперски. У него были книги как по работе с самой Идой, так и про написания плагинов к ней (эта есть у меня в бумаге, но я все равно не читал). Но проще просто взять чужой проект и сделать свой на основе него. Это же просто Microsoft Visual C проект.

- - - Добавлено - - -

PS Вот тут проект от Санча. http://forum.emu-russia.net/viewtopic.php?f=13&t=457

CityAceE
28.01.2017, 03:45
Так сервер ,я так понимаю,у вас запущен
Да, запущен и всё работает. Но добавлять к нему некого! Желающих пока нет. Или "Интересно посмотреть как это работает" - это и есть заявка для участия в проекте?


Вот тут проект от Санча.
К сожалению, этот лоадер не воспринимает стандартные файлы *.nes. Во всяком случае у меня не получилось загрузить их ни в IDA 6.8, ни в IDA 5.2, для которой этот плагин, собственно, и написан. Где взять другие файлы я не знаю.

Из исходников лоадера:


if(_hdr.signature == 0x1A53454E)

Я таких файлов у себя не нашёл. Во всех файлах символы в заголовке идут в обратном порядке.

HardWareMan
28.01.2017, 09:24
К сожалению, этот лоадер не воспринимает стандартные файлы *.nes. Во всяком случае у меня не получилось загрузить их ни в IDA 6.8, ни в IDA 5.2, для которой этот плагин, собственно, и написан. Где взять другие файлы я не знаю.
Ну вот что я сделал не так?
http://savepic.ru/12734422.png
http://savepic.ru/12731350.png

Из исходников лоадера:

if(_hdr.signature == 0x1A53454E)
Я таких файлов у себя не нашёл. Во всех файлах символы в заголовке идут в обратном порядке.
x86. Ты знаешь его особенность?

AndyD
28.01.2017, 10:50
это и есть заявка для участия в проекте?
Это интересно в плане группового разбора сложных программ,например Элиту в соседней ветке в одиночестве ни кто разбирать не будет или не доведет до конца начатое.А тут коллективный разум,может чего получится.
можно попробовать поразбираться в зельде.

AlexG
28.01.2017, 19:45
Из исходников лоадера:


if(_hdr.signature == 0x1A53454E)

Я таких файлов у себя не нашёл. Во всех файлах символы в заголовке идут в обратном порядке.
Есть подозрение на порядок байтов
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1% D0%B0%D0%B9%D1%82%D0%BE%D0%B2
имхо

CityAceE
30.01.2017, 05:53
Ну вот что я сделал не так?
Запустил 32-х битную версию, в то время как я постоянно запускал 64-х битную. На 32-х битной версии программы плагин заработал и в IDA 5.2, и в IDA 6.8. И там я, наконец, увидел как оно должно выглядеть.

После долгих ковыряний и экспериментов, наконец-то, удалось добиться нужного результата!

http://storage2.static.itmages.ru/i/17/0130/s_1485741068_8143049_563d2031fc.png (https://itmages.ru/image/view/5419617/563d2031)


можно попробовать поразбираться в зельде.

Чуть подшаманю ещё и когда всё будет готово, добавлю всех желающих.

CityAceE
30.01.2017, 11:46
Что-то все равно не так с этими банками.

Есть такие системные ячейки, которые прекрасно видны 0-й страницы:


IO:FF24 NR50_channel_ctrl:ds 1
IO:FF25 NR51_selection_snd_term:ds 1
IO:FF26 NR52_sounf_on_off:ds 1


Но стоит переключиться на страницу 31 (#1F), то видим жёстко заданные ячейки:



ROM1F:400C loc_8400C: ; CODE XREF: ROM1F:400Fj
ROM1F:400C ld [hl], 0
ROM1F:400E inc l
ROM1F:400F jr nz, loc_8400C
ROM1F:4011 ld a, $80 ; 'А'
ROM1F:4013 ld [$FF26], a
ROM1F:4015 ld a, $77 ; 'w'
ROM1F:4017 ld [$FF24], a
ROM1F:4019 ld a, $FF
ROM1F:401B ld [$FF25], a
ROM1F:401D ret

AndyD
02.02.2017, 10:38
Но стоит переключиться на страницу 31 (#1F), то видим жёстко заданные ячейки:
По моему так и должно быть,это же ячейки ВВ и они при любых страницах находятся по этим адресам.

CityAceE
02.02.2017, 10:45
По моему так и должно быть
Нет, так быть не должно! Правильный листинг должен выглядеть примерно так:



ROM1F:400C loc_8400C: ; CODE XREF: ROM1F:400Fj
ROM1F:400C ld [hl], 0
ROM1F:400E inc l
ROM1F:400F jr nz, loc_8400C
ROM1F:4011 ld a, $80 ; 'А'
ROM1F:4013 ld [NR52_sounf_on_off], a
ROM1F:4015 ld a, $77 ; 'w'
ROM1F:4017 ld [NR50_channel_ctrl], a
ROM1F:4019 ld a, $FF
ROM1F:401B ld [NR51_selection_snd_term], a
ROM1F:401D ret


И эта пока неразрешимая проблема, которая мешает начать полноценную работу.

HardWareMan
02.02.2017, 11:51
Вы о чем, люди? Встаем на интересующий адрес с DB и жмем N. Вы хоть инструкцию то читали по IDA?

AndyD
02.02.2017, 12:36
Встаем на интересующий адрес с DB и жмем N
не все так просто,проблема именно в страницах,адреса светятся красным и не переименовываются.

HardWareMan
02.02.2017, 14:58
Покажите мне карту сегментов. Или дайте базу и я покажу что не так.

CityAceE
02.02.2017, 15:32
Или дайте базу и я покажу что не так.
Вот, пожалуйста, база (https://yadi.sk/d/aK9Xn3ht3CT6LG).

HardWareMan
02.02.2017, 19:25
В общем, все проблемы из-за того, что IDA не заточена под банксвитчинг. Несмотря на то, что вы при создании базы присвоили всем переключаемым сегментам адреса 4000-7FFF, IDA этот параметр применяет только к счетчику команд, продолжая использовать реальный адрес сегмента в исходном файле для вычисления относительных адресов. Потому как рушатся только те команды, которые, используют относительную адресацию операнда. Кстати, они не соответствуют Z80. И если отменить распознавание и по чистому запустить сразу, например, в сегменте ROM04, то все ошибочные адреса вылезают в ROM06, что и соответствует правильным адресам, если бы ROM04 реально стоял в 4000, а ROM06 при этом как раз попадает на ОЗУ. У IDA есть вот такое окно:
http://savepic.ru/12838088.png
Это карта видимости сегментов. И согласно мапперу, ROM00 должен видеть всех, а ROM01...ROM1F должны видеть только ROM00 и все верхние сегменты (адреса внутри процессора 8000-FFFF). Если это указать здесь, то часть ошибок уходит, остаются только спецкоманды Шарпа с относительной адресацией. И я не знаю, как это решить здесь, может плагин-маппер нужно написать (не путать с лоадером)?

PS А вот массивы лучше задавать вот с такими параметрами:
http://savepic.ru/12818632.png
И тогда, было:
http://savepic.ru/12815560.png
Стало:
http://savepic.ru/12806344.png

- - - Добавлено - - -

Ах да, куча мест, где код распознан как массив и наоборот (например, массив выше это код). Продолжайте изучать тему дизассемблинга, повышайте свое мастерство. И, быть может, в этом как раз и таится загадка этих ошибочных адресов, которых быть и не должно. Кто знает?

CityAceE
03.02.2017, 01:31
У IDA есть вот такое окно:
Да, я пытался шаманить в том окне, аналогичным образом, но это, к сожалению, не принесло нужного результата.


Ах да, куча мест, где код распознан как массив и наоборот (например, массив выше это код). Продолжайте изучать тему дизассемблинга, повышайте свое мастерство. И, быть может, в этом как раз и таится загадка этих ошибочных адресов, которых быть и не должно. Кто знает?
Это скорее пожелание к IDA Pro, а не ко мне :) Потому что я предоставил базу сразу после загрузки в неё бинарника и автоматического распознавания без малейшего вмешательства с моей стороны, чтобы полностью исключить нарушение логики переключения банков, включая и окно, о котором шла речь выше. Поэтому, естественно, во многих местах код и массивы автоматически определены неверно.

jerri
18.02.2017, 23:09
В общем, все проблемы из-за того, что IDA не заточена под банксвитчинг. Несмотря на то, что вы при создании базы присвоили всем переключаемым сегментам адреса 4000-7FFF, IDA этот параметр применяет только к счетчику команд, продолжая использовать реальный адрес сегмента в исходном файле для вычисления относительных адресов. Потому как рушатся только те команды, которые, используют относительную адресацию операнда. Кстати, они не соответствуют Z80. И если отменить распознавание и по чистому запустить сразу, например, в сегменте ROM04, то все ошибочные адреса вылезают в ROM06, что и соответствует правильным адресам, если бы ROM04 реально стоял в 4000, а ROM06 при этом как раз попадает на ОЗУ. У IDA есть вот такое окно:
http://savepic.ru/12838088.png
Это карта видимости сегментов. И согласно мапперу, ROM00 должен видеть всех, а ROM01...ROM1F должны видеть только ROM00 и все верхние сегменты (адреса внутри процессора 8000-FFFF). Если это указать здесь, то часть ошибок уходит, остаются только спецкоманды Шарпа с относительной адресацией. И я не знаю, как это решить здесь, может плагин-маппер нужно написать (не путать с лоадером)?


а как вызвать это окно в IDA 6.8?
где и как искать?

HardWareMan
18.02.2017, 23:56
Там же, где и остальные окна про сегменты.

jerri
20.02.2017, 11:35
HardWareMan, ага в версии 6.8 такого нет

OrionExt
20.02.2017, 13:13
Раз уж зашла речь о loaders. Вот вам варианты на Python. Пишем Loader в любом текстовом редакторе, ложем в папку loaders и пользуемся.

CityAceE
20.02.2017, 13:31
в версии 6.8 такого нет
Есть, конечно! Edit -> Segments -> Change segment translation...

jerri
21.02.2017, 01:29
Есть, конечно! Edit -> Segments -> Change segment translation...

вот это я и спрашивал

- - - Добавлено - - -

CityAceE, вот тут немного (https://www.dropbox.com/s/dxvfkgpaikrhvnv/Legend%20of%20Zelda%2C%20The%20-%20Link%27s%20Awakening%20%28USA%2C%20Europe%29.id b?dl=0) поковырял 31 банк

jerri
11.07.2017, 12:03
Не прошло и 5 лет

я научился дизасмить идой ГеймБой

вопросы можно писать