Работа с памятью игры, exe
|
|
DK22Pac | Дата: Суббота, 29.01.2011, 18:53 | Сообщение # 136 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Пожалуйста, помоги разобраться в коде... Code .text:004EB1D8 movsx eax, word ptr [edi+5Ch] .text:004EB1DC mov ecx, ebx .text:004EB1DE push eax .text:004EB1DF call RefModelInfo__7CObjectFi ; CObject::RefModelInfo((int)) .text:004EB1E4 mov ecx, ebx // Здесь записывается структура для метода? (CEntity) .text:004EB1E6 push dword ptr [esp+0] // Здесь записывается указатель на параметр? (RwObject *) .text:004EB1E9 call AttachToRwObject__7CEntityFP8RwObject ; CEntity::AttachToRwObject((RwObject *))
|
|
| |
Den_spb | Дата: Суббота, 29.01.2011, 19:31 | Сообщение # 137 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) .text:004EB1E4 mov ecx, ebx // Здесь записывается структура для метода? С этим согласен. Quote (DK22Pac) .text:004EB1E6 push dword ptr [esp+0] Передаётся параметр, значение которого записано по адресу: значение, записанное в регистре esp + 0
|
|
| |
DK22Pac | Дата: Понедельник, 14.02.2011, 21:52 | Сообщение # 138 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Den_spb, ты знаешь что-то о том, как рисуются цветные прямоугольные фигуры на карте (территории банд)?
|
|
| |
Den_spb | Дата: Вторник, 15.02.2011, 00:10 | Сообщение # 139 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Не интересовался данной темой. Попробуй посмотреть устройство опкодов, имеющих отношение к этому вопросу ("gang") или можно осуществить поиск по базе (по словам "gang" или "radar", например).
|
|
| |
DK22Pac | Дата: Воскресенье, 20.02.2011, 17:01 | Сообщение # 140 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Можно ли через IDA узнать адресс CCamera? (gta3) Нужно для вызова методов. Вот метод Code ; CCamera::SetWideScreenOn((void)) SetWideScreenOn__7CCameraFv proc near mov byte ptr [ecx+70h], 1 retn SetWideScreenOn__7CCameraFv endp Также есть адресс Code 0x6FAD68 [byte] Widesscreen on/off Попробовал отнять от него 0x70, при вызове метода игра не летит, но и никаких изменений не видно.
|
|
| |
Den_spb | Дата: Воскресенье, 20.02.2011, 20:17 | Сообщение # 141 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Посмотри, что записывается в ecx в той процедуре, откуда данный метод вызывается.
|
|
| |
DK22Pac | Дата: Суббота, 05.03.2011, 17:04 | Сообщение # 142 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Den_spb, можешь пожалуйста перевести это в hex Code mov ecx, eax push ebx push offset sub_4D7490 call sub_401835 fld dword ptr [ebx+2DCh] fstp dword ptr [ebx+2E0h] pop ebx
|
|
| |
Den_spb | Дата: Суббота, 05.03.2011, 19:08 | Сообщение # 143 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| call -9 -> E8 F7FFFFFF Остальное в приложении.
|
|
| |
DK22Pac | Дата: Воскресенье, 06.03.2011, 10:24 | Сообщение # 144 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Den_spb, сипасибо. Если в теле функции присутсвуют команды pop - это признак метода?
|
|
| |
Den_spb | Дата: Воскресенье, 06.03.2011, 16:22 | Сообщение # 145 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Не думаю, что это является признаком метода. Команда pop просто снимает данные с вершины стека, записывая их в указанный регистр (команда push - наоборот, кладёт данные на стек). Повторю, что особенностью методов является то, что один из передаваемых параметров (указатель на структуру) записывается в регистр ecx. Поэтому, если в коде функции используется значение из ecx, но перед этим в данный регистр ничего не было записано, то эта функция, как правило, является методом.
|
|
| |
DK22Pac | Дата: Суббота, 19.03.2011, 01:38 | Сообщение # 146 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Привет, Денис. Почитал твои посты на СБФ. В общем. Молодец. Правда есть ещё один способ узнать коорды компонентов (метод getComponentWorldPosition - рабочий, я с его помощью узнавал позиции колёс). Хотел спросить Вот можно из структуры авто получить указатель на массив данных из handling.cfg Так вот это указатель на слот с хандлингом для опр. модели, или для опр.транспорта(сабж - имеет ли каждый уник. автомобиль свой handling? (Изменив который, мы не затронем другие автомобили с такой же моделью))
Сообщение отредактировал DK22Pac - Суббота, 19.03.2011, 01:39 |
|
| |
Den_spb | Дата: Суббота, 19.03.2011, 03:24 | Сообщение # 147 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) Привет, Денис. Почитал твои посты на СБФ. В общем. Молодец. Привет, Дмитрий. Моих заслуг в исследовании данной темы немного, но всё равно спасибо Quote (DK22Pac) метод getComponentWorldPosition - рабочий, я с его помощью узнавал позиции колёс Посмотрел этот метод: в его коде используется обсуждённый ранее алгоритм. Quote (DK22Pac) Так вот это указатель на слот с хандлингом для опр. модели, или для опр.транспорта Это указатель на handling-слот определённого номера (избегаю слово "модели", т.к. не всегда одна модель соответствует одному хандлингу), который является общим для всех соответствующих транспортных средств.
|
|
| |
DK22Pac | Дата: Вторник, 22.03.2011, 00:19 | Сообщение # 148 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Спасибо за разьяснения, Денис. А у тебя есть база listener'а для gta3.exe?
|
|
| |
Den_spb | Дата: Вторник, 22.03.2011, 01:16 | Сообщение # 149 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) А у тебя есть база listener'а для gta3.exe? Нет. Я работаю только с GTA SA, поэтому базы для других версий GTA не скачивал.
|
|
| |
DK22Pac | Дата: Пятница, 25.03.2011, 23:29 | Сообщение # 150 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| В общем, проблема такая: я уже очень долго ищу способ проигрывания анимации в gta3. Я уже находил в базе Листенера метод CPed_SetFall, там проигрыватется анима с заданным ИД, но в то же время, после проигрывания этой анимы пед падает на землю... Потом я нашёл метод CPed_SetJump. Он проигрывал анимацию и делал перемещение педа. Я немножко ознакомился с кодом этого метода. Вот его код: http://pastebin.com/5Pmebqi1 Я подумал, что можно будет как-то "вырезать" ту часть, где выполняется перемещение педа. Ну а также, поменять ИД анимации. Вот где передается этот параметр (ИД): Code .text:004D7458 push 94h В общем, я решил заранее сделать переход туда, где стоит return, выполнить аниму, и вернуть всё назад. Code {$CLEO .cs} wait 0 while true wait 0 if player.Defined(0) then if 05ee: 9 then 05E6: 0@ = actor $player_actor struct 05DF: write_memory 0x4D7468 size 1 value 0xEB virtual_protect 1 //jmp 05DF: write_memory 0x4D7469 size 1 value 0x10 virtual_protect 1 //+0x10 05DF: write_memory 0x4D7459 size 4 value 75 virtual_protect 1 //NewID call_method 0x4D73D0 0@ 0 0 //SetJump end end end Анима работает, но после возвращения стандартных комманд, не работает сам прыжок (по нажатию кл. Shift). "Возвращение" я, думаю, делал правильно, как-то так: 05DF: write_memory 0x4D7459 size 4 value 0x94 virtual_protect 1 //StandartID 05DF: write_memory 0x4D7468 size 2 value 0xXX virtual_protect 1 //mov ecx, eax ; где-то не могу найти как это будет в hex, но тогда я эту команду нашёл через OllyDBG Да и ещё, если после такого "возвращения" вызвать метод SetJump - то пед прыгнет, и опять можно будет прыгать по нажатию Shift. Идеалом, конечно, было бы разобраться, что за функция BlendAnimation (думаю, это она проигрывает аниму...)
Сообщение отредактировал DK22Pac - Пятница, 25.03.2011, 23:36 |
|
| |