Перейти к содержанию

GTA 3, вызов процедуры


Рекомендуемые сообщения

Нашел функцию вызова кода на оружия в игре.


00490E4F - 00 B9 D8169400 - add [ecx+009416D8],bh
//вывод сообщения
00490E55 - 6A 01 - push 01
00490E57 - 68 98625F00 - push 005F6298 : ["CHEAT2"]
00490E5C - E8 7FB90900 - call 0052C7E0
00490E61 - 50 - push eax
00490E62 - E8 59440700 - call 005052C0
00490E67 - 59 - pop ecx
00490E68 - 59 - pop ecx
//конец вывода сообщения
00490E69 - 6A 00 - push 00 //количество патронов
00490E6B - 6A 01 - push 01 //ID оружия
00490E6D - E8 CE030100 - call 004A1240 //вызов процедуры
00490E72 - 89 C1 - mov ecx,eax //заносит в есх указатель на структуру игрока
00490E74 - E8 D7EB0300 - call 004CFA50 //вызов процедуры
00490E79 - 6A 64 - push 64
00490E7B - 6A 02 - push 02
00490E7D - E8 BE030100 - call 004A1240
00490E82 - 89 C1 - mov ecx,eax
00490E84 - E8 C7EB0300 - call 004CFA50
00490E89 - 6A 64 - push 64
00490E8B - 6A 03 - push 03
00490E8D - E8 AE030100 - call 004A1240
00490E92 - 89 C1 - mov ecx,eax
00490E94 - E8 B7EB0300 - call 004CFA50
00490E99 - 6A 14 - push 14
00490E9B - 6A 04 - push 04
00490E9D - E8 9E030100 - call 004A1240
00490EA2 - 89 C1 - mov ecx,eax
00490EA4 - E8 A7EB0300 - call 004CFA50
00490EA9 - 68 C8000000 - push 000000C8
00490EAE - 6A 05 - push 05
00490EB0 - E8 8B030100 - call 004A1240
00490EB5 - 89 C1 - mov ecx,eax
00490EB7 - E8 94EB0300 - call 004CFA50
00490EBC - 68 C8000000 - push 000000C8
00490EC1 - 6A 06 - push 06
00490EC3 - E8 78030100 - call 004A1240
00490EC8 - 89 C1 - mov ecx,eax
00490ECA - E8 81EB0300 - call 004CFA50
00490ECF - 6A 05 - push 05
00490ED1 - 6A 07 - push 07
00490ED3 - E8 68030100 - call 004A1240
00490ED8 - 89 C1 - mov ecx,eax
00490EDA - E8 71EB0300 - call 004CFA50
00490EDF - 6A 05 - push 05
00490EE1 - 6A 08 - push 08
00490EE3 - E8 58030100 - call 004A1240
00490EE8 - 89 C1 - mov ecx,eax
00490EEA - E8 61EB0300 - call 004CFA50
00490EEF - 6A 05 - push 05
00490EF1 - 6A 0A - push 0A
00490EF3 - E8 48030100 - call 004A1240
00490EF8 - 89 C1 - mov ecx,eax
00490EFA - E8 51EB0300 - call 004CFA50
00490EFF - 6A 05 - push 05
00490F01 - 6A 0B - push 0B
00490F03 - E8 38030100 - call 004A1240
00490F08 - 89 C1 - mov ecx,eax
00490F0A - E8 41EB0300 - call 004CFA50
00490F0F - 68 C8000000 - push 000000C8
00490F14 - 6A 09 - push 09
00490F16 - E8 25030100 - call 004A1240
00490F1B - 89 C1 - mov ecx,eax
00490F1D - E8 2EEB0300 - call 004CFA50
00490F22 - C3 - ret

пробовал сделать так:

[ENABLE]
alloc(newmem,1024)
createthread(newmem)

newmem:

push 64
push 02
call 004A1240
mov ecx,0CCBFA28
call 004CFA50
ret

[DISABLE]
dealloc(newmem)

но при активации игра вылетела, как правильно вызвать данную процедуру?

Ссылка на комментарий
Поделиться на другие сайты

Попробуй так:


[ENABLE]
alloc(newmem,1024)

newmem:
push 64
push 02
call 004A1240 // отсюда мы получаем eax по параметрам 0x64 и 0x02
mov ecx,eax
call 004CFA50
ret

createthread(newmem)

[DISABLE]
dealloc(newmem)

Если что-то не получается, то смотри другие регистры и стек. Если не понял в чём прчина, то придётся тебе пробежаться по этим коллам, посмотреть в них глобальные переменные, т.к. вполне возможно от них что-то зависит. Вообще, всё надо проверять в отладчике при срабатывании исключения. Скорее всего ты сразу поёмёшь на каком участке был "сбой"... 

Ссылка на комментарий
Поделиться на другие сайты

Работает! Спасибо :)

А не можете ли вы еще подсказать как вывести сообщение?

[ENABLE]
alloc(newmem,1024)

newmem:
push 01
push 005F6298
call 0052C7E0
push eax
call 005052C0
pop ecx
pop ecx
ret

createthread(newmem)
[DISABLE]
dealloc(newmem)

