Как искать адреса памяти samp

Обновлено: 04.07.2024

В указанном файле перечень адресов некоторых процедур и функций gta-sa.exe 1.0. Надеюсь, что это пригодится вам при исследовании движка игры и написании ассемблерных вставок в main.scm.

Last edited by Seemann (10-09-2007 16:06)

listener Administrator --> From: Vice City Registered: 09-11-2006 Posts: 616 Website

У меня есть порядка еще нескольких сотен адресов. Часть из них - точная или почти точная (например, я нашел Renderware SDK (правда, более новой версии) и хорошенько посидел и посравнивал). Если интересно, я могу попробовать привести это к более-менее нормальной форме и закинуть. Для затравки кусочек мэпа:

Еще (это уже не из библиотечного кода, поэтому имена взяты с потолка (часть была в рудиментах отладочной печати)):

Вообще, я замахнулся ни много, ни мало на OpenGTA. (Хочу LCS/VCS на PC (и Bully туда же), а то на приставке - и тяжело, и по графике/объектам не то). Ну, а если не хватит времени/сил, "не догоню, так согреюсь" - опробую несколько своих идей из теории компиляции/декомпиляции (да и просто так, можно например, размеры пулов объектов увеличить).

У меня есть порядка еще нескольких сотен адресов. Часть из них - точная или почти точная

круто. было бы интересно посмотреть.

Для затравки кусочек мэпа

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

Еще (это уже не из библиотечного кода, поэтому имена взяты с потолка (часть была в рудиментах отладочной печати)):

ага, есть такие пулы. Процедура InitDataPools их инициализирует. По адресу 0x00B74480 хранятся указатели на них.

Вообще, я замахнулся ни много, ни мало на OpenGTA. (Хочу LCS/VCS на PC (и Bully туда же)

слишком большой размах. Попробуй посчитать сколько времени потратили разработчики GTA:LC, чтобы перенести GTA3 на движок вайса. А ведь там был не один человек, а целая команда. И то они еще не закончили (хотя может я отстал от жизни?).

да и просто так, можно например, размеры пулов объектов увеличить

вроде на гтафорумс уже этим занимались. точно не знаю, но читал когда-то.

В общем, интересно посмотреть на результаты твоих исследований.

listener Administrator --> From: Vice City Registered: 09-11-2006 Posts: 616 Website

круто. было бы интересно посмотреть

Причешу - выложу. (Блин! Аврал на работе - уже полтора месяца не вылезаю с работы по 12 часов, а то и больше)

Самое вкусное в библиотечных функциях - это определения:

и так для всего.

не совсем понял что это за значения, на адреса памяти не похожи

ida в .map пишет в формате seg:offset. Т.е. надо прибавлять к смещению базу: 0001:0034E660 = 0074F660.

Попробуй посчитать сколько времени потратили разработчики GTA:LC, чтобы перенести GTA3 на движок вайса

Знаю, что много. Но у меня есть преимущество - я профессионал (и вообще, старый и толстый дядька). Летом будет 15 лет, как у меня в трудовой написано "программист". И дизассемблер я увидел в первый раз почти два десятка лет назад :-) В любом случае, полезной инфы можно будет нарыть много.

На имеющиеся на текущий момент примерно три тысячи адресов (из них 600-800 не библиотечные) + декомпилирование

5% кода - ушло порядка месяца. Дальше - пойдет быстрее (т.к., с расписыванием полей структур процесс очень сильно ускоряется).

Самое вкусное в библиотечных функциях - это определения

я так понимаю, что в SDK только графика? Было бы гораздо интереснее получить скриптинговые структуры (CPed, CPlayer, CCar).

ida в .map пишет в формате seg:offset. Т.е. надо прибавлять к смещению базу: 0001:0034E660 = 0074F660

все равно не получается 0x0074F660 в gta-sa.exe указывает на середину процедуры.

Но у меня есть преимущество - я профессионал (и вообще, старый и толстый дядька). Летом будет 15 лет, как у меня в трудовой написано "программист". И дизассемблер я увидел в первый раз почти два десятка лет назад :-)

снимаю шляпу. мой опыт более-менее серьезного программирования составляет около 2-х лет, а иду я взял в руки только прошлой осенью. Хотя для меня это лишь хобби

т.к., с расписыванием полей структур процесс очень сильно ускоряется

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

2listener:
Кстати, может ты сможешь объяснить мне, для чего используются подобные конструкции:

т.е, я понимаю, что делают отдельные команды, но вот для чего это используется целиком, как это выглядит на высоком уровне?

listener Administrator --> From: Vice City Registered: 09-11-2006 Posts: 616 Website

20M) и т.д.). Декомпилированные куски тоже могу кинуть, но в них сейчас без описания разобраться практически нереально. (А описание нужно писать).

За ссылочки спасибо, посмотрю (по внешнему виду - похоже, кто-то раздобыл либы нужной версии и прогнал через FLAIR).

Last edited by listener (09-01-2007 16:24)

listener Administrator --> From: Vice City Registered: 09-11-2006 Posts: 616 Website

Кстати, может ты сможешь объяснить мне, для чего используются подобные конструкции

Т.е., в зависимости от проверки условия - либо выставляем, либо сбрасываем битовый флаг.
esi->_f1C - поле по смещению 0x1C в структуре, на которую указывает ESI.

У меня эта процедура по адресу 0x0074F610. Первый хреф совпадает (sub_53BB80).

20M) и т.д.). Декомпилированные куски тоже могу кинуть, но в них сейчас без описания разобраться практически нереально. (А описание нужно писать).

пока не надо, сдам экзамены там видно будет сейчас времени совершенно нет.

если что, зальешь прямо на этот сайт, пароль на фтп дам.

Т.е., в зависимости от проверки условия - либо выставляем, либо сбрасываем битовый флаг.
esi->_f1C - поле по смещению 0x1C в структуре, на которую указывает ESI.

а вы, батенька, я смотрю на сях пишете. у меня как-то не сложилось.

listener Administrator --> From: Vice City Registered: 09-11-2006 Posts: 616 Website

У меня эта процедура по адресу 0x0074F610.

Ясно. Похоже версии слегка отличаются. (слинковано с немного другой библиотекой).

пока не надо, сдам экзамены там видно будет

Хорошо. Я за это время чуточку разберусь с работой и займусь описанием, систематизацией и приведением в порядок.

а вы, батенька, я смотрю на сях пишете

Эх, на чем я только не пишу.

Да, совсем забыл:

я так понимаю, что в SDK только графика? Было бы гораздо интереснее получить скриптинговые структуры (CPed, CPlayer, CCar).

Да, только графика.

Вообще, там идет так: у меня, по адресу 00748760 находится WinMain. (не точка входа, а непосредственно, основная функция программы). После него - идут библиотеки RW, дальше - libc и, за ней, достаточно много инициализаторов статических переменных и прочих языковых вещей. До WinMain - практически все - код R* (за исключением libjpeg и какой-то маленькой библитечки RW килобайт на 20).

Насчет структуры CCar - не совсем так. Есть объект CVehicle. От него наследуется четыре объекта для разных видов транспорта. Структура данных для всех объектов одинакова и включает все возможные поля (чтобы можно было пользоваться пулом), а методы - разные.

Насчет CPed (есть ли у него сабклассы) - я еще подробно не копался. У меня помечены VMT для всех классов, но, что от чего наследуется - я еще не расписывал.

Еще есть интересный объект CTask, отвечающий за базовое поведение педов (и машин, соответственно). От него наследуется большая куча (несколько десятков) сабклассов (для некоторых классов - два-три уровня насдледования), каждый из которых отвечает за отдельную поведенческую задачу. (идти, бежать, бояться и т.д.) Какой-за что отвечает - я еще не копался. Никакой отладочной инфы на них нет, есть только числовые идентификаторы.

