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

keng trnme


keng

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

В который раз подивившись размерам простыни, что я награфоманил вот в [этой] теме, я засел за код и в результате (после пары пакетов молока, конечно же) родился малюсенький трейнми, который учит работать со структурами. Он простой донельзя, но одна заковырочка там всё-таки есть. Вот скриншот:

trnme.png

Жмём кнопку "Hit P1" - ранят первого игрока, жмём "Hit P2" - ранят второго. Задача - сделать одного из игроков иммунными к сей заразе.

Качаем: keng_trnme.zip

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

Хотел отправить в личку, но ругается, что больше не можете получать сообщения, поэтому сюда

Решение:

Ищем значение здоровья любого из игрока (тип - строка)

Адрес со здоровьем игрока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 cheat
alloc(newmem,2048) //2kb should be enough
label(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 exit
originalcode:
dec ebx
exit:
mov [keng_trnme.exe+10C5],ebx
pop eax
jmp returnhere

Pid:
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 cheat
dealloc(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" = 101

id "Hit P2" = 102

делаем практически такой же скрипт, что и выше, но только для

keng_trnme.exe+2189 - FF 77 08 - push [edi+08]


//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(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 exit
originalcode:
push [edi+08]
exit:
push [keng_trnme.exe+10BD]
pop eax
jmp returnhere

Bid:
dd 0

"keng_trnme.exe"+2189:
jmp newmem
nop
nop
nop
nop
returnhere:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(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
Ссылка на комментарий
Поделиться на другие сайты

Мой вариант:

[ENABLE]

alloc(newmem,22)

label(returnhere)

newmem:

PUSH EAX

MOV EAX,[EDI]

CMP EAX,1

POP EAX

JNE +3

MOV [EDI+04],EBX

PUSH 004010C5

JMP returnhere

00402181:

jmp newmem

nop

nop

nop

returnhere:

[DISABLE]

00402181:

mov [edi+04],ebx

push 004010C5

dealloc(newmem)

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

Мой вариант:

Только после (де)активации скрипта нужно нажимать кнопку 2 раза для вступления изменений в силу, что не очень красиво.

Жду продолжений ваших трейнми (если есть такие планы), только что-нибудь сложней.

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

ANT' date='14 Март 2012 - 17:25' timestamp='1331731504' post='7354']

Только после (де)активации скрипта нужно нажимать кнопку 2 раза для вступления изменений в силу, что не очень красиво.

Жду продолжений ваших трейнми (если есть такие планы), только что-нибудь сложней.

Попробую что-нибудь придумать, но я никогда их не писал - это был первый. :lol:

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

ANT' date='14 Март 2012 - 20:25' timestamp='1331731504' post='7354']

Только после (де)активации скрипта нужно нажимать кнопку 2 раза для вступления изменений в силу, что не очень красиво.

Жду продолжений ваших трейнми (если есть такие планы), только что-нибудь сложней.

Сложность тут всё-таки это не главная цель. :) Очевидно, что цель была показать наглядный пример как сделать бессмертие только для своего игрока и как это сделать скриптами на Cheat Engine. Хорошо, что этот пример и прост, и одновременно чем-то хорошо похож на то, что может встретиться в играх.

Сделать другой такой трейнерми чтобы он был и сложнее и похож на существующие проблемы в многих играх будет сложно. Было дело я видел трейнми настолько закрученные, что это превращалось в экзотику, которую в играх я не видел даже. Это называется угробить своё время на создание трейнми решение которого используется очень редко. Могут быть, правда, маньяки, которые любят полазить в отладке и им все равно что им подсунут :lol:

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

00402152	 74 26		  JNZ SHORT keng_trn.0040217A

JNZ на JE, тогда жизни вообще ни у кого отниматься не будут

либо:


004020EC call off_4010C1// нопим для второго игрока


004020F9 call off_4010C1 //нопим для первого игрока

Прикол имелся ввиду этот? )


SetDlgItemTextA(hDlg, 101, String);
SetDlgItemTextA(hDlg, 102, dword_4010B5);//можно сразу морозить

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

Мой вариант


alloc(newmem,2048)
label(originalcode)
label(returnhere)
label(Flag)

newmem:
cmp [edi+08],65
jne short Flag
originalcode:
mov [edi+04],ebx
Flag:
push keng_trnme.exe+10C5
jmp returnhere


keng_trnme.exe+2181:
jmp newmem
nop
nop
nop
returnhere:


[DISABLE]
keng_trnme.exe+2181:
mov [edi+04],ebx
push keng_trnme.exe+10C5
dealloc(newmem)
[ENABLE]

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

  • 3 месяца спустя...

Вот еще вариантик


alloc(newmem,32)
label(returnhere)
label(cmps)

newmem:
cmp [edi+08],#101
je cmps
dec ebx
mov [keng_trnme.exe+10C5],ebx
jmp returnhere

cmps:
jmp 00402154

"keng_trnme.exe"+217A:
jmp newmem
nop
nop
returnhere:

[DISABLE]
"keng_trnme.exe"+217A:
dec ebx
mov [keng_trnme.exe+10C5],ebx
dealloc(newmem)
[ENABLE]

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

  • 2 недели спустя...

Сравниваем регистр с статичном адресом если что прыгаем на наш создаваемый код в нашем случае Player2

cmp eax,004010A9 //  СТАТИЧНЫЙ АДРЕС

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

  • 3 года спустя...

Вот мой вариант, замораживает ХП первого игрока:

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)

 

 

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

В 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

 

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

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

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

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