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

Скриптовая обработка инструкции fstp


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

Всем привед!

Продолжаю ломать старенькую игрушку "Гарри Поттер и Философский камень" =)

Сейчас взламываю здоровье. И возникла проблема с инструкцией fstp. НЯЗ, эта инструкция перемещает из регистра ST  данные в регистр-цель. И вот как работать с этим регистром ST?

 

Вот что я пытался провернуть (в структуре, находящейся в eax по смещению 4 – максимальное здоровье, в начале – текущее здоровье; всё типа float; инструкция работает с несколькими адресами, поэтому присутствует фильтр):

 

Скрытый текст

{ Game   : game.exe
  Version: 1.0
  Date   : 2017-04-30
  Author : SergBrNord
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

aobscanmodule(HEALTH,Core.dll,D9 18 59 C2 08 00 90 8B 0D 00 9A 1E 10 33 D2 3B CA B8 4B 1F 10 10 75 18 57 B9 00 10 00 00 BF 68 55 1E 10 C7 05 00 9A 1E 10 01 00 00 00 F3 AB 5F 39 05 3C 59 1E 10 74 1B) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
 fstp dword ptr [eax]  //Old instruction
 cmp [eax+4], 32 //50
 jne code
 mov [eax], (float)50

code:
  pop ecx
  ret 0008
  jmp return

HEALTH:
  jmp newmem
  nop
return:
registersymbol(HEALTH)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
HEALTH:
  db D9 18 59 C2 08 00

unregistersymbol(HEALTH)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Core.dll"+39709

"Core.dll"+396EC: DF E0                          -  fnstsw ax
"Core.dll"+396EE: F6 C4 01                       -  test ah,01
"Core.dll"+396F1: 75 0E                          -  jne Core.dll+39701
"Core.dll"+396F3: D9 44 24 00                    -  fld dword ptr [esp+00]
"Core.dll"+396F7: 8B 54 24 0C                    -  mov edx,[esp+0C]
"Core.dll"+396FB: D9 1A                          -  fstp dword ptr [edx]
"Core.dll"+396FD: 59                             -  pop ecx
"Core.dll"+396FE: C2 08 00                       -  ret 0008
"Core.dll"+39701: D9 44 24 08                    -  fld dword ptr [esp+08]
"Core.dll"+39705: 8B 44 24 0C                    -  mov eax,[esp+0C]
// ---------- INJECTING HERE ----------
"Core.dll"+39709: D9 18                          -  fstp dword ptr [eax]
"Core.dll"+3970B: 59                             -  pop ecx
"Core.dll"+3970C: C2 08 00                       -  ret 0008
// ---------- DONE INJECTING  ----------
"Core.dll"+3970F: 90                             -  nop 
"Core.dll"+39710: 8B 0D 00 9A 1E 10              -  mov ecx,[Core.dll+E9A00]
"Core.dll"+39716: 33 D2                          -  xor edx,edx
"Core.dll"+39718: 3B CA                          -  cmp ecx,edx
"Core.dll"+3971A: B8 4B 1F 10 10                 -  mov eax,Core.dll+1F4B
"Core.dll"+3971F: 75 18                          -  jne Core.dll+39739
"Core.dll"+39721: 57                             -  push edi
"Core.dll"+39722: B9 00 10 00 00                 -  mov ecx,00001000
"Core.dll"+39727: BF 68 55 1E 10                 -  mov edi,Core.dll+E5568
"Core.dll"+3972C: C7 05 00 9A 1E 10 01 00 00 00  -  mov [Core.dll+E9A00],00000001
}

 

 

P.S.

Вариант с использованием инструкции fstp возник после неудачи с этой попыткой:

Скрытый текст

{ Game   : game.exe
  Version: 1.0
  Date   : 2017-04-30
  Author : SergBrNord
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

aobscanmodule(HEALTH,Core.dll,8B XX 89 XX C2 XX XX 85 XX 7E 0E 56 8B XX XX XX 57 8B XX XX XX F3 A5 5F 5E C2 XX XX 90 90 90 90 8B XX XX XX 85 XX 74 04 D9 00 EB 06) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  cmp [eax+4], 32 //50
  jne code
  mov ebx, [eax+4]
  mov [eax], ebx
  xor ebx, ebx

code:
  mov ecx,[eax]
  mov [edx],ecx
  ret 0008
  jmp return

HEALTH:
  jmp newmem
  nop
  nop
return:
registersymbol(HEALTH)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
HEALTH:
  db 8B 08 89 0A C2 08 00

unregistersymbol(HEALTH)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Core.dll"+6D980

"Core.dll"+6D964: 8B 54 24 04           -  mov edx,[esp+04]
"Core.dll"+6D968: 8B 08                 -  mov ecx,[eax]
"Core.dll"+6D96A: 89 0A                 -  mov [edx],ecx
"Core.dll"+6D96C: C2 08 00              -  ret 0008
"Core.dll"+6D96F: 90                    -  nop 
"Core.dll"+6D970: 8B 49 34              -  mov ecx,[ecx+34]
"Core.dll"+6D973: 83 F9 01              -  cmp ecx,01
"Core.dll"+6D976: 75 0F                 -  jne Core.dll+6D987
"Core.dll"+6D978: 8B 44 24 08           -  mov eax,[esp+08]
"Core.dll"+6D97C: 8B 54 24 04           -  mov edx,[esp+04]
// ---------- INJECTING HERE ----------
"Core.dll"+6D980: 8B 08                 -  mov ecx,[eax]
"Core.dll"+6D982: 89 0A                 -  mov [edx],ecx
"Core.dll"+6D984: C2 08 00              -  ret 0008
// ---------- DONE INJECTING  ----------
"Core.dll"+6D987: 85 C9                 -  test ecx,ecx
"Core.dll"+6D989: 7E 0E                 -  jle Core.dll+6D999
"Core.dll"+6D98B: 56                    -  push esi
"Core.dll"+6D98C: 8B 74 24 0C           -  mov esi,[esp+0C]
"Core.dll"+6D990: 57                    -  push edi
"Core.dll"+6D991: 8B 7C 24 0C           -  mov edi,[esp+0C]
"Core.dll"+6D995: F3 A5                 - repe  movsd 
"Core.dll"+6D997: 5F                    -  pop edi
"Core.dll"+6D998: 5E                    -  pop esi
"Core.dll"+6D999: C2 08 00              -  ret 0008
}

 

Почему-то не срабатывает и отладить не могу - при попытке запустить игру в окне крашится напрочь.

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

Эти инструкции работают со стеком FPU, стеком хранящим и оперирующим значениями с плавающей точкой.

В CE его можно увидеть во время дебаггинга - справа в окне регистров будет кнопка со стрелкой ">":

Spoiler

FPU.thumb.png.5addef1d89d167074d915a8458

 

Собственно значения в этом окне и будут st(0), st(1) и т.д. Подебажив увидишь как они изменяются.

 

Инструкция fstp dword ptr [eax] которую ты нашел - это запись здоровья из регистра st(0) в Health структуры игрока.

Причем можно заметить, что попадает он в st(0) буквально на инструкцию выше - из fld dword ptr [esp+08] - эта инструкция берет значение из стека и пушит его в стек FPU.

 

Из этого следует, что где-то раньше взяли твое текущее здоровье, отняли его и записали в [esp+08]

Можно попытаться найти это место, а можно просто после fstp (в целом я думаю можно даже не делать fstp) сделать push [MAX_HEALTH] и pop [eax]. Увы mov [eax],[MAX_HEALTH] сделать нельзя, поэтому приходится через push. Но ты можешь сделать и fld [MAX_HEALTH] и fstp [eax].

 

Возможно фильтры будут нужны, но у меня есть сохранение только уже на Волан де Морте, поэтому проверить быстро не могу :D

 

Быстроскрипт без aobscan и фильтров:

Spoiler

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,64)
label(returnhere)
label(originalcode)
label(exit)
  
label(max_health)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here

originalcode:
fstp dword ptr [eax]

// записываем всегда 50, ничего не вычитаем
push [max_health]
pop [eax]

pop ecx
ret 0008

exit:
jmp returnhere

max_health:
dd (float)50
  
  
"Core.dll"+39709:
jmp newmem
nop
returnhere:


 
 
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"Core.dll"+39709:
fstp dword ptr [eax]
pop ecx
ret 0008
//Alt: db D9 18 59 C2 08 00

 

 

Изменено пользователем srg91
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