Предлагаю в этой теме решать вопросы, связанные с адресами памяти. Только вчера добрался до программы IDA (позволяет открывать базу данных адресов gta_sa.exe), так что есть куча вопросов. И так первый вопрос как найти нужный мне адрес. Скачал IDB database by fastman92 для gta_sa 1.0 Hoodlum от 2015 года, открыл базу и все, далее мол иди учи ассемблер, а хотелось бы без этого. Тем более большинство адресов и функций уже найдено. И как узнать адрес функции, расположенной ниже?

На Discord-сервере по plugin-sdk и программированию в GTA есть более "свежая" база.

открыл базу и все, далее мол иди учи ассемблер, а хотелось бы без этого.

IDA генерирует псевдо код на С++ по нажатию клавиши F5, но там ещё надо разбираться, поскольку генерирует не идеально.

По работе с IDA есть такая тема

Если есть IDA и idb-база, то для "распутывания ниточек" можно использовать такие приёмы:

Как определить, откуда вызывается данная функция?
1.Открываем код функции в основной вкладке.
2.Далее выбираем в меню пункт View - Open Subviews - Function calls - список Caller.

Как определить, откуда происходит обращение к данному адресу?
1.Вставляем курсор между буквами названия адреса. Например здесь
Code:

.data:00B7CB84 _currentTime dd ? ; DATA XREF: _sub_406E50r

вставляем курсор между любыми буквами _currentTime.
2.Жмём X. Открывается список ссылок на данный адрес.


Очень часто случается такое, что декомпилятор (hex-rays) выдаёт ошибку "switch analysis failed".
Случается это в функциях, где используется конструкция switch.
Случается это потому что (моё предположение) разные версии декомпилятора по-разному работают с этой
конструкцией.
В официальных доках рекомендуют вручную настроить эту конструкцию, но есть более простое решение:
пересобрать функцию.
Для этого надо преобразовать функцию в обычные данные, преобразовать данные в код, и создать функцию.

1. Нажимаем U на названии функции (Undefine function).
2. Нажимаем C на первом байте (Code)
3. Нажимаем P (Create function).

В exe есть 2 основных типа адресов - data и text (есть и другие типы). Если проводить аналогию со
скриптами, то адреса типа data можно сравнить с глобальными переменными - в них хранятся различные
значения (например, 0xB7CB84 - [dword] Глобальный таймер в ms, 0x8D2530 - [float] Плотность движения
пешеходов). В ходе игры отдельные процедуры exe читают эти значения или записывают в эти адреса новые
значения. Эти адреса (не все) можно читать/перезаписывать и в скрипте с помощью опкодов 0A8C/0A8D.
Назначение некоторых часто употребляемых data-адресов, а также смещений в структурах можно найти тут:
http://gtamodding.ru. еса_Памяти_(SA)
Что касается адресов типа text, то в них записаны отдельные команды, из которых в свою очередь
состоят процедуры exe. Сами по себе значения этих адресов во время игры не меняются, но их, как и
адреса data, можно (не все) менять скриптом - в этом случае в опкодах 0A8C/0A8D следует ставить
значение параметра virtual protect, равное 1. Понятно, что в случае изменения значения text-адреса,
процедура, которой он принадлежит, станет работать уже по новому алгоритму.
Для поиска нужных адресов и процедур незаменима idb-база от listener. Открыть её можно с помощью
IDA 5. В окне программы есть несколько вкладок, которые представляют код exe в различном виде.
Основные из них: "IDA View-A" - основной вид. Если текущий участок exe состоит из адресов типа data,
то они отображаются в виде списка, а если текущий участок является какой-то
процедурой (text-адреса), то она отобразится в виде блок-схемы. "Hex View-A" - побайтовое отображение
кода. Многие data-адреса и процедуры в базе проименованы, при активной вкладке "IDA View-A" можно
осуществлять их поиск по названию (Search - Text).
Есть ещё полезная вкладка Functions - список всех процедур exe. Если эта вкладка активна, то можно
осуществить поиск процедуры по названию (Search). Например, осуществив поиск по слову train, можно
найти процедуры, имеющие отношение к поездам. При щелчке по названию процедуры, активируется вкладка
"IDA View-A" и появится блок-схема этой процедуры, по которой можно исследовать, как она
работает (какие процедуры вызывает, со значениями каких адресов оперирует и т.д.).

И как узнать адрес функции, расположенной ниже?

007F0DC0 - это и есть адрес этой функции, т.е. 0x7F0DC0

И еще вопрос, как находить смещение в адресе для интересующей детали. Если, к примеру, 0@ += 0x678 это у нас bump_front_dummy (Инфа тоже где найдена среди груды перечитанных форумов), то как найти для остальных деталей, при чем даже для тех, что вне дамми. В качестве примера для себя взял скрипт Kenking'a "руль". Значит берётся структура авто и находится деталь по смещению 2@ = 1@ + 0x18 ( Указатель на RwObject (RpClump)), и с помощью функции памяти 0x4C5400 ( CClumpModelInfo::GetFrameFromName(RpClump *,char *)) вызывается эта деталь для дальнейшей работы с ней. Это одна деталь, а как оформить на две детали? Так же через 0х18? Только с другой переменной? И заставить вторую деталь поворачиваться с первой, но чтобы она еще вертелась вокруг своей оси. Такое вообще возможно? Т.е. сейчас на основе скрипта "руль" вместе с поворотом колес - поворачивается первая деталь также по оси-Y (не стал менять адрес, повернул дами в дфф модели и угол в самом скрипте, короче, поворачивает как надо). Вторую деталь вращаться вокруг своей оси заставил, при замене на misc от комбайна, соответственно и модель заменил на сам комбайн. Но тут уже пошло все не так. После переименования поворачивающейся детали в misc_a, а второй в misc_b - первая перестала поворачиваться вместе с поворотом колес. Ну и:

Только по X (float) 0x59AFA0
Только по Y (float) 0x59AFE0
Только по Z (float) 0x59B020

Вызываются опкодом 0AA6

Чтоб тема не совсем утухла буду выкладывать примеры работы с адресами памяти. Пока что простые, так как и сам еще учусь.

В этом уроке мы будет разбираться со статическими адресами памяти.

Работа с памятью одна из самых интересных, так как есть возможность творить с ней что угодно. Нужно помнить, что для работы с памятью требуется наличия оригинального exe-шника версии 1.0 US ( скачать ). Также нужно знать адреса памяти, чтобы можно было их редактировать. Я лично и сам даже части адресов не знаю, поэтому обращаюсь к брошюрке, где написано большинство адресов.

Адреса делятся на две большие группы: статические и динамические. Статические адреса можно редактировать когда угодно, а вот динамические имеют структуры, то есть нам нужно узнавать адреса и делать некие смещения. Рассмотрим опкоды для работы с адресами. Их всего два:

Здесь:
0xC0BC15 - адрес памяти
4 - размер данных, которые нужно записать или прочитать
1 - флаг снятия защиты

Для примера, возьмем текстовый файл. Представьте, что это память. В файле есть целая куча строк - это будут адреса. В каждой строчке что то записано - это будет значение. Смещение - это переход между строками, то есть установка курсора на нужное место. "0xC0BC15" - это номер строки. Это число, записанное в шестнадцатеричном виде. Если выделить его в SB и нажать горячие клавиши CTRL + H , то этот загадочный набор будет читабельным для нас - "12631061". Но указывают обычно в шестнадцатеричной системе счисления. value - это значение, то есть то, что содержит строка. Сами значения имеют тип, которые определят размер ( в байтах ) для записи или чтение, указанных в опкодах, как "size". Вот таблица известных мне типов и их размер:

Таблица 1
Тип ( type )Размер ( size )
int32, float, dword4
int16, word2
byte, bool1

Осталось рассмотреть последний параметр "virtual_protect". Это своего рода флаг снятия защиты от записи в память. Если поставить "1" - защита снимается, "0" - остается как есть. Вот список статических адресов: статические адреса памяти.

Я например нашел подходящий адрес: "0xB7CEE4" - вкл/выкл бесконечный бег. Тип значения, которое он может принимать - булево ( bool ), значит размер ( size ) должен быть "1" ( см. Таблица 1 ). Раз это булевой тип, значит значения могут быть либо "0", либо "1". Выбираем 1 ( включить ). Таким образом, мы получили:

Давайте протестируем дробные числа. Адрес в памяти: "0xB7CB64", тип значения - float, размер ( size ) - "4" байта. Этот адрес отвечает за скорость игры. Давайте изменим её:

Естественно, в место значений можно использовать переменные. Запись мы рассмотрели. Давайте попробуем считать значение, что находится по адресу. Для примера возьмём тот же адрес скорости игры:

Теперь давайте напишем скрипт, который при нажатии клавиши 4 включался/выключался бесконечный бег и изменялась скорость игры:

Обратите внимание на цикл while true. Если есть такая запись, значит цикл будет выполняться бесконечно ( точнее не будет завершаться, пока его не прервут ). Его очень часто используют в скриптеры и, надеюсь, в скорем будущем и вы тоже присоединитесь ;)

Тест в игре показал, что всё работает как ожидалось. На следующих уроках о адресах памяти мы рассмотрим динамические адреса.

MuhammadPawn

Опубликовал MuhammadPawn , 22 декабря, 2017

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Войти

Уже есть аккаунт? Войти в систему.

Последние посетители 0 пользователей онлайн

Похожий контент

Антон Нолмадов

Просмотр файла GREEN TECH | НОВАЯ ВЕРСИЯ
Здравствуйте дорогие форумчане сегодня продаю мод GreenTech RP
Что есть в моде:
- Инты все
- Фракции МЧС, ВЧ, ППС, ДПС, СМП, СПЕЦНАЗ
- Бизнеса с интами
- 7 лвл админок
- Админ команд немного но есть
- Своя Сборка
- Система автомобилей копия с грина взята
- Тюнинг 50% переделка
Также скоро на продаже доработки.

Сборку можно скачать: в папке с модом текстовик там будет всё рассказано.
ЧТО НОВОГО: СИСТЕМА ЗАПРАВКИ
СИСТЕМА ПАСПОРТА С КАРТИНКАМИ ВАШЕГО СКИНА
ПОИСК ПРИСТУПНИКОВ ПО БАЗЕ ДАННЫХ
НУ И ПОФИКСИЛ СКОРОСТИ НА ТАЧКАХ

Добавил Антон Нолмадов Добавлено 21.11.2021 Категория Моды Автор Anton Nolmadov

Антон Нолмадов

Здравствуйте дорогие форумчане сегодня продаю мод GreenTech RP
Что есть в моде:
- Инты все
- Фракции МЧС, ВЧ, ППС, ДПС, СМП, СПЕЦНАЗ
- Бизнеса с интами
- 7 лвл админок
- Админ команд немного но есть
- Своя Сборка
- Система автомобилей копия с грина взята
- Тюнинг 50% переделка
Также скоро на продаже доработки.

Сборку можно скачать: в папке с модом текстовик там будет всё рассказано.
ЧТО НОВОГО: СИСТЕМА ЗАПРАВКИ
СИСТЕМА ПАСПОРТА С КАРТИНКАМИ ВАШЕГО СКИНА
ПОИСК ПРИСТУПНИКОВ ПО БАЗЕ ДАННЫХ
НУ И ПОФИКСИЛ СКОРОСТИ НА ТАЧКАХ

Читайте также: