Гость KoBRaAndrey Опубликовано 1 февраля, 2012 Поделиться Опубликовано 1 февраля, 2012 Нашел функцию вызова кода на оружия в игре.00490E4F - 00 B9 D8169400 - add [ecx+009416D8],bh //вывод сообщения00490E55 - 6A 01 - push 0100490E57 - 68 98625F00 - push 005F6298 : ["CHEAT2"]00490E5C - E8 7FB90900 - call 0052C7E000490E61 - 50 - push eax00490E62 - E8 59440700 - call 005052C000490E67 - 59 - pop ecx00490E68 - 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 6400490E7B - 6A 02 - push 0200490E7D - E8 BE030100 - call 004A124000490E82 - 89 C1 - mov ecx,eax00490E84 - E8 C7EB0300 - call 004CFA5000490E89 - 6A 64 - push 6400490E8B - 6A 03 - push 0300490E8D - E8 AE030100 - call 004A124000490E92 - 89 C1 - mov ecx,eax00490E94 - E8 B7EB0300 - call 004CFA5000490E99 - 6A 14 - push 1400490E9B - 6A 04 - push 0400490E9D - E8 9E030100 - call 004A124000490EA2 - 89 C1 - mov ecx,eax00490EA4 - E8 A7EB0300 - call 004CFA5000490EA9 - 68 C8000000 - push 000000C800490EAE - 6A 05 - push 0500490EB0 - E8 8B030100 - call 004A124000490EB5 - 89 C1 - mov ecx,eax00490EB7 - E8 94EB0300 - call 004CFA5000490EBC - 68 C8000000 - push 000000C800490EC1 - 6A 06 - push 0600490EC3 - E8 78030100 - call 004A124000490EC8 - 89 C1 - mov ecx,eax00490ECA - E8 81EB0300 - call 004CFA5000490ECF - 6A 05 - push 0500490ED1 - 6A 07 - push 0700490ED3 - E8 68030100 - call 004A124000490ED8 - 89 C1 - mov ecx,eax00490EDA - E8 71EB0300 - call 004CFA5000490EDF - 6A 05 - push 0500490EE1 - 6A 08 - push 0800490EE3 - E8 58030100 - call 004A124000490EE8 - 89 C1 - mov ecx,eax00490EEA - E8 61EB0300 - call 004CFA5000490EEF - 6A 05 - push 0500490EF1 - 6A 0A - push 0A00490EF3 - E8 48030100 - call 004A124000490EF8 - 89 C1 - mov ecx,eax00490EFA - E8 51EB0300 - call 004CFA5000490EFF - 6A 05 - push 0500490F01 - 6A 0B - push 0B00490F03 - E8 38030100 - call 004A124000490F08 - 89 C1 - mov ecx,eax00490F0A - E8 41EB0300 - call 004CFA5000490F0F - 68 C8000000 - push 000000C800490F14 - 6A 09 - push 0900490F16 - E8 25030100 - call 004A124000490F1B - 89 C1 - mov ecx,eax00490F1D - E8 2EEB0300 - call 004CFA5000490F22 - C3 - ret пробовал сделать так:[ENABLE]alloc(newmem,1024)createthread(newmem)newmem:push 64push 02call 004A1240mov ecx,0CCBFA28call 004CFA50ret[DISABLE]dealloc(newmem)но при активации игра вылетела, как правильно вызвать данную процедуру? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 2 февраля, 2012 Поделиться Опубликовано 2 февраля, 2012 Попробуй так:[ENABLE]alloc(newmem,1024)newmem: push 64 push 02 call 004A1240 // отсюда мы получаем eax по параметрам 0x64 и 0x02 mov ecx,eax call 004CFA50 retcreatethread(newmem)[DISABLE]dealloc(newmem)Если что-то не получается, то смотри другие регистры и стек. Если не понял в чём прчина, то придётся тебе пробежаться по этим коллам, посмотреть в них глобальные переменные, т.к. вполне возможно от них что-то зависит. Вообще, всё надо проверять в отладчике при срабатывании исключения. Скорее всего ты сразу поёмёшь на каком участке был "сбой"... Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость KoBRaAndrey Опубликовано 2 февраля, 2012 Поделиться Опубликовано 2 февраля, 2012 Работает! Спасибо А не можете ли вы еще подсказать как вывести сообщение?[ENABLE]alloc(newmem,1024)newmem: push 01 push 005F6298 call 0052C7E0 push eax call 005052C0 pop ecx pop ecx retcreatethread(newmem)[DISABLE]dealloc(newmem)Просто так игра вылетает. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 2 февраля, 2012 Поделиться Опубликовано 2 февраля, 2012 Очень сложно дать точный ответ. Возможно, сместился стек и на 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 retexitThread:dd 0createthread(newmem)[DISABLE]dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость KoBRaAndrey Опубликовано 2 февраля, 2012 Поделиться Опубликовано 2 февраля, 2012 Не, не работает вывод на экран таким способом Вот нашел чит на погоду:mov ecx,009416D8push 01push 005F62F4call 0052C7E0push eaxcall 005052C0pop ecxpop ecxpush 00call 005233C0pop ecxret Сделал скрипт, но игра вылетает[ENABLE]alloc(newmem,1024)newmem: push 00 call 005233C0 retcreatethread(newmem)[DISABLE]dealloc(newmem)Я нашел функцию розыска, и у меня вышло её использовать mov eax,6 //Заносим количество звездpush eax //Заносим в стекcall 004A1240 //Получаем указатель на структуру игрокаmov ecx,eax //Устанавливаем параметр (?)call 004F3240 //Установка звездretГде можно почитать туториалы про использование функций? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 2 февраля, 2012 Поделиться Опубликовано 2 февраля, 2012 >> Сделал скрипт, но игра вылетаетВ данной ситуации подсказать ничего не могу. >> Где можно почитать туториалы про использование функций?Если такие туториалы и есть, то они настолько сложны человеку который не пишет программы на C++ и не отлаживает их в отладке. Так что я думаю, даже браться не стоит. Есть какие-то документы на официальных источниках о соглашениях по передачи аргументов в функцию. Там тебе подробно опишут что происходит с esp, ebp, как они меняются, что происходит в стеке когда работает call. Но об этом лучше не читать, а видеть в пашаговой отладке твоей собственной программы.Самый простой вариант и совет как прокачать свои скилы в области вызовов игровых функций. Это скомпилировать прожку консольную с функцией в которую передаются параметры. Возьмёшь отладчик и исследуешь её. И с Cheat Engine потренируешься с созданием CreateThread. Ещё бывают "вкусные" функции импотрируемые из dll-ок. Там по проще будет. Также найди и установи IDA с декомпилятором IDA Hex Rays. Декомпилятор возможно правильно будет определять агрументы функций... Короче тебе надо много практики чтобы понять что и как. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость KoBRaAndrey Опубликовано 2 февраля, 2012 Поделиться Опубликовано 2 февраля, 2012 Разобрался с сообщением и погодой! С погодой проблема была в том что в конце не было:pop ecxРезультат такой:[ENABLE]alloc(newmem,1024)newmem: push 00 call 005233C0 pop ecxretcreatethread(newmem)[DISABLE]dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 3 февраля, 2012 Поделиться Опубликовано 3 февраля, 2012 Можете подсказать как сделать процедуру в 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 retend;и потом вызывать?Хороший вариант использовать Lua Engine. Нужно поменять Player, названия игры, проверить ошибки...-- Подгодтовка памяти под читыautoAssemble([[alloc(cheatMem, 1024)registersymbol(cheatMem)]])-- Функция установки звёзд запускаемая из Luafunction SetStar(player, star) AACodeTemplate = [[cheatMem: mov eax, star push eax call 004A1240 mov ecx, player call 004F3240 retcreatethread(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 endendfunction onCloseClick(sender) closeCE() return caFreeendtrainerForm = 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения