| Разработка и ромхакинг > Ромхакинг и программирование |
| Как вычислять поинтеры в дебаггере PCSX? (вопрос) |
| (1/1) |
| Makovar:
Вот допустим задампил RAM, нашёл адрес текста, который выводится на экран, перезапустил ром, поставил бряк на MemWrite по этому адресу, он сработал. Какие потом манипуляции? Прошу знающих поделиться инфой. Или всё-таки по типу если я не смог сам разобраться, то ни к чему и заморачиваться.?. |
| HoRRoR:
Что-то заголовок темы и сама тема отличаются... Поинтеры на PSX обычно имеют вид 0x80xxxxxx, но, вроде, поинтер без подобного префикса тоже будет работать (это тоже адресное пространство RAM, т.е. 0x80002000 по идее будет соответствовать 0x00002000). Но я с этим не заморачивался, использовал 0x80xxxxxx. --- Цитата: Makovar от 27 Октябрь 2008, 11:24:14 ---Вот допустим задампил RAM, нашёл адрес текста, который выводится на экран, перезапустил ром, поставил бряк на MemWrite по этому адресу, он сработал. Какие потом манипуляции? --- Конец цитаты --- Дальше исследуешь код и смотришь, что откуда копируется и откуда грузится. |
| BoreS:
Да, а лучше эти поинтеры вычислять с помощью таких хакеров как ХоРРоР :) |
| Makovar:
--- Цитата: HoRRoR от 27 Октябрь 2008, 12:24:20 ---Что-то заголовок темы и сама тема отличаются... --- Конец цитаты --- Не пойму... Надо было назвать тему - "Как исследовать код из дебаггера?" может быть? --- Цитата: HoRRoR от 27 Октябрь 2008, 12:24:20 ---Поинтеры на PSX обычно имеют вид 0x80xxxxxx, но, вроде, поинтер без подобного префикса тоже будет работать (это тоже адресное пространство RAM, т.е. 0x80002000 по идее будет соответствовать 0x00002000). Но я с этим не заморачивался, использовал 0x80xxxxxx. --- Конец цитаты --- И на том спасибо. --- Цитата: HoRRoR от 27 Октябрь 2008, 12:24:20 ---Дальше исследуешь код и смотришь, что откуда копируется и откуда грузится. --- Конец цитаты --- Попытка исследовать код: ADDI a1, a1, 0002 Instruction Description Syntax Result ----------- ----------- ------ ------ ADDI Add Immediate Word ADDI rt, rs, immed rt = rs + immed. В регистре a1 - адрес, на который я ставил бряк. Жму "Run" - срабатывает следующий бряк. ADDIU sp, sp, FFE8 ADDIU Add Immediate Unsigned Word ADDIU rt, rs, immed. rt = rs + immed. Адрес sp - 801FFEE8. Дамплю память. По адресу 801FFEE8 вижу последовательность 4-х байт, которую несколько раз встречается в файле, в котором шрифты лежат. Адреса 20FED0 (1FFEE8+FFE8) в оперативе нет. Жму "Run" - срабатывает следующий бряк. LBU v0, 0000, a1 LBU Load Byte Unsigned LBU rt, off(base) rt = memory[base+off] 8 bit v0 - 00000057, a1 - 801488D3 Дамплю память. Текст, который выводится на экран начинается с 801488D2. Жму "Run", включаю дебаггер - текст записан в память по адресу, на который я ставил бряк. А чтобы вычислить что откуда грузится, надо ставить бряк на чтение секторов я так понял? Добавлено позже: --- Цитата: BoreS от 27 Октябрь 2008, 13:10:48 ---Да, а лучше эти поинтеры вычислять с помощью таких хакеров как ХоРРоР :) --- Конец цитаты --- Спасибо за совет. Приму к сведению. Когда WMZ появятся на кошельке - подумаю об этом. |
| HoRRoR:
Кстати, учти, что бряк срабатывает после выполнения инструкции, которая даёт условия для бряка. --- Цитата: Makovar от 27 Октябрь 2008, 13:22:40 ---Попытка исследовать код: --- Конец цитаты --- Разве одна инструкция - код? :) Проще говоря, эту инструкцию можно записать как a1+=2; (a1=a1+2) Надо смотреть, что делается дальше. Видимо, там цикл... Смотри, откуда значения читаются, прежде чем записаться на место искомых данных. А если данные не пожаты, не криптованы и т.п., то, скорей всего, данный бряк тебе ничего не даст, ибо в таких случаях обычно данные грузятся прямиком с диска, а т.к. чтение с диска происходит через DMA, то, само собой, CPU не будет писать никакие данные по тому адресу и бряк не сработает. Сперва прогони поиск с помощью Total Commander'а по папке диска с цепочкой данных, которую ты хочешь найти. --- Цитата ---Адрес sp - 801FFEE8. Дамплю память. По адресу 801FFEE8 вижу последовательность 4-х байт, которую несколько раз встречается в файле, в котором шрифты лежат. Адреса 20FED0 (1FFEE8+FFE8) в оперативе нет. --- Конец цитаты --- sp - стек, если я правильно помню. Вряд ли там будут какие-либо данные. Значения в основном, вроде адресов и переменных всяких. Лучше отлавливать их по ходу выполнения кода, а не копаться в стеке. --- Цитата ---Жму "Run" - срабатывает следующий бряк. LBU v0, 0000, a1 ... v0 - 00000057, a1 - 801488D3 Дамплю память. Текст, который выводится на экран начинается с 801488D2. --- Конец цитаты --- Инструкция означает "загрузить в v0 байт из адреса 801488D3". Т.е. это процедура вывода текста. И обрабатывает она второй символ. --- Цитата ---А чтобы вычислить что откуда грузится, надо ставить бряк на чтение секторов я так понял? --- Конец цитаты --- Сначала стоит просто поискать те данные обычным поиском в файлах. А потом уже, если не получится, отлавливать чтение с диска. --- Цитата: Makovar от 27 Октябрь 2008, 13:22:40 ---Спасибо за совет. Приму к сведению. --- Конец цитаты --- Эм... Это шутка была, если что) Добавлено позже: Кстати, ты в чём дебажишь? "LBU v0, 0000, a1" обычно имеет вид "LBU v0, 0000(a1)" |
| Makovar:
--- Цитата: HoRRoR от 27 Октябрь 2008, 13:42:59 ---Кстати, учти, что бряк срабатывает после выполнения инструкции, которая даёт условия для бряка. Разве одна инструкция - код? :) Проще говоря, эту инструкцию можно записать как a1+=2; (a1=a1+2) Надо смотреть, что делается дальше. Видимо, там цикл... Смотри, откуда значения читаются, прежде чем записаться на место искомых данных. А если данные не пожаты, не криптованы и т.п., то, скорей всего, данный бряк тебе ничего не даст, ибо в таких случаях обычно данные грузятся прямиком с диска, а т.к. чтение с диска происходит через DMA, то, само собой, CPU не будет писать никакие данные по тому адресу и бряк не сработает. Сперва прогони поиск с помощью Total Commander'а по папке диска с цепочкой данных, которую ты хочешь найти. sp - стек, если я правильно помню. Вряд ли там будут какие-либо данные. Значения в основном, вроде адресов и переменных всяких. Лучше отлавливать их по ходу выполнения кода, а не копаться в стеке. Инструкция означает "загрузить в v0 байт из адреса 801488D3". Т.е. это процедура вывода текста. И обрабатывает она второй символ. Сначала стоит просто поискать те данные обычным поиском в файлах. А потом уже, если не получится, отлавливать чтение с диска. Эм... Это шутка была, если что) Добавлено позже: Кстати, ты в чём дебажишь? "LBU v0, 0000, a1" обычно имеет вид "LBU v0, 0000(a1)" --- Конец цитаты --- Премного благодарен! Такой ответ я и хотел увидеть. Есть уже на что опираться. Дебажу в PCSX emulator with debugger ((modified by Zidane) modified by HoRRoR). Опечатка там. Кроме этого ещё три дебаггера есть. |
| HoRRoR:
--- Цитата ---Дебажу в PCSX emulator with debugger ((modified by Zidane) modified by HoRRoR). Опечатка там. --- Конец цитаты --- Странно, но ведь именно там точно вид таких инструкций "Instr rr, XXXX(rr)" o_0 |
| Makovar:
--- Цитата: HoRRoR от 27 Октябрь 2008, 14:05:23 ---Странно, но ведь именно там точно вид таких инструкций "Instr rr, XXXX(rr)" o_0 --- Конец цитаты --- Я имел ввиду у меня в посте опечатка. Добавлено позже: Может бряк надо ставить на чтение этого текста из памяти, а не на запись? И оттуда уже отслеживать? Он же читает по координатам из поинтера я так понимаю... |
| HoRRoR:
--- Цитата ---Может бряк надо ставить на чтение этого текста из памяти, а не на запись? И оттуда уже отслеживать? Он же читает по координатам из поинтера я так понимаю... --- Конец цитаты --- Тогда я не пойму, что именно ты хочешь сделать? И не по координатам, а по адресу. |
| Makovar:
--- Цитата: HoRRoR от 27 Октябрь 2008, 15:02:23 ---Тогда я не пойму, что именно ты хочешь сделать? И не по координатам, а по адресу. --- Конец цитаты --- Хочу найти, в каком файле по какоду адресу находится поинтер, который указывает на нужную мне строку в файле с текстом. |
| HoRRoR:
--- Цитата: Makovar от 27 Октябрь 2008, 15:17:58 ---Хочу найти, в каком файле по какоду адресу находится поинтер, который указывает на нужную мне строку в файле с текстом. --- Конец цитаты --- Сперва проверь в том же файле. Поинтер будет либо относительный (указывает на место в файле), либо абсолютный (указывает на место в RAM). Хотя, если ты нашёл строку, где считывается символ - найти, откуда берётся адрес не составит труда. Пролистай вверх и посмотри, откуда берётся адрес, лежащий в a1. Или же поставь бряк на a1=801488D2. |
| Makovar:
--- Цитата: HoRRoR от 27 Октябрь 2008, 16:36:33 ---Сперва проверь в том же файле. Поинтер будет либо относительный (указывает на место в файле), либо абсолютный (указывает на место в RAM). Хотя, если ты нашёл строку, где считывается символ - найти, откуда берётся адрес не составит труда. Пролистай вверх и посмотри, откуда берётся адрес, лежащий в a1. Или же поставь бряк на a1=801488D2. --- Конец цитаты --- В том же файле конечно же нет. Поставил бряк на a1=801488D2. Понял, что не там надо копать. Значение передаётся из a в s, записывается в стек, потом извлекается... Вобщем я понял, что ты говорил насчёт стека... Я тут почитал доки вобщем. Регистры a0-a3 - это аргументы фукнции, t1-t7 - для хранения временных данных, s0-s7 - для сохранения, а v0-v1 - значения, которые возвращает функция. Поэтому я поставил бряк на v0=801488D2, вроде как именно здесь первоисточник. Потом нашёл адрес в памяти, с которого считались данные в v0 (там было скопление всех поинтеров). Поставил бряк на запись по этому адресу... Дальше пока сложно понять код (циклы, условия, джампы), но принцип ясен. Буду читать, разбираться. Спасибо за помощь! Начал вникать потихоньку. |
| Makovar:
Вобщем в той игре, которую я исследую, получается нет никаких поинтеров. Они есть только в оперативе. Я нашёл, где в памяти находится поинтер, указывающий на строку, выводимую на экран, поставил бряк на запись по этому адресу и поставил галку на "Log memory reading". В логе читалась строка по последнему записанному поинтеру до стоп-байта и таким образом вычислялся следующий поинтер. Я сдвинул стоп-байт в файле с текстом на три байта вправо, и по тому адресу записался поинтер 801488D5. И соответственно строка вывелась без первых трёх символов. Т.е получается в игре происходит считывание строк по порядковому номеру строки, как-то так. Как в других играх ещё не смотрел... |
| HoRRoR:
Считай, что тебе повезло - текст без каких-либо заморочек, редактируй как хочешь. |
| Навигация |
| Главная страница сообщений |