Работа с памятью игры, exe
|
|
walk | Дата: Пятница, 08.07.2011, 01:29 | Сообщение # 226 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| DK22Pac, может есть способ перехватить координаты создаваемой сферы? У меня идеи есть, но как реализовать не особо понимаю
Может мне нужно сделать тоже самое, только с использованием:
Code for 0@ = <адресс первой структуры в массиве> to <адресс последней структуры в массиве> step <размер одной структуры> ?
|
|
| |
DK22Pac | Дата: Пятница, 08.07.2011, 03:15 | Сообщение # 227 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Да, можно так сделать.
|
|
| |
walk | Дата: Пятница, 08.07.2011, 05:49 | Сообщение # 228 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| DK22Pac, вобщем попытался и опять те же грабли
Code 03BC: 8@ = create_sphere_at 2277.9211 -1255.8954 23.9886 radius 1.0 03BC: 9@ = create_sphere_at 2279.0 -1258.0 23.9886 radius 1.0
:Noname_2 wait 0 for 0@ = 0xA91268 to 0xA912F8 step 0x18
0@ += 0x8 0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0 0@ += 0x4 0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0 0@ += 0x4 0A8D: 3@ = read_memory 0@ size 4 virtual_protect 0 064B: 4@ = create_particle "smoke_flare" at 1@ 2@ 3@ type 1 064C: make_particle 4@ visible
:Noname_127 jump @Noname_2
Но если в коде поставить 0@ += 0x18 , то эффект создаётся у второй сферы, а первая остаётся пустой, но если всё зациклить, то эффекта никакого
|
|
| |
ILYALION | Дата: Пятница, 08.07.2011, 07:12 | Сообщение # 229 |
Группа: Проверенные
Сообщений: 325
Статус: Offline
| walk, спасибо, но можноли сделать так, чтобы эффект выходил вертикально вверх и был на всех авто с id 410-в траффике, просто стоящих на стоянке? А также включался без нажатия кнопки, и не выключался совсем. Просто у меня на этом id установлена печка, а автор сделал выхлопную трубу как раз из трубы печи. Обычный дым из выхлопной трубы как-то мало похож на настоящий дым из печи, вот я и подумал об этой идее.
|
|
| |
DK22Pac | Дата: Пятница, 08.07.2011, 09:08 | Сообщение # 230 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Переменная 0@ здесь выступает в роли счётчика. В конце в цикле надо добавить
|
|
| |
walk | Дата: Пятница, 08.07.2011, 09:55 | Сообщение # 231 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| DK22Pac, не мог бы ты у себя в игре мой код проверить и сказать в чём ошибка, почему эффект создаётся, либо у второй, либо у первой сферы, а не у всех игровых, как мне нужно.
Добавлено (08.07.2011, 09:55) --------------------------------------------- ILYALION,
Code while true thread 'test' wait 0 if player.Defined(0) then 0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to 5@ if 0@ > -1 then if car.Id(0@) == 410 then 0AB1: call_scm_func @GetExhaustPipeOffset 1 car 0@ 1@ 2@ 3@ 066C: 0@ = attach_particle "flamethrower" to_car 0@ with_offset 1@ 2@ 3@ rotation 0.0 -90.0 0.0 flag 1 064C: make_particle 0@ visible end end end end
:GetExhaustPipeOffset 0A97: 0@ = car 0@ struct 0@ += 0x22 0A8D: 0@ = read_memory 0@ size 2 virtual_protect 0 //model index 0@ *= 4 0@ += 0xA9B0C8 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 //CModel 0@ += 0x5C 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 //vehicle struct 0@ += 0x48 0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0 //x 0@ += 4 0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0 //y 0@ += 4 0A8D: 3@ = read_memory 0@ size 4 virtual_protect 0 //z 0AB2: ret 3 1@ 2@ 3@
Держи. Накидал от руки, в игре сам проверь. По поводу выхода вертикально вверх, отвечает команда:
Code 066C: 0@ = attach_particle "flamethrower" to_car 0@ with_offset 1@ 2@ 3@ rotation 0.0 -90.0 0.0 flag 1
Думаю логично в место -90.0, поставить 0.0. Ещё хорошо было бы узнать флаг уникальности у машин, у DK22Pac. И чтоб каждый раз не ставить одной и той же машину партикл, менять флаг уникальности, а потом просто проверять его у машины. Ну как DK22Pac его напишет, я тебе его вставлю в скрипт
Сообщение отредактировал walk - Пятница, 08.07.2011, 09:56 |
|
| |
ILYALION | Дата: Пятница, 08.07.2011, 15:49 | Сообщение # 232 |
Группа: Проверенные
Сообщений: 325
Статус: Offline
| Спасибо, а можно ли как-то убрать стандартный выхлоп из выхлопной трубы, а то он идёт горизонтально
|
|
| |
walk | Дата: Пятница, 08.07.2011, 16:02 | Сообщение # 233 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| ILYALION, вот по поводу этого не знаю, находится это скорей всего, в структуре машин, но это всё надо искать
|
|
| |
DK22Pac | Дата: Суббота, 09.07.2011, 00:04 | Сообщение # 234 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| walk, код проверить не могу, так как захожу и пишу с телефона. Я сейчас в отпуске. Пробуй. Code {CLEO .cs} 0000: while true for 0@ = 0xA91268 to 0xA912F8 step 0x18 0085: 1@ = 0@ inc(1@ , 4) for 5@ = 0 to 2 inc(1@, 4) 0A8D: 2@(5@,3f) = read_memory 1@ size 4 virtual_protect 0 end 064B: 5@ = create_particle "smoke_flare" at 2@ 3@ 4@ type 1 064C: make_particle 5@ visible_and_remove_references end 003D: end Где адресса взял? Насчёт уникальности - можно записывать значение в структуру, или создавать свой буффер, где будет храниться адресса струкур и флаги.
|
|
| |
walk | Дата: Суббота, 09.07.2011, 06:14 | Сообщение # 235 |
Группа: Проверенные
Сообщений: 96
Статус: Offline
| DK22Pac, адреса сам искал, по примеру скрипта, который приводил выше Добавлено (09.07.2011, 06:14) ---------------------------------------------
Code for 0@ = 9@ {0x945D5E} to 10@ {0x94A13C} step 0x34 05E0: 1@ = read_memory 0@ size 1 virtual_protect 0 if or 0039: 1@ == 8 //money //0039: 1@ == 15 //scm 0039: 1@ == 4 //ped pickups then
DK22Pac, почему он таким способом получает, способ создания пикапа? Ведь первой в структуре идёт позиция пикапа.
|
|
| |
DK22Pac | Дата: Суббота, 09.07.2011, 11:10 | Сообщение # 236 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| walk, он начинает перебор структур не со старта массива, а с того места, где находится значение pickupType в первой структуре. Получается так: for 0@ = <адресс первой структуры + оффсет к pickupType> to <адресс последней структуры + оффсет к pickupType> step <размер одной структуры>Добавлено (09.07.2011, 11:10) --------------------------------------------- walk, http://bitfry.narod.ru/ http://wasm.ru/article.php?article=1022001
|
|
| |
[ED]Andr | Дата: Четверг, 14.07.2011, 10:55 | Сообщение # 237 |
Группа: Пользователи
Сообщений: 12
Статус: Offline
| Я недавно начал работать с адресами памяти, а на гтамоддинг их маловато, объясните как их искать с помощью IDA.Я открывал там .exe у гта, но ничего похожего, что описывалось тут на первых страницах, не находил.
|
|
| |
Den_spb | Дата: Пятница, 15.07.2011, 01:28 | Сообщение # 238 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| [ED]Andr, в IDA надо открывать idb-базу gta_sa.exe от listener (брать на public.sannybuilder.com, желательно более свежую версию - смотри по дате)
|
|
| |
DK22Pac | Дата: Суббота, 16.07.2011, 23:27 | Сообщение # 239 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Я расскажу на простом примере. Однажды мне понадобилось найти константу - дистанцию от земли к пикапу денег. Мне надо было изменить эту константу, так, чтобы пикап был расположен прямо над землёй. Итак, после запуска IDA я открыл базу адрессов gta_sa.exe от listener'а. Слева находится список функций, справа - сам код .exe. При двойном щелчке на какой-то функции в колонке слева, её код откроется в окошке справа. Для сортировки функци "по алфавиу" достаточно нажать на "Function Name". Нам надо найти какую-то процедуру, которая связана с созданием пикапа. Ведь именно в этот момент определяется, где он будет располагаться. Воспользуемся поиском... Ставим курсор на самую первую функцию в списке и нажимаем Alt+T. вводим что-то из вариантов: pickup, create. Я ввёл pickup. Чтобы выполнить функцию "искать далее" по этому списку функций, надо нажать Ctrl+T. Вот какую функцию я нашёл: Code _createDeadPedMoneyPickup То, что надо! Два щелчка по ней - и смотрим в окошко справа. И теперь всё как на ладони... Теперь мы можем увидеть тут, как выбираются случайные X и Y координаты в нужном радиусе: , как находится нужная Z-координата: , Как происходит вызов функции, которая создаёт сам пикап как обьект (субьект игры): Нас интересует - координата Z для пикапа. За "определение" Z-координаты отвечает этот участок в коде функции: Code 024 push esi 028 push edi 02C call CWorld__findGroundZFor3DCoord 02C fadd ds:flt_858B8C ; 0.5f Ведь CWorld__findGroundZFor3DCoord - это процедура, которая находит Z-координату поверхности в точке (X;Y). Итак, мы видим две команды push - они передают функции два параметра - координаты Y и X. Далее вызывается процедура (опкод call). А далее идёт команда fadd - она добавляет к значению* число, которое записано по адрессу 0x858B8C. 0.5 - это и есть то значение, "из-за которого" пикап "висит" в воздухе. Мы можем напрямую изменить это значение: Code {$CLEO} 0A8C: write_memory 0x858B8C size 4 value 0.1 virtual_protect 0 0A93: А можем подменить адресс, значение которого "читает" опкод fadd. Для удобства надо перейти в режим "Text view". Клацаем ПКМ по окну справа и выбираем "Text view". Теперь мы видим глобальные адресса каждой из команд: Code .text:00458A17 02C fadd ds:flt_858B8C ; 0.5f Итак, нужная нам команда находится по адрессу 0x458A17. Сама команда занимает в памяти 6 байт. Мы можем в этом так убедиться: ставим курсор перед fadd, и переходим на вкладку "Hex-view". Мы увидим выделенные 6 байт. Первые 2 байта - это опкод, остальные 4 - адресс. Значит, надо добавить к (0x458A17) (2) и по полученному адрессу записать новое значение (новый адресс, который "читает" опкод fadd). Code 0x458A17 + 2 = 0x458A19 Code {$CLEO} 0@ = 0.1 0AC7: 1@ = var 0@ offset // получаем адресс переменной 0@ в памяти 0A8C: write_memory 0x458A19 size 4 value 1@ virtual_protect 0 0A93: Фуух, надеюсь это кому-то пригодится
Добавлено (16.07.2011, 23:27) --------------------------------------------- * есть отдельный стек, для хранения float-чисел - FPU Stack. Процедура CWorld__findGroundZFor3DCoord возвращает значение на вершину этого стека. Команда fadd добавляет значение к значению на вершине FPU Stack'а.
Сообщение отредактировал DK22Pac - Воскресенье, 17.07.2011, 16:19 |
|
| |
Den_spb | Дата: Воскресенье, 17.07.2011, 15:12 | Сообщение # 240 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Хороший пример. Добавлю, что список функций отображается на вкладке Functions, а код exe - на вкладке IDA View-A. P.S.В функцию вычисления высоты земли вроде передаются 3 параметра: X, Y, Z P.P.S.В последнем коде наверное должно быть "value 1@"
|
|
| |