Просто так игра вылетает.

Ссылка на комментарий
Поделиться на другие сайты

Очень сложно дать точный ответ. Возможно, сместился стек и на 100% как именно он сместился непонятно.

Возможно, нужно сделать так


[ENABLE]
alloc(newmem,1024)
label(exitThread)

newmem:
mov eax,[esp]
mov [exitThread],eax

push 01
push 005F6298
call 0052C7E0
push eax
call 005052C0

mov eax,[exitThread]
push eax
ret

exitThread:
dd 0

createthread(newmem)

[DISABLE]
dealloc(newmem)

Ссылка на комментарий
Поделиться на другие сайты

Не, не работает вывод на экран таким способом :(

Вот нашел чит на погоду:


mov ecx,009416D8
push 01
push 005F62F4
call 0052C7E0
push eax
call 005052C0
pop ecx
pop ecx
push 00
call 005233C0
pop ecx
ret

Сделал скрипт, но игра вылетает

[ENABLE]
alloc(newmem,1024)

newmem:
push 00
call 005233C0
ret

createthread(newmem)
[DISABLE]
dealloc(newmem)

Я нашел функцию розыска, и у меня вышло её использовать :)


mov eax,6 //Заносим количество звезд
push eax //Заносим в стек
call 004A1240 //Получаем указатель на структуру игрока
mov ecx,eax //Устанавливаем параметр (?)
call 004F3240 //Установка звезд
ret

Где можно почитать туториалы про использование функций?

Ссылка на комментарий
Поделиться на другие сайты

>> Сделал скрипт, но игра вылетает

В данной ситуации подсказать ничего не могу.

>> Где можно почитать туториалы про использование функций?

Если такие туториалы и есть, то они настолько сложны человеку который не пишет программы на C++ и не отлаживает их в отладке. Так что я думаю, даже браться не стоит. Есть какие-то документы на официальных источниках о соглашениях по передачи аргументов в функцию. Там тебе подробно опишут что происходит с esp, ebp, как они меняются, что происходит в стеке когда работает call. Но об этом лучше не читать, а видеть в пашаговой отладке твоей собственной программы.

Самый простой вариант и совет как прокачать свои скилы в области вызовов игровых функций. Это скомпилировать прожку консольную с функцией в которую передаются параметры. Возьмёшь отладчик и исследуешь её. И с Cheat Engine потренируешься с созданием CreateThread. Ещё бывают "вкусные" функции импотрируемые из dll-ок. Там по проще будет. Также найди и установи IDA с декомпилятором IDA Hex Rays. Декомпилятор возможно правильно будет определять агрументы функций... Короче тебе надо много практики чтобы понять что и как.

Ссылка на комментарий
Поделиться на другие сайты

Разобрался с сообщением и погодой! :)

С погодой проблема была в том что в конце не было:

pop ecx

Результат такой:

[ENABLE]
alloc(newmem,1024)

newmem:
push 00
call 005233C0
pop ecx
ret

createthread(newmem)
[DISABLE]
dealloc(newmem)

Ссылка на комментарий
Поделиться на другие сайты

Можете подсказать как сделать процедуру в CheatEngine, и возможно ли.

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

mov eax,0

push eax

call 004A1240

mov ecx,eax

call 004F3240

ret

Как я могу вызывать сделать из этого процедуру как:

procedure setstar(player,star:integer);

begin

mov eax,star

push eax

call 004A1240

mov ecx,player

call 004F3240

ret

end;

и потом вызывать?

Хороший вариант использовать Lua Engine. Нужно поменять Player, названия игры, проверить ошибки...

-- Подгодтовка памяти под читы
autoAssemble([[
alloc(cheatMem, 1024)
registersymbol(cheatMem)]])


-- Функция установки звёзд запускаемая из Lua
function SetStar(player, star)

AACodeTemplate = [[
cheatMem:
mov eax, star
push eax
call 004A1240
mov ecx, player
call 004F3240
ret

createthread(cheatMem)
]]

AACodeTemplate = string.gsub(AACodeTemplate,"player", AACodeTemplate)
AACodeTemplate = string.gsub(AACodeTemplate,"star", AACodeTemplate)


print('Будет выполен блок AA кода ' .. AACodeTemplate)
autoAssemble(AACodeTemplate)
end


-- Базовый блок работы с процессом из статьи с главного сайта

processName = "game.exe"

function OnCheckHotkeys()

if isKeyPressed(VK_K) then
print("Установить 4 зведы")
player = '000000000'
star = '6'
SetStar(player, star)
return
end

if isKeyPressed(VK_L) then
— сделать какое-то действие
print(«Hot-key L»)
return
end

end

function onCloseClick(sender)
closeCE()
return caFree
end

trainerForm = createForm()
form_onClose(trainerForm, onCloseClick)

autoAttachList = getAutoAttachList()
stringlist_add(autoAttachList,processName);

function onOpenProcess(processid)
print("Найден процесс игры. Запускаю проверку горячих клавиш")
hotKeyTimer = createTimer(trainerForm)
timer_setInterval(hotKeyTimer, 100)
timer_onTimer(hotKeyTimer, OnCheckHotkeys)
end

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.