Автор Тема: Как вычислять поинтеры в дебаггере PCSX? (вопрос)  (Прочитано 5663 раз)

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

Makovar

  • Гость
Вот допустим задампил RAM, нашёл адрес текста, который выводится на экран, перезапустил ром, поставил бряк на MemWrite по этому адресу, он сработал. Какие потом манипуляции?
Прошу знающих поделиться инфой.
Или всё-таки по типу если я не смог сам разобраться, то ни к чему и заморачиваться.?.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Что-то заголовок темы и сама тема отличаются... Поинтеры на PSX обычно имеют вид 0x80xxxxxx, но, вроде, поинтер без подобного префикса тоже будет работать (это тоже адресное пространство RAM, т.е. 0x80002000 по идее будет соответствовать 0x00002000). Но я с этим не заморачивался, использовал 0x80xxxxxx.

Вот допустим задампил RAM, нашёл адрес текста, который выводится на экран, перезапустил ром, поставил бряк на MemWrite по этому адресу, он сработал. Какие потом манипуляции?
Дальше исследуешь код и смотришь, что откуда копируется и откуда грузится.

Оффлайн BoreS

  • Пользователь
  • Сообщений: 60
  • Пол: Мужской
    • ВКонтакте
    • Просмотр профиля
Да, а лучше эти поинтеры вычислять с помощью таких хакеров как ХоРРоР :)

Makovar

  • Гость
Re: Как вычислять поинтеры в дебаггере PCSX? (вопр&
« Ответ #3 : 27 Октябрь 2008, 13:22:40 »
Что-то заголовок темы и сама тема отличаются...
Не пойму... Надо было назвать тему - "Как исследовать код из дебаггера?" может быть?

Поинтеры на PSX обычно имеют вид 0x80xxxxxx, но, вроде, поинтер без подобного префикса тоже будет работать (это тоже адресное пространство RAM, т.е. 0x80002000 по идее будет соответствовать 0x00002000). Но я с этим не заморачивался, использовал 0x80xxxxxx.
И на том спасибо.

Дальше исследуешь код и смотришь, что откуда копируется и откуда грузится.

Попытка исследовать код:

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", включаю дебаггер - текст записан в память по адресу, на который я ставил бряк.


А чтобы  вычислить что откуда грузится, надо ставить бряк на чтение секторов я так понял?

Добавлено позже:
Да, а лучше эти поинтеры вычислять с помощью таких хакеров как ХоРРоР :)

Спасибо за совет. Приму к сведению. Когда WMZ появятся на кошельке - подумаю об этом.
« Последнее редактирование: 27 Октябрь 2008, 13:44:34 от Makovar »

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Кстати, учти, что бряк срабатывает после выполнения инструкции, которая даёт условия для бряка.


Попытка исследовать код:
Разве одна инструкция - код? :) Проще говоря, эту инструкцию можно записать как 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".
Т.е. это процедура вывода текста. И обрабатывает она второй символ.

Цитата
А чтобы  вычислить что откуда грузится, надо ставить бряк на чтение секторов я так понял?
Сначала стоит просто поискать те данные обычным поиском в файлах. А потом уже, если не получится, отлавливать чтение с диска.

Спасибо за совет. Приму к сведению.
Эм... Это шутка была, если что)

Добавлено позже:
Кстати, ты в чём дебажишь? "LBU v0, 0000, a1" обычно имеет вид "LBU v0, 0000(a1)"

Makovar

  • Гость
Кстати, учти, что бряк срабатывает после выполнения инструкции, которая даёт условия для бряка.

Разве одна инструкция - код? :) Проще говоря, эту инструкцию можно записать как 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

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Цитата
Дебажу в PCSX emulator with debugger ((modified by Zidane) modified by HoRRoR). Опечатка там.
Странно, но ведь именно там точно вид таких инструкций "Instr rr, XXXX(rr)"  o_0

Makovar

  • Гость
Странно, но ведь именно там точно вид таких инструкций "Instr rr, XXXX(rr)"  o_0
Я имел ввиду у меня в посте опечатка.

Добавлено позже:
Может бряк надо ставить на чтение этого текста из памяти, а не на запись? И оттуда уже отслеживать? Он же читает по координатам из поинтера я так понимаю...

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Цитата
Может бряк надо ставить на чтение этого текста из памяти, а не на запись? И оттуда уже отслеживать? Он же читает по координатам из поинтера я так понимаю...
Тогда я не пойму, что именно ты хочешь сделать? И не по координатам, а по адресу.

Makovar

  • Гость
Тогда я не пойму, что именно ты хочешь сделать? И не по координатам, а по адресу.
Хочу найти, в каком файле по какоду адресу находится поинтер, который указывает на нужную мне строку в файле с текстом.

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Как вычислять поинтеры в дебаггере PCSX? (вопр&
« Ответ #10 : 27 Октябрь 2008, 16:36:33 »
Хочу найти, в каком файле по какоду адресу находится поинтер, который указывает на нужную мне строку в файле с текстом.
Сперва проверь в том же файле. Поинтер будет либо относительный (указывает на место в файле), либо абсолютный (указывает на место в RAM). Хотя, если ты нашёл строку, где считывается символ - найти, откуда берётся адрес не составит труда. Пролистай вверх и посмотри, откуда берётся адрес, лежащий в a1. Или же поставь бряк на a1=801488D2.

Makovar

  • Гость
Сперва проверь в том же файле. Поинтер будет либо относительный (указывает
на место в файле), либо абсолютный (указывает на место в 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

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Считай, что тебе повезло - текст без каких-либо заморочек, редактируй как хочешь.