keng Опубликовано 14 марта, 2012 Поделиться Опубликовано 14 марта, 2012 В который раз подивившись размерам простыни, что я награфоманил вот в [этой] теме, я засел за код и в результате (после пары пакетов молока, конечно же) родился малюсенький трейнми, который учит работать со структурами. Он простой донельзя, но одна заковырочка там всё-таки есть. Вот скриншот:Жмём кнопку "Hit P1" - ранят первого игрока, жмём "Hit P2" - ранят второго. Задача - сделать одного из игроков иммунными к сей заразе.Качаем: keng_trnme.zip 3 Ссылка на комментарий Поделиться на другие сайты Поделиться
SER[G]ANT Опубликовано 14 марта, 2012 Поделиться Опубликовано 14 марта, 2012 Хотел отправить в личку, но ругается, что больше не можете получать сообщения, поэтому сюдаРешение:Ищем значение здоровья любого из игрока (тип - строка)Адрес со здоровьем игрока1 - 004010a9Адрес со здоровьем игрока2 - 004010b5Т.к. оба адреса статические, то можно их просто замораживать, но это не интересно (эти адреса так же можно использовать в скрипте, для различения игрока1 и игрока2).При уменьшении здоровья обоих игроков всплывает одна инструкция - mov [edi+04],ebx. Смотрим чуток выше и видим dec ebx, ее то мы и будем использовать.Открываем структурный паук (Structure Spider) и сравниваем 2 адреса: 004010B1 и 004010A5 (структуры игрока1 и игрока2)Видим, что в самом начале (смещение0) расположены id игроков, как это ни странно, но id игрока1=1, а игрока2=2Пишем скрипт, который будет предотвращять уменьшение жизней у одного из игроков//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048) //2kb should be enoughlabel(returnhere)label(originalcode)label(exit)label(Pid)registersymbol(Pid)newmem: //this is allocated memory, you have read,write,execute access//place your code here push eax mov eax,[Pid] cmp [edi],eax je short exitoriginalcode: dec ebxexit: mov [keng_trnme.exe+10C5],ebx pop eax jmp returnherePid: dd 0"keng_trnme.exe"+217A: jmp newmem nop nop returnhere:[DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(newmem)ubregistersymbol(Pid)"keng_trnme.exe"+217A: dec ebx mov [keng_trnme.exe+10C5],ebx//Alt: db 4B 89 1D C5 10 40 00[ENABLE]Если нужно, чтобы жизни не уменьшались у игрок1, то задаем адресу "Pid" значение 1 или 2, чтобы жизни не уменьшались у игрок2Можно пойти и другим путем - через кнопки (не будет происходить события нажатия)Все в тех же структурах игрока по смещению 08 находятся id кнопок, уменьшающих жизни игроков.id "Hit P1" = 101id "Hit P2" = 102делаем практически такой же скрипт, что и выше, но только дляkeng_trnme.exe+2189 - FF 77 08 - push [edi+08]//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048) //2kb should be enoughlabel(returnhere)label(originalcode)label(exit)label(Bid)registersymbol(Bid)newmem: //this is allocated memory, you have read,write,execute access//place your code here push eax mov eax,[Bid] cmp [edi+8],eax je short exitoriginalcode: push [edi+08]exit: push [keng_trnme.exe+10BD] pop eax jmp returnhereBid: dd 0"keng_trnme.exe"+2189: jmp newmem nop nop nop nopreturnhere:[DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(newmem)unregistersymbol(Bid)"keng_trnme.exe"+2189: push [edi+08] push [keng_trnme.exe+10BD]//Alt: db FF 77 08 FF 35 BD 10 40 00[ENABLE]Меняем значение адреса "Bid" на 101 или 102, в зависимости от нужного результата 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 14 марта, 2012 Автор Поделиться Опубликовано 14 марта, 2012 Мой вариант:[ENABLE]alloc(newmem,22)label(returnhere)newmem:PUSH EAXMOV EAX,[EDI]CMP EAX,1POP EAXJNE +3MOV [EDI+04],EBXPUSH 004010C5JMP returnhere00402181:jmp newmemnopnopnopreturnhere:[DISABLE]00402181:mov [edi+04],ebxpush 004010C5dealloc(newmem) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
SER[G]ANT Опубликовано 14 марта, 2012 Поделиться Опубликовано 14 марта, 2012 Мой вариант:Только после (де)активации скрипта нужно нажимать кнопку 2 раза для вступления изменений в силу, что не очень красиво.Жду продолжений ваших трейнми (если есть такие планы), только что-нибудь сложней. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 14 марта, 2012 Автор Поделиться Опубликовано 14 марта, 2012 ANT' date='14 Март 2012 - 17:25' timestamp='1331731504' post='7354']Только после (де)активации скрипта нужно нажимать кнопку 2 раза для вступления изменений в силу, что не очень красиво.Жду продолжений ваших трейнми (если есть такие планы), только что-нибудь сложней.Попробую что-нибудь придумать, но я никогда их не писал - это был первый. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 14 марта, 2012 Поделиться Опубликовано 14 марта, 2012 ANT' date='14 Март 2012 - 20:25' timestamp='1331731504' post='7354']Только после (де)активации скрипта нужно нажимать кнопку 2 раза для вступления изменений в силу, что не очень красиво.Жду продолжений ваших трейнми (если есть такие планы), только что-нибудь сложней.Сложность тут всё-таки это не главная цель. Очевидно, что цель была показать наглядный пример как сделать бессмертие только для своего игрока и как это сделать скриптами на Cheat Engine. Хорошо, что этот пример и прост, и одновременно чем-то хорошо похож на то, что может встретиться в играх. Сделать другой такой трейнерми чтобы он был и сложнее и похож на существующие проблемы в многих играх будет сложно. Было дело я видел трейнми настолько закрученные, что это превращалось в экзотику, которую в играх я не видел даже. Это называется угробить своё время на создание трейнми решение которого используется очень редко. Могут быть, правда, маньяки, которые любят полазить в отладке и им все равно что им подсунут Ссылка на комментарий Поделиться на другие сайты Поделиться
Synapsehome Опубликовано 19 марта, 2012 Поделиться Опубликовано 19 марта, 2012 00402152 74 26 JNZ SHORT keng_trn.0040217AJNZ на JE, тогда жизни вообще ни у кого отниматься не будутлибо:004020EC call off_4010C1// нопим для второго игрока004020F9 call off_4010C1 //нопим для первого игрокаПрикол имелся ввиду этот? )SetDlgItemTextA(hDlg, 101, String);SetDlgItemTextA(hDlg, 102, dword_4010B5);//можно сразу морозить Ссылка на комментарий Поделиться на другие сайты Поделиться
JIeXA Опубликовано 24 марта, 2012 Поделиться Опубликовано 24 марта, 2012 Мой вариантalloc(newmem,2048)label(originalcode)label(returnhere)label(Flag)newmem:cmp [edi+08],65jne short Flagoriginalcode:mov [edi+04],ebxFlag:push keng_trnme.exe+10C5jmp returnherekeng_trnme.exe+2181:jmp newmemnopnopnopreturnhere:[DISABLE]keng_trnme.exe+2181:mov [edi+04],ebxpush keng_trnme.exe+10C5dealloc(newmem)[ENABLE] Ссылка на комментарий Поделиться на другие сайты Поделиться
ICEBURG Опубликовано 20 июля, 2012 Поделиться Опубликовано 20 июля, 2012 Вот еще вариантикalloc(newmem,32)label(returnhere)label(cmps)newmem:cmp [edi+08],#101je cmpsdec ebxmov [keng_trnme.exe+10C5],ebxjmp returnherecmps:jmp 00402154"keng_trnme.exe"+217A:jmp newmemnopnopreturnhere:[DISABLE]"keng_trnme.exe"+217A:dec ebxmov [keng_trnme.exe+10C5],ebxdealloc(newmem)[ENABLE] Ссылка на комментарий Поделиться на другие сайты Поделиться
sooqua Опубликовано 4 августа, 2012 Поделиться Опубликовано 4 августа, 2012 Почему так работает:lea eax,dword ptr [edi+04]cmp eax,004010A9jne Player2А так нет:cmp dword ptr [edi+04],004010A9jne Player2? Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 4 августа, 2012 Поделиться Опубликовано 4 августа, 2012 Сравниваем регистр с статичном адресом если что прыгаем на наш создаваемый код в нашем случае Player2cmp eax,004010A9 // СТАТИЧНЫЙ АДРЕС Ссылка на комментарий Поделиться на другие сайты Поделиться
holy Опубликовано 17 июня, 2016 Поделиться Опубликовано 17 июня, 2016 Вот мой вариант, замораживает ХП первого игрока: Spoiler [ENABLE] alloc(newmem,2048) label(returnhere) label(skipdec) newmem: push eax // Сохраняем предыдущее значение EAX mov eax, [ebp+8] // Ссылка на структуру видимо cmp byte [eax], 1 // Сверяем первый байт с номером игрока pop eax // Восстанавливаем предыдущее значение je skipdec // Если 1 игрок, то перепрыгиваем вычитание dec ebx // Вычитание skipdec: mov [keng_trnme.exe+10C5], ebx // Сохранение значения в буфере jmp returnhere "keng_trnme.exe"+217A: jmp newmem nop nop returnhere: [DISABLE] "keng_trnme.exe"+217A: dec ebx mov [keng_trnme.exe+10C5], ebx dealloc(newmem) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 17 июня, 2016 Поделиться Опубликовано 17 июня, 2016 В 04.08.2012в18:26, sooqua сказал: Почему так работает: lea eax,dword ptr [edi+04] cmp eax,004010A9 jne Player2 А так нет: cmp dword ptr [edi+04],004010A9 jne Player2 ? Ну раз уже запостили в старой теме, то отвечу (для новичков) на этот вопрос. . Опкод lea в отличии от опкода mov загружает в eax адрес edi+04, а не значение по этому адресу [edi+04]. Т.е. мы можем записать так: lea eax,dword ptr [edi+04] // это тоже самое, что и mov eax, edi add eax,4 т.е. [edi+04] никогда не будет равно 004010A9 в keng trnme. Но второе сравнение, тоже можно привести к работающему виду: cmp edi,004010A5 //004010A9-04 jne Player2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения