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

Serious Sam HD: TSE; взлом здоровья


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

Здравствуйте!

Я обучаюсь по видеокурсу Xipho и малость застрял на фильтрах "свой/чужой".

Делал всё по ГОСТу - нашёл инструкцию, покопался в структурах игрока и противника, написал скрипт, который не работает, как мне кажется, из-за неверного определения местонахожения структуры игрока

Помогите разобраться, где я ошибся.

 

Насколько я понял, идёт сравнение значений, в начале структуры(?), указатель на который находится в ECX, и значения в EAX; если не совпадает - идёт запись нового значения в начало структуры.

 

Скрины с редактором памяти и окном прерывания на доступ.

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

6aa8f78a1b7e05b29c58.jpg

 

af0bbb6e0b95201159ef.jpg

 

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

 

Окно разбора структур. Игрок; враг_1; враг_2; враг_3 соответственно.

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

73e330de1ad77cf9851b.jpg

 

 

По смещению А0 там находилось неизменяемое значение - у игрока оно всегда было равно 2.

Соответственно, я написал следующий скрипт, который не работает:

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

newmem:
  cmp dword ptr [ecx+A0], 2
  jne code
  mov dword ptr [ecx], #99

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

SAM_HP:
  jmp newmem
  nop
return:
registersymbol(SAM_HP)

 

 

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

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

Соответственно, я написал следующий скрипт, который не работает:

Стандартная ошибка всех, кто начинает (не беспокойся все эту ошибку делают ;)).

Посмотри участок твоего кода:

 

mov dword ptr [ecx], #99 // записываем 99 НР

code:
  mov [ecx],eax          // и сразу же затираем их значением в eax/    

Если твой фильтр верен.

Исправить скрипт можно двумя вариантами:

1.

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

newmem:
  cmp dword ptr [ecx+A0], 2
  jne code
  mov eax, #99

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

SAM_HP:
  jmp newmem
  nop
return:
registersymbol(SAM_HP)

 

2.

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

newmem:
  mov [ecx],eax
  cmp dword ptr [ecx+A0], 2
  jne code
  mov dword ptr [ecx], #99

code:
  mov edx,[edx]
  mov edx,[edx]
  jmp return

SAM_HP:
  jmp newmem
  nop
return:
registersymbol(SAM_HP)

 

 

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

PS:

1. вариант выглядит более надёжно, потому что, обрати внимание на строчку у тебя по коду игры:

xor eax,ecx   // значение НР XORируется.  

и уже шифрованное значение загружается в по смещению +04:

mov [ecx+04],eax  // шифрованное значение загружается во второй элемент от начала структуры.

Так что возможна далее по коду проверка, поэтому вариант 2. может не работать.

 

Какая возможна проверка:

Недавно LIRW ломал игру "unepic" и попросил помочь с шифрованными значениями (правда так и не воспользовался моим скриптом).

Так вот, в этой игре код примерно такой же.

Что сделали разработчики:

Записывают XORированные значения (XORирование через две константы) в два соседних адреса, а потом дальше по коду сверяют их друг с другом и, если значения в этих адресах не совпадают, то Ваш ГГ лопается - смотрится очень прикольно кстати - мне понравилось :D

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

По нормальному на таких инструкциях, не кто не чего не делает. Вот тут тема есть как сделать на подобных инструкциях скрипт Чпок

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

PS1:

Да, и ещё заметил у тебя на скрине Анализа Структур, что есть предыдущее значение НР (где-то я уже использовал такое у себя в скрипте вместо максимального) , так что 1 вариант скрипта можно записать ещё и так, чтобы записывать не #99, а игровое значение.

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

newmem:
  cmp dword ptr [ecx+A0], 2
  jne code
  push [ecx+10]                // Если это наш ГГ, то выгружаем в стек предыдущее значение НР (стек сдвигается).
  pop eax                      // И загружаем его в eax (при этом стек восстанавливается).

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

SAM_HP:
  jmp newmem
  nop
return:
registersymbol(SAM_HP)

 

 

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

54 минуты назад, LIRW сказал:

По нормальному на таких инструкциях, не кто не чего не делает. Вот тут тема есть как сделать на подобных инструкциях скрипт Чпок

Жень, а что за ссылку ты дал? (может ошибся и хотел дать другую ссылку?)

Потому что по твоей ссылке Geri рассказывает про прохождение "Туториала СЕ".

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

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

Жень, а что за ссылку ты дал?

Не то дал :wacko: Щас найду по новой. Теперь найти не могу... Там Гери как раз о подобной игре пишет - как сделать бессмертие. Щас историю ещо гляну. Хотя Игорь всё вроде правильно. Вот перевел и вот перевод моненько чудной правда :rolleyes: Как раз как искать в подобной игре. Думаю тут написано всё подробно даже с таким то кривым переводом. Инструкция в игре такая же какая и описывается в тотуреале. И как на правельное смещение выйти, а не на mov [eax],ecx с 55_тью фильтрами.

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

915fbe82da05811e61e744a4af9b5bbb.jpg

У него даже скрипт выложен на это бессмертие. Взято с СЕ форума... Хотя если поставить бряк на жизнь - выпадет там mov [eax],ecx - а не то что указано в Гери скрипте... Вот он как раз и советывает этот урок, тому же кто задал вопрос по этой же игре на СЕ форуме. 

Вот его скрипт даже - как и писал взят с СЕ форума... Автор Гери. 

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

//Made by Geri with Cheat Engine 6.0
//15th January, 2011
//All rights reserved. You are not allowed to use these scripts to create Your own trainer without my permission.
//Contact e-mail: trainers4free@gmail.com
[ENABLE]
//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)

newmem: //this is allocated memory, you have read,write,execute access
pushfd
pushad
mov ecx,[esi+58]   //save pointer
cmp [ecx],79616C50   //check of a string "Play"
jne originalcode     //jump if not equal
mov [esi+00000488],270F    //change health to 9999

originalcode:
popad
popfd
cmp [esi+00000498],eax

exit:
jmp returnhere

SamHD_TSE.exe+6BBA6:
jmp newmem
nop
returnhere:


 
 
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
SamHD_TSE.exe+6BBA6:
cmp [esi+00000498],eax
//Alt: db 39 86 98 04 00 00

 

И всё равно - что то я не то мне кажется дал... Там на СЕ форуме есть тема как раз про эту игру. И там всё описано понятно. Там просто слишком много переходов по ссылкам - по этому и запутался я.

В общем что бы не путаться - вот она Тема  

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

 

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

Стандартная ошибка всех, кто начинает (не беспокойся все эту ошибку делают ;)).

Посмотри участок твоего кода:

 


mov dword ptr [ecx], #99 // записываем 99 НР

code:
  mov [ecx],eax          // и сразу же затираем их значением в eax/    

Действительно, глупая ошибка; от постоянной возни с C# у меня как-то в голове перепуталось, что ассемблерный код не является функциями и выполняется последовательно (а возился я с asm года этак с 4 назад).

 

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

Записывают XORированные значения (XORирование через две константы) в два соседних адреса, а потом дальше по коду сверяют их друг с другом и, если значения в этих адресах не совпадают, то Ваш ГГ лопается - смотрится очень прикольно кстати - мне понравилось :D

Т.к. игра на SeriousEngine3, тут возможна следующая подлянка - за игроком по уровням будет быстро-быстро носится неубиваемая зверюшка и сильно мешаться (это происходило в пиратских SS3):lol:

 

2 часа назад, LIRW сказал:

И всё равно - что то я не то мне кажется дал... Там на СЕ форуме есть тема как раз про эту игру. И там всё описано понятно. Там просто слишком много переходов по ссылкам - по этому и запутался я.

В общем что бы не путаться - вот она Тема  

Спасибо, почитаю. Собственно, мне интересно, как работают все вышеуказанные примеры, так что я их обязательно попробую!

 

Кстати, те первые две инструкции (которые в окне прерывания на доступ) работают с количеством убитых монстров и набранных очков; чит-режимом.

 

P.S.

Собственно, как задумывался скрипт - в SS HD: TSE есть очки; очки даются как за убийство монстров, так и за сбор предметов на уровне (патронов, аптечек). Соответственно, необходимо установить параметр здоровья в такую максимальную величину, чтобы можно было всегда собирать предметы. Так что меня ещё ждёт броня и оружие. Заодно попробую сделать телепорт по мотивам уроков Xipho и неуязвимость от зон смерти (шипов & etc.)

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

По мотивам беседы с Гартком в ПМ, пытаюсь совладать с броней и получился такой казус - если пытаться писать скрипт под броню отдельно от здоровья, то получается, что он морозит и здоровье противников тоже... Как я понял, это связано с особенностью пересчёта здоровья и брони игрока.

 

Собственно, у меня сейчас такой вариант скрипта:

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

newmem:
  mov [ecx],eax
  cmp dword ptr [ecx+A0], 2
  jne code
  mov dword ptr [ecx], 63
  mov dword ptr [ecx+14], 62

code:
  mov edx,[edx]
  mov edx,[edx]
  jmp return

 

 

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

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

Я же тебе писал в ЛС, возьми адрес броньке и поставь на неё отдельно бряк. найди инструкцию работающую с бронёй и из неё напиши скрипт.

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

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

Думаю не работает фильтр свой/чужой в скрипте, поэтому морозятся все брони, а так как урон НР в игре скорее всего проходит только когда бронь разрушена, то морозится и НР.

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

В данном случае запись идёт уже после получения урона, что отображается в игре другом значение нежели 98.

Скорее всего расчёт урона брони по коду игры находится ниже чем расчёт урона НР и получается так, ты записал брони 98, а потом идёт игровая инструкция, которая перезаписывает 98 на новое значение.

 

Поэтому ещё раз поставь бряк (на запись/на доступ) найди инструкцию, проверь фильтр свой/чужой уже для брони и напиши скрипт.

 

ЗЫ:

И ещё что мне кажется, в 4 байтах НР и бронь, это видимые значения, а не реальные, которые скорее всего во float.

Сейчас качаю репак - антологию от Механиков, проверю.

 

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

У Механиков версия игры "Serious Sam Classic - The Second Encounter" - 1.07

Как и говорил - НР во float- реальное. НР в 4 байтах - видимое.

Вот скрипт "InfiniteHP" = "GodMod" + "OneHitKill" с правильным фильтром:

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

{ Game   : SeriousSam.exe
  Version: 
  Date   : 2016-03-14
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]

aobscanmodule(InfiniteHP,Engine.dll,D9 9E CC 00 00 00) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
registersymbol(InfiniteHP)

newmem:
  fstp dword ptr [esi+000000CC]
  push eax
  mov eax,[esi+5c]
  mov eax,[eax+0c]
  cmp dword ptr [eax+08],79616C50 // Play (Classes\Player.ecl у нашего, у врага Classes\Eyeman.ecl)
  pop eax
  jne code
  mov dword ptr [esi+000000CC],(float)200 // GodMod
  jmp return

code:
  mov dword ptr [esi+000000CC],(float)0   // OHK
  jmp return

InfiniteHP:
  jmp newmem
  nop
return:


[DISABLE]

InfiniteHP:
  db D9 9E CC 00 00 00

unregistersymbol(InfiniteHP)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Engine.dll"+10278C

"Engine.dll"+10276C: 8B F1                 -  mov esi,ecx
"Engine.dll"+10276E: 85 F6                 -  test esi,esi
"Engine.dll"+102770: 89 75 F0              -  mov [ebp-10],esi
"Engine.dll"+102773: 74 03                 -  je Engine.dll+102778
"Engine.dll"+102775: FF 46 18              -  inc [esi+18]
"Engine.dll"+102778: 57                    -  push edi
"Engine.dll"+102779: D9 86 CC 00 00 00     -  fld dword ptr [esi+000000CC]
"Engine.dll"+10277F: D8 65 10              -  fsub dword ptr [ebp+10]
"Engine.dll"+102782: 8D 4D C4              -  lea ecx,[ebp-3C]
"Engine.dll"+102785: C7 45 FC 00 00 00 00  -  mov [ebp-04],00000000
// ---------- INJECTING HERE ----------
"Engine.dll"+10278C: D9 9E CC 00 00 00     -  fstp dword ptr [esi+000000CC]
// ---------- DONE INJECTING  ----------
"Engine.dll"+102792: E8 D9 33 05 00        -  call Engine.dll+155B70
"Engine.dll"+102797: 8B 7D 08              -  mov edi,[ebp+08]
"Engine.dll"+10279A: C6 45 FC 01           -  mov byte ptr [ebp-04],01
"Engine.dll"+10279E: 85 FF                 -  test edi,edi
"Engine.dll"+1027A0: 74 03                 -  je Engine.dll+1027A5
"Engine.dll"+1027A2: FF 47 18              -  inc [edi+18]
"Engine.dll"+1027A5: 8B 45 CC              -  mov eax,[ebp-34]
"Engine.dll"+1027A8: 85 C0                 -  test eax,eax
"Engine.dll"+1027AA: 8B C8                 -  mov ecx,eax
"Engine.dll"+1027AC: 74 14                 -  je Engine.dll+1027C2
}

 

 

Броньку искать не буду - ломает в такие играть, так что дальше сам.

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

От не чего делать добавил в "InfiniteHP" броньку и ещё пару скриптов написал:

 "InfiniteHP" = "GodMod" + "OneHitKill" + "InfiniteArmor"

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

{ Game   : SeriousSam.exe
  Version: 
  Date   : 2016-03-14
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]

aobscanmodule(InfiniteHP,Engine.dll,D9 9E CC 00 00 00) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
registersymbol(InfiniteHP)

newmem:
  fstp dword ptr [esi+000000CC]
  push eax
  mov eax,[esi+5c]
  mov eax,[eax+0c]
  cmp dword ptr [eax+08],79616C50 // Play (Classes\Player.ecl у нашего, у врага Classes\Eyeman.ecl)
  pop eax
  jne code
  mov dword ptr [esi+000000CC],(float)200 // GodMod
  mov dword ptr [esi+00000370],(float)200 // InfiniteArmor
  jmp return

code:
  mov dword ptr [esi+000000CC],(float)0   // OneHitKill
  jmp return

InfiniteHP:
  jmp newmem
  nop
return:


[DISABLE]

InfiniteHP:
  db D9 9E CC 00 00 00

unregistersymbol(InfiniteHP)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Engine.dll"+10278C

"Engine.dll"+10276C: 8B F1                 -  mov esi,ecx
"Engine.dll"+10276E: 85 F6                 -  test esi,esi
"Engine.dll"+102770: 89 75 F0              -  mov [ebp-10],esi
"Engine.dll"+102773: 74 03                 -  je Engine.dll+102778
"Engine.dll"+102775: FF 46 18              -  inc [esi+18]
"Engine.dll"+102778: 57                    -  push edi
"Engine.dll"+102779: D9 86 CC 00 00 00     -  fld dword ptr [esi+000000CC]
"Engine.dll"+10277F: D8 65 10              -  fsub dword ptr [ebp+10]
"Engine.dll"+102782: 8D 4D C4              -  lea ecx,[ebp-3C]
"Engine.dll"+102785: C7 45 FC 00 00 00 00  -  mov [ebp-04],00000000
// ---------- INJECTING HERE ----------
"Engine.dll"+10278C: D9 9E CC 00 00 00     -  fstp dword ptr [esi+000000CC]
// ---------- DONE INJECTING  ----------
"Engine.dll"+102792: E8 D9 33 05 00        -  call Engine.dll+155B70
"Engine.dll"+102797: 8B 7D 08              -  mov edi,[ebp+08]
"Engine.dll"+10279A: C6 45 FC 01           -  mov byte ptr [ebp-04],01
"Engine.dll"+10279E: 85 FF                 -  test edi,edi
"Engine.dll"+1027A0: 74 03                 -  je Engine.dll+1027A5
"Engine.dll"+1027A2: FF 47 18              -  inc [edi+18]
"Engine.dll"+1027A5: 8B 45 CC              -  mov eax,[ebp-34]
"Engine.dll"+1027A8: 85 C0                 -  test eax,eax
"Engine.dll"+1027AA: 8B C8                 -  mov ecx,eax
"Engine.dll"+1027AC: 74 14                 -  je Engine.dll+1027C2
}

 

"InfiniteAmmo":

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

{ Game   : SeriousSam.exe
  Version: 
  Date   : 2016-03-15
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]

aobscanmodule(Ammo,EntitiesMP.dll,29 08 5D C3 90) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:

code:
  //sub [eax],ecx
  pop ebp
  ret 
  nop 
  jmp return

Ammo:
  jmp code
return:
registersymbol(Ammo)

[DISABLE]

Ammo:
  db 29 08 5D C3 90

unregistersymbol(Ammo)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "EntitiesMP.dll"+104E1D

"EntitiesMP.dll"+104E00: 55                    -  push ebp
"EntitiesMP.dll"+104E01: 8B EC                 -  mov ebp,esp
"EntitiesMP.dll"+104E03: A1 FC B2 48 60        -  mov eax,[EntitiesMP.dll+17B2FC]
"EntitiesMP.dll"+104E08: 8B 08                 -  mov ecx,[eax]
"EntitiesMP.dll"+104E0A: FF 15 F8 B2 48 60     -  call dword ptr [EntitiesMP.dll+17B2F8]
"EntitiesMP.dll"+104E10: 8B 48 54              -  mov ecx,[eax+54]
"EntitiesMP.dll"+104E13: 85 C9                 -  test ecx,ecx
"EntitiesMP.dll"+104E15: 75 08                 -  jne EntitiesMP.dll+104E1F
"EntitiesMP.dll"+104E17: 8B 45 08              -  mov eax,[ebp+08]
"EntitiesMP.dll"+104E1A: 8B 4D 0C              -  mov ecx,[ebp+0C]
// ---------- INJECTING HERE ----------
"EntitiesMP.dll"+104E1D: 29 08                 -  sub [eax],ecx
"EntitiesMP.dll"+104E1F: 5D                    -  pop ebp
"EntitiesMP.dll"+104E20: C3                    -  ret 
"EntitiesMP.dll"+104E21: 90                    -  nop 
// ---------- DONE INJECTING  ----------
"EntitiesMP.dll"+104E22: 90                    -  nop 
"EntitiesMP.dll"+104E23: 90                    -  nop 
"EntitiesMP.dll"+104E24: 90                    -  nop 
"EntitiesMP.dll"+104E25: 90                    -  nop 
"EntitiesMP.dll"+104E26: 90                    -  nop 
"EntitiesMP.dll"+104E27: 90                    -  nop 
"EntitiesMP.dll"+104E28: 90                    -  nop 
"EntitiesMP.dll"+104E29: 90                    -  nop 
"EntitiesMP.dll"+104E2A: 90                    -  nop 
"EntitiesMP.dll"+104E2B: 90                    -  nop 
}

 

"ExperiencePoints":

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

{ Game   : SeriousSam.exe (приостановлен)
  Version: 
  Date   : 2016-03-15
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]

aobscanmodule(ExperiencePoints,EntitiesMP.dll,8B 81 AC 25 00 00 89) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
label(flag)
registersymbol(flag)
registersymbol(ExperiencePoints)

newmem:
  cmp [flag],1
  jne code
  add [ecx+000025AC],#10000
  mov [flag],0

code:
  mov eax,[ecx+000025AC]
  jmp return

flag:
dd 1

ExperiencePoints:
  jmp newmem
  nop
return:

[DISABLE]
ExperiencePoints:
  db 8B 81 AC 25 00 00

unregistersymbol(flag)
unregistersymbol(ExperiencePoints)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "EntitiesMP.dll"+17922

"EntitiesMP.dll"+178E8: 68 10 80 51 60        -  push EntitiesMP.dll+208010
"EntitiesMP.dll"+178ED: 8B 00                 -  mov eax,[eax]
"EntitiesMP.dll"+178EF: C7 40 24 00 00 00 00  -  mov [eax+24],00000000
"EntitiesMP.dll"+178F6: 8B 0D 60 90 51 60     -  mov ecx,[EntitiesMP.dll+209060]
"EntitiesMP.dll"+178FC: FF 15 B8 B3 48 60     -  call dword ptr [EntitiesMP.dll+17B3B8]
"EntitiesMP.dll"+17902: 8B 0D 60 90 51 60     -  mov ecx,[EntitiesMP.dll+209060]
"EntitiesMP.dll"+17908: C7 45 08 00 00 00 41  -  mov [ebp+08],41000000
"EntitiesMP.dll"+1790F: C7 41 38 01 00 00 00  -  mov [ecx+38],00000001
"EntitiesMP.dll"+17916: 8B 0D 68 90 51 60     -  mov ecx,[EntitiesMP.dll+209068]
"EntitiesMP.dll"+1791C: 8B 91 E8 0B 00 00     -  mov edx,[ecx+00000BE8]
// ---------- INJECTING HERE ----------
"EntitiesMP.dll"+17922: 8B 81 AC 25 00 00     -  mov eax,[ecx+000025AC]
// ---------- DONE INJECTING  ----------
"EntitiesMP.dll"+17928: 89 55 9C              -  mov [ebp-64],edx
"EntitiesMP.dll"+1792B: 8B 55 F0              -  mov edx,[ebp-10]
"EntitiesMP.dll"+1792E: 85 D2                 -  test edx,edx
"EntitiesMP.dll"+17930: 74 21                 -  je EntitiesMP.dll+17953
"EntitiesMP.dll"+17932: A1 3C 56 50 60        -  mov eax,[EntitiesMP.dll+1F563C]
"EntitiesMP.dll"+17937: 85 C0                 -  test eax,eax
"EntitiesMP.dll"+17939: 75 07                 -  jne EntitiesMP.dll+17942
"EntitiesMP.dll"+1793B: C7 45 08 00 00 80 40  -  mov [ebp+08],40800000
"EntitiesMP.dll"+17942: 8B 81 B0 25 00 00     -  mov eax,[ecx+000025B0]
"EntitiesMP.dll"+17948: 8B 89 B4 25 00 00     -  mov ecx,[ecx+000025B4]
}

 

Табличка с уже назначенной горячей клавишей Numpad 1 +10000 ExperiencePoints.

 

 

SeriousSam.CT

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

Гарик, ты развил прям-таки бурную деятельность. Но есть один мааааа-хонький нюанс - ты сделал таблицу для "Классики", а движки SE1 и SE3 работают по-разному. 

Я проверил твою идею о том, что реальное значение хранится как вещественный тип. Действительно, при выборке в поиск всех типов значений находится и float, но на движке SE3 оно как раз-таки экранное.

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

190575785ceed61e1b65.jpg

 

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

Думаю не работает фильтр свой/чужой в скрипте, поэтому морозятся все брони, а так как урон НР в игре скорее всего проходит только когда бронь разрушена, то морозится и НР.

 

Интересно. Я даже как-то не подумал о таком варианте, хоть он вроде бы даже и логичен. Поставлю остановов на запись - может чего и выловлю. Хотя в последнем варианте я всё-же записывал после того, как урон наносился. Странно.

 

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

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

SE3

У Механиков есть в антологии игра Serious Sam 3 - BFE - это она?

Просто у тебя в заголовке игра называется Serious Sam HD: TSE, вот я и подобрал наиболее подходящую из антологии.

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

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

У Механиков есть в антологии игра Serious Sam 3 - BFE - это она?

Просто у тебя в заголовке игра называется Serious Sam HD: TSE, вот я и подобрал наиболее подходящую из антологии.

Нет, это не оно. Объяснил в ПС.

 

Покопался и нашел смещения, хранящие значения патронов для оружия:

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

[ECX] + ...

588 - дробовик/двустволка

798 - миниган/автомат

5А8 - ракеты

5B8 - гранатомёт

5C8 - огнемёт

5D8 - лазерное ружьё

5E8 - серьёзная пушка

5F8 - снайперская винтовка

608 - серьёзная бомба

 

Попробую похимичить со значениями, но как показало себя вмешательство с бронёй - игра очень нервно реагирует на изменение содержимого ECX.

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

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

Объяснил в ПС.

У меня ничего нет в ЛС. Из старой переписки я вышел уже давно, может ты в неё написал?

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

Как я и говорил не работал фильтр для брони.

Вот попробуй скрипт (долго не тестил) "GodMod + InfiniteArmor" :

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

{ Game   : SamHD_TSE.exe
  Version: 
  Date   : 2016-03-15
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]
aobscanmodule(INJECT,SamHD_TSE.exe,8B 55 08 89 01 8B) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
registersymbol(INJECT)

newmem:
  mov edx,[ebp+08]
  cmp [ecx+a0],2
  jne @f
  cmp esi,eax
  jne @f
  mov eax,#500     // GodMod
  jmp code

@@:
  cmp [ecx+2c],1
  jne code
  cmp esi,1
  jne code
  mov eax,#500     // InfiniteArmor

code:
  mov [ecx],eax
  jmp return

INJECT:
  jmp newmem
return:


[DISABLE]
INJECT:
  db 8B 55 08 89 01

unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "SamHD_TSE.exe"+4EC6DA

"SamHD_TSE.exe"+4EC6C9: 5D                             -  pop ebp
"SamHD_TSE.exe"+4EC6CA: C2 04 00                       -  ret 0004
"SamHD_TSE.exe"+4EC6CD: CC                             -  int 3 
"SamHD_TSE.exe"+4EC6CE: CC                             -  int 3 
"SamHD_TSE.exe"+4EC6CF: CC                             -  int 3 
"SamHD_TSE.exe"+4EC6D0: 55                             -  push ebp
"SamHD_TSE.exe"+4EC6D1: 8B EC                          -  mov ebp,esp
"SamHD_TSE.exe"+4EC6D3: 8B 45 0C                       -  mov eax,[ebp+0C]
"SamHD_TSE.exe"+4EC6D6: 39 01                          -  cmp [ecx],eax
"SamHD_TSE.exe"+4EC6D8: 74 11                          -  je SamHD_TSE.exe+4EC6EB
// ---------- INJECTING HERE ----------
"SamHD_TSE.exe"+4EC6DA: 8B 55 08                       -  mov edx,[ebp+08]
"SamHD_TSE.exe"+4EC6DD: 89 01                          -  mov [ecx],eax
// ---------- DONE INJECTING  ----------
"SamHD_TSE.exe"+4EC6DF: 8B 12                          -  mov edx,[edx]
"SamHD_TSE.exe"+4EC6E1: 8B 12                          -  mov edx,[edx]
"SamHD_TSE.exe"+4EC6E3: 33 C1                          -  xor eax,ecx
"SamHD_TSE.exe"+4EC6E5: 89 51 08                       -  mov [ecx+08],edx
"SamHD_TSE.exe"+4EC6E8: 89 41 04                       -  mov [ecx+04],eax
"SamHD_TSE.exe"+4EC6EB: 5D                             -  pop ebp
"SamHD_TSE.exe"+4EC6EC: C2 08 00                       -  ret 0008
"SamHD_TSE.exe"+4EC6EF: CC                             -  int 3 
"SamHD_TSE.exe"+4EC6F0: 8B 01                          -  mov eax,[ecx]
"SamHD_TSE.exe"+4EC6F2: 33 C1                          -  xor eax,ecx
}

 

 

ЗЫ: Нужно добавить для броньки ещё фильтр, идут зависоны игры иногда, видимо какие-то адреса проскакивают.

В сумме через этот фильтр 

cmp [ecx+a0],2

проскакивает ещё один адрес кроме НР, а через этот  

cmp [ecx+2c],1

ещё два адреса, кроме броньки. 

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

 

А почему не сохраняются настройки оконного режима - нужно постоянно по новой настраивать?

Переделал скрипт в этом же сообщении. Проверь у себя.

 

При вылетах в игре вот такая ошибка у меня выскакивает:

9018413.jpg

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

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

А почему не сохраняются настройки оконного режима - нужно постоянно по новой настраивать?

Потому что игра вылетает и не сохраняет их. Вот если поставить оконный режим и выйти из игры по нормальному, тогда всё сохранится.

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

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

Как я и говорил не работал фильтр для брони.

Вот попробуй скрипт (долго не тестил) "GodMod + InfiniteArmor" :

Ух ты! Я и подумать не мог, что можно использовать регистры в качестве фильтров )

Собственно, твой скрипт работал на всё, кроме брони, поэтому я немного его модифицировал:

 

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

{ Game   : SamHD_TSE.exe
  Version:
  Date   : 2016-03-16
  Author : Garik & SergBrNord

  This script does 99 HP & 98 ARM
}

[ENABLE]

aobscanmodule(SAM_HP_ARM,SamHD_TSE.exe,8B 55 08 89 01 8B) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  mov edx, [ebp+08]
  cmp [ecx+A0], 2
  jne @f
  cmp esi, eax
  jne @f
  mov eax, #99
  jmp code

@@:   
  cmp [ecx+40], #16
  jne code
  cmp [ecx+2C], 1	//В регистре esi у меня всё, что угодно, но не единица
  jne code
  mov eax, #98
  
code:
  mov [ecx],eax
  jmp return

SAM_HP_ARM:
  jmp newmem
return:
registersymbol(SAM_HP_ARM)

[DISABLE]

SAM_HP_ARM:
  db 8B 55 08 89 01

unregistersymbol(SAM_HP_ARM)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "SamHD_TSE.exe"+4F483A

"SamHD_TSE.exe"+4F4829: 5D                             -  pop ebp
"SamHD_TSE.exe"+4F482A: C2 04 00                       -  ret 0004
"SamHD_TSE.exe"+4F482D: CC                             -  int 3
"SamHD_TSE.exe"+4F482E: CC                             -  int 3
"SamHD_TSE.exe"+4F482F: CC                             -  int 3
"SamHD_TSE.exe"+4F4830: 55                             -  push ebp
"SamHD_TSE.exe"+4F4831: 8B EC                          -  mov ebp,esp
"SamHD_TSE.exe"+4F4833: 8B 45 0C                       -  mov eax,[ebp+0C]
"SamHD_TSE.exe"+4F4836: 39 01                          -  cmp [ecx],eax
"SamHD_TSE.exe"+4F4838: 74 11                          -  je SamHD_TSE.exe+4F484B
// ---------- INJECTING HERE ----------
"SamHD_TSE.exe"+4F483A: 8B 55 08                       -  mov edx,[ebp+08]
"SamHD_TSE.exe"+4F483D: 89 01                          -  mov [ecx],eax
// ---------- DONE INJECTING  ----------
"SamHD_TSE.exe"+4F483F: 8B 12                          -  mov edx,[edx]
"SamHD_TSE.exe"+4F4841: 8B 12                          -  mov edx,[edx]
"SamHD_TSE.exe"+4F4843: 33 C1                          -  xor eax,ecx
"SamHD_TSE.exe"+4F4845: 89 51 08                       -  mov [ecx+08],edx
"SamHD_TSE.exe"+4F4848: 89 41 04                       -  mov [ecx+04],eax
"SamHD_TSE.exe"+4F484B: 5D                             -  pop ebp
"SamHD_TSE.exe"+4F484C: C2 08 00                       -  ret 0008
"SamHD_TSE.exe"+4F484F: CC                             -  int 3
"SamHD_TSE.exe"+4F4850: 8B 01                          -  mov eax,[ecx]
"SamHD_TSE.exe"+4F4852: 33 C1                          -  xor eax,ecx
}

 

 

И такой вопрос - данные скрипты, не пишут броню, если её 0. А вот как так сделать, чтобы при получении урона, если брони 0 писалось значение в 98?

Вот такой вариант у меня не работает:

 

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

@@:	//Запись брони
  cmp [ecx], 0	
  je @f
  cmp [ecx+40], #16
  jne code
  cmp [ecx+2C], 1
  jne code
  mov eax, #98

@@:	//Запись брони, если 0
  cmp [ecx], 0
  jne code
  mov [ecx+14], #98

 

 

P.S.

До внедрения кода на команду выше, чтобы заменяло только "mov edx, [ebp+08"] и "mov [ecx],eax", я тоже вряд ли бы додумался)

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

Ковырялся щас на СЕ форме и кое что мне попалось - и тут тебя вспомнил :) ... А то есть как делать по нормальному данные вещи на анреалоском движке, а не как Игорь делает с фильтрами вешая все на регистр. 

Вот всё подробно и понятно описано, от начала до конца. Тема

 

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

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

Собственно, твой скрипт работал на всё, кроме брони

Я игру снёс сразу после написания скрипта. (она меня задолбала вылетами, видимо плохо сломана).

Но у меня, в момент, когда инструкция работала с бронёй - esi всегда был равен 1, а когда с НР esi всегда был равен eax. Поэтому и использовал их в качестве фильтра. 

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

И такой вопрос - данные скрипты, не пишут броню, если её 0.

Потому что, пока мы не подберём броню, данная инструкция не работает с бронёй.

Поэтому совет зайди во всю туже структуру, до подбора брони и смотри, что поменяется в структуре при подборе брони (в +14 - появиться количество брони - это мы знаем), скорее всего будет типа флага какого-нибудь на другом смещении, например 0 когда нет брони и 1 когда есть, или 0 когда нет брони и ID (адрес,- указатель, смещение) когда есть.

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

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

Я игру снёс сразу после написания скрипта. (она меня задолбала вылетами, видимо плохо сломана).

Мы её по моему с Krocki тоже смотрели(если не ошибаюсь) и вот эта ошибка тоже надоела :lol: я тоже не выдержал. Так и не доделал её и желания больше нет. То под пол провалишься не из за чего, то ещо чего то... Ну конечно не совсем не из за чего, а из за того, что я там что то делаю не так и что то конфликтует, но всё равно эта ошибка очень часто попадалась. Может и правду какая то защита там стоит. Кстати Игорь - я пробовал на лицензии делать и всё равно эта ошибка. Это не что краша игры. Тема должна была остаться тут , но в поиске она почему то не находится.

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

PS: Ещё можно попробовать заставить игру дать нам броню (т.е. вписать сразу количество брони до её подбора), без поиска флага (ID).

Не знаю к чему это приведёт, но попробуй скрипт:

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

{ Game   : SamHD_TSE.exe
  Version:
  Date   : 2016-03-16
  Author : Garik & SergBrNord

  This script does 99 HP & 98 ARM
}

[ENABLE]

aobscanmodule(SAM_HP_ARM,SamHD_TSE.exe,8B 55 08 89 01 8B) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  mov edx, [ebp+08]
  cmp [ecx+A0], 2
  jne @f
  cmp esi, eax
  jne @f
  mov eax, #99
  mov [ecx+14],#98  // Попробуем вписать броньку при срабатывании инструкции на НР ГГ.
  jmp code

@@:   
  cmp [ecx+40], #16
  jne code
  cmp [ecx+2C], 1	//В регистре esi у меня всё, что угодно, но не единица
  jne code
  mov eax, #98
  
code:
  mov [ecx],eax
  jmp return

SAM_HP_ARM:
  jmp newmem
return:
registersymbol(SAM_HP_ARM)

[DISABLE]

SAM_HP_ARM:
  db 8B 55 08 89 01

unregistersymbol(SAM_HP_ARM)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "SamHD_TSE.exe"+4F483A

"SamHD_TSE.exe"+4F4829: 5D                             -  pop ebp
"SamHD_TSE.exe"+4F482A: C2 04 00                       -  ret 0004
"SamHD_TSE.exe"+4F482D: CC                             -  int 3
"SamHD_TSE.exe"+4F482E: CC                             -  int 3
"SamHD_TSE.exe"+4F482F: CC                             -  int 3
"SamHD_TSE.exe"+4F4830: 55                             -  push ebp
"SamHD_TSE.exe"+4F4831: 8B EC                          -  mov ebp,esp
"SamHD_TSE.exe"+4F4833: 8B 45 0C                       -  mov eax,[ebp+0C]
"SamHD_TSE.exe"+4F4836: 39 01                          -  cmp [ecx],eax
"SamHD_TSE.exe"+4F4838: 74 11                          -  je SamHD_TSE.exe+4F484B
// ---------- INJECTING HERE ----------
"SamHD_TSE.exe"+4F483A: 8B 55 08                       -  mov edx,[ebp+08]
"SamHD_TSE.exe"+4F483D: 89 01                          -  mov [ecx],eax
// ---------- DONE INJECTING  ----------
"SamHD_TSE.exe"+4F483F: 8B 12                          -  mov edx,[edx]
"SamHD_TSE.exe"+4F4841: 8B 12                          -  mov edx,[edx]
"SamHD_TSE.exe"+4F4843: 33 C1                          -  xor eax,ecx
"SamHD_TSE.exe"+4F4845: 89 51 08                       -  mov [ecx+08],edx
"SamHD_TSE.exe"+4F4848: 89 41 04                       -  mov [ecx+04],eax
"SamHD_TSE.exe"+4F484B: 5D                             -  pop ebp
"SamHD_TSE.exe"+4F484C: C2 08 00                       -  ret 0008
"SamHD_TSE.exe"+4F484F: CC                             -  int 3
"SamHD_TSE.exe"+4F4850: 8B 01                          -  mov eax,[ecx]
"SamHD_TSE.exe"+4F4852: 33 C1                          -  xor eax,ecx
}

 

 

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

2 минуты назад, LIRW сказал:

Кстати Игорь - я пробовал на лицензии делать и всё равно эта ошибка.

Я почитал сообщения репака, ссылку на который мне дал  SergBrNord.

Там пишут, что разработчики специально поломали некоторые файлы игры (борьба против пиратов), и только после обновления со Стим эти файлы принимают нормальный вид. Так что, как делали репакеры я не знаю (по-видимому не очень справились), но ошибка явно специально деланная разработчиками.

 

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

26 минуты назад, LIRW сказал:

Может и правду какая то защита там стоит. Кстати Игорь - я пробовал на лицензии делать и всё равно эта ошибка. Это не что краша игры. Тема должна была остаться тут , но в поиске она почему то не находится.

На лицензии, CE младше 6.4 крашил игру при присоединении отладчика. Собственно, хоть я давно уроки посмотрел, но только на CE 6.4 смог начать её ломать - других шутеров у меня просто нет, только куча квестов. Так что у игры явно есть какой-то антидебаг-механизм .

 

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

PS: Ещё можно попробовать заставить игру дать нам броню (т.е. вписать сразу количество брони до её подбора), без поиска флага (ID).

Не знаю к чему это приведёт, но попробуй скрипт:

Протестировал этот вариант. Как я понял, у некоторых врагов тоже присутствует параметр брони и в этом варианте им тоже добавляется броня. Соответственно, из некоторого оружия их становится просто не убить - к примеру, у клиров из двустволки в упор снимается 50% здоровья, хотя должно ваншотить. Ну и, в конце-концов, игра минут через 8 подвисает.

 

P.S.

А есть ли в CE механизм, в который можно подгрузить старую и новую структуру и сравнить?  

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

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

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

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