Работа с памятью игры, exe
|
|
Den_spb | Дата: Четверг, 17.06.2010, 21:54 | Сообщение # 1 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Здесь можно обсудить вопросы, связанные с чтением и записью памяти, вызовом функций gta_sa.exe из клео-скрипта, а также исследованием и редактированием gta_sa.exe.
|
|
| |
ТЭВЗ_FECL | Дата: Пятница, 18.06.2010, 10:11 | Сообщение # 2 |
Группа: Модераторы
Сообщений: 36
Статус: Offline
| А как распаковать эти dll архивы? Ведь в движке есть приложение которое их читает.
|
|
| |
Den_spb | Дата: Пятница, 18.06.2010, 19:35 | Сообщение # 3 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| http://www.google.ru/search?....s_rfai=
|
|
| |
d88 | Дата: Воскресенье, 04.07.2010, 09:37 | Сообщение # 4 |
Группа: Проверенные
Сообщений: 113
Статус: Offline
| Den_spb, а можно сделать через память чтоб при проигрывании анимации удара одного актёра отнималось здоровье и проигрывалась ответная анимация у того, кого он ударил? Скриптом это можно сделать, но много и неудобно, а в игре же наверняка есть эти адреса для разных стилей борьбы.
|
|
| |
Den_spb | Дата: Воскресенье, 04.07.2010, 17:19 | Сообщение # 5 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Не понял вопроса - актёры в игре и так отвечают ударом на удар. Надо заменить анимацию ответного удара или что?
|
|
| |
d88 | Дата: Воскресенье, 04.07.2010, 19:48 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 113
Статус: Offline
| Не, надо не заменить, а сделать новую, анимацию, как бы новый удар.
|
|
| |
Den_spb | Дата: Вторник, 06.07.2010, 01:59 | Сообщение # 7 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Насчёт этого не знаю - надо исследовать соответствующие функции в exe (ты тоже можешь учиться исследовать exe - для этого нужна база от listener и IDA 5). Можно и на SB спросить, не исключено что кто-то этот вопрос уже разбирал
|
|
| |
DK22Pac | Дата: Вторник, 06.07.2010, 17:08 | Сообщение # 8 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Можешь пожалуйста обьяснить как работать с адресами функций. Как я понял для их вызова надо использовать 00а7? Bот допустим есть 0x0043A0B6 C V e h i c l e : : C r e a t e C a r Можешь на этом примере обьяснить? Как передавать параметры. И что означает С в начале, например Сped, что такое смещение? Обьясни, пожалуйста, несложными словами, сам я в этом разобраться не могу.Добавлено (06.07.2010, 17:08) --------------------------------------------- Можешь пожалуйста обьяснить как работать с адресами функций. Как я понял для их вызова надо использовать 00а7? Bот допустим есть 0x0043A0B6 C V e h i c l e : : C r e a t e C a r Можешь на этом примере обьяснить? Как передавать параметры. И что означает С в начале, например Сped, что такое смещение? Обьясни, пожалуйста, несложными словами, сам я в этом разобраться не могу.
|
|
| |
Den_spb | Дата: Вторник, 06.07.2010, 17:55 | Сообщение # 9 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Да, для вызова функции нужно передать в опкод (0AA5-0AA8) адрес, с которого она начинается в exe. Quote (DK22Pac) 0x0043A0B6 О каком exe идёт речь? Я работаю только с базой для СА - там есть функция 0x0043A0B0 - _spawnCarAtPlayerLocation - она спаунит перед игроком транспортное средство определённой модели (применяется в читах, создающих транспорт. В клео4 есть спец. опкод, применяющий эту функцию). Когда какой опкод надо использовать - я ещё сам не совсем разобрался, сегодня задавал вопросы на SB: http://sannybuilder.com/forums/viewtopic.php?id=941 . Параметры, передаваемые в функцию, последовательно записываются в опкод вызова функции (см. СБ-справку, КЛЕО3-описания опкодов 0AA5-0AA8). Количество параметров зависит от конкретной функции. Примеры по вызову функций, которые я использовал в своих скриптах: 1.Проверка, является ли модель моделью автомобиляCode 0@ = 528 // ид модели 0AA7: call_function 0x4c5aa0 num_params 1 pop 1 0@ 1@ // isModelCar if 1@ == true then ... // что нужно делать если модель является моделью автомобиля 2.Спауним транспорт перед игрокомCode 0@ = 528 // ид модели транспорта 0AA5: call_function 0x43A0B0 num_params 1 pop 1 0@ // car spawn Quote (DK22Pac) И что означает С в начале По-моему это означает "класс". Что касается 3д-объектов, то здесь они все перечислены: http://sannybuilder.com/forums/viewtopic.php?pid=2356#p2356 Quote (DK22Pac) что такое смещение? Смещение - определённое число байтов, которое нужно прибавить к какому-то адресу (например, началу структуры чего-либо). Пример: определим, прицеплен ли к тягачу 0@ прицеп, если прицеплен то найдём хэндл прицепа:Code 0A97: 0@ = car 0@ struct // находим начало структуры тягача в памяти. Структура - блок данных о том или ином объекте 0@ += 0x4C8 // прибавляем смещение (смещения для структур транспорта: http://gtamodding.ru/wiki/Адреса_Памяти_(SA) , раздел Cars) 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 // читаем значение (начало структуры прицепа), записанное по данному смещению if 0@ > 0 // если значение ненулевое, то к тягачу что-то прицеплено then 0AEB: 1@ = car_struct 0@ handle // получаем хэндл транспорта с данным началом структуры ...
|
|
| |
DK22Pac | Дата: Вторник, 06.07.2010, 23:00 | Сообщение # 10 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Спасибо огромное, буду изучать... Quote О каком exe идёт речь? Брал это из адрессов VC Quote сегодня задавал вопросы на SB: Вот именно эти вопросы меня интересовали больше всего Вот например в некоторых написано кое-что в скобках... Code 0 0 7 3 5 F D 0 C B u l l e t I n f o : : I n i t i a l i s e ( ( v o i d ) ) Code 0 0 7 1 7 0 C 0 C R G B A : : C R G B A ( ( u c h a r , u c h a r , u c h a r , u c h a r ) ) Code 0 0 5 B 9 0 3 0 L o a d M a p D e f i n i t i o n F i l e ( c h a r ; f i l e N a m e ) ) И ещё такой вопрос - можно ли через память вычислить координаты точки пули, точнее коорд. её столкновения с чем-либо (я конечно догадываюсь как это реализовать и без лазания в память, с проверками коллизий (не пули а какбы псевдо-обьекта который движется по траектории пули, но думаю так не выйдет)), ты как думаешь, есть такой адресс? Quote последовательно записываются в опкод вызова функции Ну это я понял, с опкодом 0ab1 я разобрался
Сообщение отредактировал DK22Pac - Вторник, 06.07.2010, 23:32 |
|
| |
Den_spb | Дата: Среда, 07.07.2010, 04:41 | Сообщение # 11 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) И ещё такой вопрос - можно ли через память вычислить координаты точки пули, точнее коорд. её столкновения с чем-либо (я конечно догадываюсь как это реализовать и без лазания в память, с проверками коллизий (не пули а какбы псевдо-обьекта который движется по траектории пули, но думаю так не выйдет)), ты как думаешь, есть такой адресс? Это можно и стандартными опкодами определить (06BD). А что касается адреса, то думаю он есть, т.к. в этой точке создаётся партикл (искры).
|
|
| |
DK22Pac | Дата: Среда, 07.07.2010, 20:14 | Сообщение # 12 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Подскажи где скачать IDA или скажи откуда ты качал. Я в этом не разбираюсь, ещё что-то не то скачаю.
|
|
| |
Den_spb | Дата: Среда, 07.07.2010, 21:52 | Сообщение # 13 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Посмотри на cracklab.ru . Есть IDA и в других местах - несложно найти поисковиком. Для просмотра баз нужна версия не ниже 5.0
|
|
| |
DK22Pac | Дата: Воскресенье, 11.07.2010, 19:10 | Сообщение # 14 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Хм, я скачал ИДУ, но понятия не имею как выискывать адресс... Вот например Я конечно не прав но написал 0@ = 90.0 05E2: call_function 0046B100 num_params 1 pop 1 0@ Но игра вылетает Там ведь не всё так просто, да?
Сообщение отредактировал DK22Pac - Воскресенье, 11.07.2010, 19:13 |
|
| |
Den_spb | Дата: Воскресенье, 11.07.2010, 20:17 | Сообщение # 15 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Многие адреса и функции в базе проименованы - их можно искать по названию с помощью команды Search - Text (как поиск опкодов). Вкладка Functions - список всех функций exe. Предположим, если надо найти функции, имеющие отношение к поездам, то при активной вкладке Functions забиваем в поиск слово train. Вкладка IDA View-A показывает код в дизассемблированном виде (краткое руководство по ассемблеру тут: http://sannybuilder.com/forums/viewtopic.php?id=41 ). Надо сказать, что в exe 2 основных типа адресов - data и text. В адресах data хранятся различные значения, в адресах text записаны команды функций. Значения из адресов data можно читать или перезаписывать опкодами 0A8C / 0A8D (SA), для адресов text применяются те же опкоды, но необходимо снимать защиту памяти (параметр virtual protect ставить на 1) - таким образом можно скриптом изменить какие-то команды в данной функции, после чего эта функция будет работать по новому алгоритму. Как вызывать функцию в скрипте: 1. определить, является ли данная процедура функцией или методом - для вызова функций и методов в клео разные опкоды. 2. определить, сколько параметров передаётся в данную функцию - их надо будет прописать в опкод. Эти вопросы обсуждались тут: http://sannybuilder.com/forums/viewtopic.php?pid=11621#p11621 Рассмотрим на примере функции с твоего скрина. 1. Процедура является функцией, а не методом (признак метода - использование значение из регистра ECX, в который перед этим ничего не было записано). 2. В стэковом фрейме (структура переменных, описанная в начале функции) 2 переменные имеют положительное смещение от начала структуры (смещение переменной arg_0 равно 8, а смещение переменной arg_4 равно 0xC). Переменные, имеющие положительное смещение - это параметры, передаваемые в функцию (их надо будет указать и в опкоде). Ещё замечание: в IDA адреса функций записаны в 16-ричном формате, в коде скрипта к этому адресу следует приписать 0x (приставка, обозначающая 16-ричное число).
|
|
| |