53 минуты назад, SergBrNord сказал:

Почему-то не срабатывает

1. Потому что значение НР у тебя во float как я понял, судя по первому скрипту.  Или в этой инструкции оно 4 байта?

2. В честь чего ты используешь EBX по логам не видно же свободный он или нет, скорее всего после ret 008 значение из EBX используется, но зато ты смело мог использовать ЕСХ.

 

Ответ на 1 вопрос, поправлю скрипт..

 

 

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

8 минут назад, srg91 сказал:

Эти инструкции работают со стеком FPU, стеком хранящим и оперирующим значениями с плавающей точкой.

В CE его можно увидеть во время дебаггинга - справа в окне регистров будет кнопка со стрелкой ">":

 

Возможно фильтры будут нужны, но у меня есть сохранение только уже на Волан де Морте, поэтому проверить быстро не могу :D

1. При попытке запустить в окошке эта собака крашится.

2. https://cloud.mail.ru/public/FxZJ/VXcMsjAB5 

Сэйвы: бежим вперёд и огребаем; просто кинуть в документы; в архиве 2 варианта.

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

7 минут назад, Garik66 сказал:

2. В честь чего ты используешь EBX по логам не видно же свободный он или нет, скорее всего после ret 008 значение из EBX используется, но зато ты смело мог использовать ЕСХ.

 

Ответ на 1 вопрос, поправлю скрипт..

 

 

Он пустой. Там ничего нет на момент срабатывания инструкции. Если бы что-то было, вложил бы в стек.

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

4 minutes ago, SergBrNord said:

При попытке запустить в окошке эта собака крашится.

 

Норм, на всяких Пивзах и Волан-де-Мортах работает без фильтрации.

А есть уровни с мобами? У меня какой-то супер дебаг режим включен, он и в окне запускается и могу по уровням прыгать.

Попробую поискать еще отдельных мобов, не боссов.

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

5 минут назад, Garik66 сказал:

Ты этот вариант проверил?

Сейчас указатель на таймер найду и опробую.

 

4 минуты назад, srg91 сказал:

 

Норм, на всяких Пивзах и Волан-де-Мортах работает без фильтрации.

А есть уровни с мобами? У меня какой-то супер дебаг режим включен, он и в окне запускается и могу по уровням прыгать.

Попробую поискать еще отдельных мобов, не боссов.

Есть, там, где в теплицу чешешь, это сразу после Пивза. В лабиринте есть как и растения хищные, так и гнумы в секретках.

P.S.

У тебя, скорее всего, консоль включена. Это как-то через файлы конфигурации производится.

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

1 час назад, SergBrNord сказал:

cmp [eax+4], 32 //50 jne code

Ну и использование MAX характеристик ГГ в качестве фильтра не совсем корректно (не учи плохому новичков :D).

 

Это может в Гарри Поттере. только у него здоровье 50 и он не развивается далее по игре, в других же играх не так.

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

9 минут назад, SergBrNord сказал:

Он пустой. Там ничего нет на момент срабатывания инструкции. Если бы что-то было, вложил бы в стек.

Вот переделал скрипт, он ничего не трогает, кроме EBX. проверь крашанётся игра при активации:

Скрытый текст

aobscanmodule(HEALTH,Core.dll,8B XX 89 XX C2 XX XX 85 XX 7E 0E 56 8B XX XX XX 57 8B XX XX XX F3 A5 5F 5E C2 XX XX 90 90 90 90 8B XX XX XX 85 XX 74 04 D9 00 EB 06) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  cmp [eax+4], 32 //50
  jne code
  xor ebx, ebx

code:
  mov ecx,[eax]
  mov [edx],ecx
  ret 0008
  jmp return

HEALTH:
  jmp newmem
  nop
  nop
return:
registersymbol(HEALTH)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
HEALTH:
  db 8B 08 89 0A C2 08 00

unregistersymbol(HEALTH)
dealloc(newmem)

 

 

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

58 minutes ago, SergBrNord said:

Есть, там, где в теплицу чешешь, это сразу после Пивза

 

Да, слушай, можешь без фильтров - гномы умирают, улитки засыпают, хп не уменьшается.

Просто записывай в [eax] после fstp 50 во флоате и будет отлично:

Да, через следующую запись хп не уменьшается, но нужно использовать фильтры, чтобы выйти на хп игрока, а не на иную характеристику:

fstp dword ptr [eax]

// записываем всегда 50, ничего не вычитаем
push (float)50
pop [eax]
Изменено пользователем srg91
Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, srg91 сказал:

Да, слушай, можешь без фильтров

@srg91, так же нельзя. Судя по игровому коду это контейнер, т.е. инструкция работает со многими адресами. Если другие не умирают, то скорее всего работает с характеристиками Гарри, но не только с НР.

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

1 час назад, SergBrNord сказал:

4 – максимальное здоровье, в начале – текущее здоровье; всё типа float;

Как я понял у тебя макс НР тоже во флоат, тогда у тебя первый скрипт не верный и моя поправка тоже.

Нужно так:

1 скрипт:

Скрытый текст

{ Game   : game.exe
  Version: 1.0
  Date   : 2017-04-30
  Author : SergBrNord
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

aobscanmodule(HEALTH,Core.dll,D9 18 59 C2 08 00 90 8B 0D 00 9A 1E 10 33 D2 3B CA B8 4B 1F 10 10 75 18 57 B9 00 10 00 00 BF 68 55 1E 10 C7 05 00 9A 1E 10 01 00 00 00 F3 AB 5F 39 05 3C 59 1E 10 74 1B) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
 fstp dword ptr [eax]  //Old instruction
 cmp [eax+4],(float) 50 //50
 jne code
 mov [eax], (float)50

code:
  pop ecx
  ret 0008
  jmp return

HEALTH:
  jmp newmem
  nop
return:
registersymbol(HEALTH)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
HEALTH:
  db D9 18 59 C2 08 00

unregistersymbol(HEALTH)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Core.dll"+39709

"Core.dll"+396EC: DF E0                          -  fnstsw ax
"Core.dll"+396EE: F6 C4 01                       -  test ah,01
"Core.dll"+396F1: 75 0E                          -  jne Core.dll+39701
"Core.dll"+396F3: D9 44 24 00                    -  fld dword ptr [esp+00]
"Core.dll"+396F7: 8B 54 24 0C                    -  mov edx,[esp+0C]
"Core.dll"+396FB: D9 1A                          -  fstp dword ptr [edx]
"Core.dll"+396FD: 59                             -  pop ecx
"Core.dll"+396FE: C2 08 00                       -  ret 0008
"Core.dll"+39701: D9 44 24 08                    -  fld dword ptr [esp+08]
"Core.dll"+39705: 8B 44 24 0C                    -  mov eax,[esp+0C]
// ---------- INJECTING HERE ----------
"Core.dll"+39709: D9 18                          -  fstp dword ptr [eax]
"Core.dll"+3970B: 59                             -  pop ecx
"Core.dll"+3970C: C2 08 00                       -  ret 0008
// ---------- DONE INJECTING  ----------
"Core.dll"+3970F: 90                             -  nop 
"Core.dll"+39710: 8B 0D 00 9A 1E 10              -  mov ecx,[Core.dll+E9A00]
"Core.dll"+39716: 33 D2                          -  xor edx,edx
"Core.dll"+39718: 3B CA                          -  cmp ecx,edx
"Core.dll"+3971A: B8 4B 1F 10 10                 -  mov eax,Core.dll+1F4B
"Core.dll"+3971F: 75 18                          -  jne Core.dll+39739
"Core.dll"+39721: 57                             -  push edi
"Core.dll"+39722: B9 00 10 00 00                 -  mov ecx,00001000
"Core.dll"+39727: BF 68 55 1E 10                 -  mov edi,Core.dll+E5568
"Core.dll"+3972C: C7 05 00 9A 1E 10 01 00 00 00  -  mov [Core.dll+E9A00],00000001
}

 

И второй:

Скрытый текст

{ Game   : game.exe
  Version: 1.0
  Date   : 2017-04-30
  Author : SergBrNord
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

aobscanmodule(HEALTH,Core.dll,8B XX 89 XX C2 XX XX 85 XX 7E 0E 56 8B XX XX XX 57 8B XX XX XX F3 A5 5F 5E C2 XX XX 90 90 90 90 8B XX XX XX 85 XX 74 04 D9 00 EB 06) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  cmp [eax+4], (float)50 //50
  jne code
  mov ecx, [eax+4]
  mov [eax],ecx
 
code:
  mov ecx,[eax]
  mov [edx],ecx
  ret 0008
  jmp return

HEALTH:
  jmp newmem
  nop
  nop
return:
registersymbol(HEALTH)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
HEALTH:
  db 8B 08 89 0A C2 08 00

unregistersymbol(HEALTH)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Core.dll"+6D980

"Core.dll"+6D964: 8B 54 24 04           -  mov edx,[esp+04]
"Core.dll"+6D968: 8B 08                 -  mov ecx,[eax]
"Core.dll"+6D96A: 89 0A                 -  mov [edx],ecx
"Core.dll"+6D96C: C2 08 00              -  ret 0008
"Core.dll"+6D96F: 90                    -  nop 
"Core.dll"+6D970: 8B 49 34              -  mov ecx,[ecx+34]
"Core.dll"+6D973: 83 F9 01              -  cmp ecx,01
"Core.dll"+6D976: 75 0F                 -  jne Core.dll+6D987
"Core.dll"+6D978: 8B 44 24 08           -  mov eax,[esp+08]
"Core.dll"+6D97C: 8B 54 24 04           -  mov edx,[esp+04]
// ---------- INJECTING HERE ----------
"Core.dll"+6D980: 8B 08                 -  mov ecx,[eax]
"Core.dll"+6D982: 89 0A                 -  mov [edx],ecx
"Core.dll"+6D984: C2 08 00              -  ret 0008
// ---------- DONE INJECTING  ----------
"Core.dll"+6D987: 85 C9                 -  test ecx,ecx
"Core.dll"+6D989: 7E 0E                 -  jle Core.dll+6D999
"Core.dll"+6D98B: 56                    -  push esi
"Core.dll"+6D98C: 8B 74 24 0C           -  mov esi,[esp+0C]
"Core.dll"+6D990: 57                    -  push edi
"Core.dll"+6D991: 8B 7C 24 0C           -  mov edi,[esp+0C]
"Core.dll"+6D995: F3 A5                 - repe  movsd 
"Core.dll"+6D997: 5F                    -  pop edi
"Core.dll"+6D998: 5E                    -  pop esi
"Core.dll"+6D999: C2 08 00              -  ret 0008
}

 

 

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

6 minutes ago, Garik66 said:

так же нельзя

 

Ну, если есть возможность или делаешь не для себя, то конечно.

Но если чисто игру пройти, то мне кажется можно и так. 

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

Только что, srg91 сказал:

Но если чисто игру пройти, то мне кажется можно и так. 

Так поплывут характеристики, они могут быть и в 4 байта, а ты везде пишешь 50 во float.

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

Just now, Garik66 said:

Так поплывут характеристики, они могут быть и в 4 байта, а ты везде пишешь 50 во float.

 

Никто же не спорит.

Я сразу и написал, что возможно понадобятся фильтры, но в целом по игре побегал и значимых изменений не вижу.

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

33 минуты назад, Garik66 сказал:

Вот переделал скрипт, он ничего не трогает, кроме EBX. проверь крашанётся игра при активации:

  Показать содержимое


aobscanmodule(HEALTH,Core.dll,8B XX 89 XX C2 XX XX 85 XX 7E 0E 56 8B XX XX XX 57 8B XX XX XX F3 A5 5F 5E C2 XX XX 90 90 90 90 8B XX XX XX 85 XX 74 04 D9 00 EB 06) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  cmp [eax+4], 32 //50
  jne code
  xor ebx, ebx

code:
  mov ecx,[eax]
  mov [edx],ecx
  ret 0008
  jmp return

HEALTH:
  jmp newmem
  nop
  nop
return:
registersymbol(HEALTH)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
HEALTH:
  db 8B 08 89 0A C2 08 00

unregistersymbol(HEALTH)
dealloc(newmem)

 

 

Нет, не крашнулось

 

3 минуты назад, Garik66 сказал:

Так ПКМ по инструкции в отладчике и посмотри сколько во сколько адресов ты записал (float)50

Данный конкретный случай - инструкция работает по 5 адресам.

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

1 minute ago, SergBrNord said:

Данный конкретный случай - инструкция работает по 5 адресам.

 

Довольно забавно, у меня только ГГ и изредко появляющийся адрес, который использовался 2 раза.

В любом случае я не спорю, что нужны фильтры, я вообще начал описывать что за fstp, просто решил попробовать побегать с простой записью и отписал по результатам.

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

Только что, SergBrNord сказал:

Данный конкретный случай - 5 адресов.

Так как инструкция на запись не все адреса сразу сработают, не которые будут срабатывать во время действий в игре.

Ну например, если нырнуть в воду, и Гарри в игре может задыхаться, появиться запас кислорода наверное, если ударить, то физ урон, если кастануть закл, то урон закла ит.д.. 

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

1 час назад, Garik66 сказал:

Ты этот вариант проверил?

Проверил. Не работает.

 

31 минуты назад, Garik66 сказал:

1 скрипт:

  Показать содержимое


{ Game   : game.exe
  Version: 1.0
  Date   : 2017-04-30
  Author : SergBrNord
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

aobscanmodule(HEALTH,Core.dll,D9 18 59 C2 08 00 90 8B 0D 00 9A 1E 10 33 D2 3B CA B8 4B 1F 10 10 75 18 57 B9 00 10 00 00 BF 68 55 1E 10 C7 05 00 9A 1E 10 01 00 00 00 F3 AB 5F 39 05 3C 59 1E 10 74 1B) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
 fstp dword ptr [eax]  //Old instruction
 cmp [eax+4],(float) 50 //50
 jne code
 mov [eax], (float)50

code:
  pop ecx
  ret 0008
  jmp return

HEALTH:
  jmp newmem
  nop
return:
registersymbol(HEALTH)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
HEALTH:
  db D9 18 59 C2 08 00

unregistersymbol(HEALTH)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Core.dll"+39709

"Core.dll"+396EC: DF E0                          -  fnstsw ax
"Core.dll"+396EE: F6 C4 01                       -  test ah,01
"Core.dll"+396F1: 75 0E                          -  jne Core.dll+39701
"Core.dll"+396F3: D9 44 24 00                    -  fld dword ptr [esp+00]
"Core.dll"+396F7: 8B 54 24 0C                    -  mov edx,[esp+0C]
"Core.dll"+396FB: D9 1A                          -  fstp dword ptr [edx]
"Core.dll"+396FD: 59                             -  pop ecx
"Core.dll"+396FE: C2 08 00                       -  ret 0008
"Core.dll"+39701: D9 44 24 08                    -  fld dword ptr [esp+08]
"Core.dll"+39705: 8B 44 24 0C                    -  mov eax,[esp+0C]
// ---------- INJECTING HERE ----------
"Core.dll"+39709: D9 18                          -  fstp dword ptr [eax]
"Core.dll"+3970B: 59                             -  pop ecx
"Core.dll"+3970C: C2 08 00                       -  ret 0008
// ---------- DONE INJECTING  ----------
"Core.dll"+3970F: 90                             -  nop 
"Core.dll"+39710: 8B 0D 00 9A 1E 10              -  mov ecx,[Core.dll+E9A00]
"Core.dll"+39716: 33 D2                          -  xor edx,edx
"Core.dll"+39718: 3B CA                          -  cmp ecx,edx
"Core.dll"+3971A: B8 4B 1F 10 10                 -  mov eax,Core.dll+1F4B
"Core.dll"+3971F: 75 18                          -  jne Core.dll+39739
"Core.dll"+39721: 57                             -  push edi
"Core.dll"+39722: B9 00 10 00 00                 -  mov ecx,00001000
"Core.dll"+39727: BF 68 55 1E 10                 -  mov edi,Core.dll+E5568
"Core.dll"+3972C: C7 05 00 9A 1E 10 01 00 00 00  -  mov [Core.dll+E9A00],00000001
}

 

И второй:

  Показать содержимое


{ Game   : game.exe
  Version: 1.0
  Date   : 2017-04-30
  Author : SergBrNord
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

aobscanmodule(HEALTH,Core.dll,8B XX 89 XX C2 XX XX 85 XX 7E 0E 56 8B XX XX XX 57 8B XX XX XX F3 A5 5F 5E C2 XX XX 90 90 90 90 8B XX XX XX 85 XX 74 04 D9 00 EB 06) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  cmp [eax+4], (float)50 //50
  jne code
  mov ecx, [eax+4]
  mov [eax],ecx
 
code:
  mov ecx,[eax]
  mov [edx],ecx
  ret 0008
  jmp return

HEALTH:
  jmp newmem
  nop
  nop
return:
registersymbol(HEALTH)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
HEALTH:
  db 8B 08 89 0A C2 08 00

unregistersymbol(HEALTH)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Core.dll"+6D980

"Core.dll"+6D964: 8B 54 24 04           -  mov edx,[esp+04]
"Core.dll"+6D968: 8B 08                 -  mov ecx,[eax]
"Core.dll"+6D96A: 89 0A                 -  mov [edx],ecx
"Core.dll"+6D96C: C2 08 00              -  ret 0008
"Core.dll"+6D96F: 90                    -  nop 
"Core.dll"+6D970: 8B 49 34              -  mov ecx,[ecx+34]
"Core.dll"+6D973: 83 F9 01              -  cmp ecx,01
"Core.dll"+6D976: 75 0F                 -  jne Core.dll+6D987
"Core.dll"+6D978: 8B 44 24 08           -  mov eax,[esp+08]
"Core.dll"+6D97C: 8B 54 24 04           -  mov edx,[esp+04]
// ---------- INJECTING HERE ----------
"Core.dll"+6D980: 8B 08                 -  mov ecx,[eax]
"Core.dll"+6D982: 89 0A                 -  mov [edx],ecx
"Core.dll"+6D984: C2 08 00              -  ret 0008
// ---------- DONE INJECTING  ----------
"Core.dll"+6D987: 85 C9                 -  test ecx,ecx
"Core.dll"+6D989: 7E 0E                 -  jle Core.dll+6D999
"Core.dll"+6D98B: 56                    -  push esi
"Core.dll"+6D98C: 8B 74 24 0C           -  mov esi,[esp+0C]
"Core.dll"+6D990: 57                    -  push edi
"Core.dll"+6D991: 8B 7C 24 0C           -  mov edi,[esp+0C]
"Core.dll"+6D995: F3 A5                 - repe  movsd 
"Core.dll"+6D997: 5F                    -  pop edi
"Core.dll"+6D998: 5E                    -  pop esi
"Core.dll"+6D999: C2 08 00              -  ret 0008
}

 

 

 "В угол" . Garik66

По 1 скрипту – интерпритатор ругался на:

cmp [eax+4],(float) 50 //50

Поправил на:

 mov [eax], (float)50

Также не сработал.

 

По 2 скрипту – во время первого здоровье прибавилось, но после получения урона игра крашнулась (я насиловал игру несколькими скриптами подряд). 

Во время второго запуска - полёт нормальный.

 

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

6 минут назад, SergBrNord сказал:

Во время второго запуска - полёт нормальный.

Отлично.

И по поводу фильтра продолжу.

Что ещё можно выцепить из ЛОГОВ (Хвала Дарк Байту):

1. Инструкция работает только с Гарри:

cmp ecx,01                // Это и есть ID Гарри - он первый :)
jne Core.dll+6D987

2. Соответственно, уверен на 90 % ID характеристик Гарри будут ещё в каком то регистре при срабатывания, т.е. ПКМ по инструкции, смотрим значения регистров адресов и находим ID здоровья, урона и т.д. и т.л.

И пишем на этой инструкции не только GodMod/  

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

14 минуты назад, Garik66 сказал:

Отлично.

И по поводу фильтра продолжу.

Что ещё можно выцепить из ЛОГОВ (Хвала Дарк Байту):

1. Инструкция работает только с Гарри:


cmp ecx,01                // Это и есть ID Гарри - он первый :)
jne Core.dll+6D987

2. Соответственно, уверен на 90 % ID характеристик Гарри будут ещё в каком то регистре при срабатывания, т.е. ПКМ по инструкции, смотрим значения регистров адресов и находим ID здоровья, урона и т.д. и т.л.

И пишем на этой инструкции не только GodMod/  

 "В угол" . Garik66

1. Да, я видел эту инструкцию, но никакой толковой мысли не возникло, кроме "На кой здесь с единичкой сравнивают?" =)

2. Тут так много чего пишется в регистры. Скорее всего, завтра ещё одна тема будет с тупыми вопросами типа "как это готовить?"

 

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

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

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

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