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

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


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

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

Протестировал этот вариант. Как я понял, у некоторых врагов тоже присутствует параметр брони и в этом варианте им тоже добавляется броня.

Тогда давай ещё сделаем вариант скрипта, раз игра добавила броню.

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

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

{ 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(flag)   // добавляем, чтобы добавление брони в части скрипта с НР происходило только один раз.
label(code)
label(return)

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

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

flag:
dd 1

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
}

 

 

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

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

P.S.

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

Посмотри у MasterGH.

У него точно был плагин, который позволял сравнивать структуры, я эти плагины ещё не использовал.

Один из них тебе должен подойти

либо этот:

Lua Plugin CE StackViewer

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

либо этот:

Lua Plugin CE TinyDumper 

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

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

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

21404f3ef363fe5b26d6.jpg

 

Использовал для этого дела Notepad++ и плагин Compare. Меняются 3 значения - броня, указатель и флаг.

 

И вот тут происходит любопытная вещь:

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

49da59d1123146c14e12.jpg

Тут структура игрока загоняется в стек или что?

Если открыть указатель по смещению 4, то он будет ссылаться на адрес *BD0, там же опять присутствует указатель по смещению  4, который ссылает на адрес *DD4 и так далее...

 

Вот новая версия скрипта:

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

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

  This script does 99 HP & 98 ARM all time
}

[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
  cmp [ecx+14], 0  
  jne @f
  cmp [flag], 1  
  jne @f
  mov [ecx+14], #98
  mov [ecx+1C], 1  //Пишем тот флаг
  mov [flag], 0
  jmp code

@@:
  cmp [ecx+40], #16
  jne code
  cmp [ecx+2C], 1
  jne code
  mov eax, #98

code:
  mov [ecx],eax
  jmp return

flag:
dd 1

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
}

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

  This script does 99 HP & 98 ARM all time
}

[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
  cmp [ecx+14], 0	//Проверяем на 0 брони  
  jne @f
  cmp [flag], 1  
  jne @f
  mov [ecx+14], #98
  mov [ecx+1C], 1  //Пишем тот флаг
  mov [flag], 0
  jmp code

@@:
  cmp [ecx+40], #16
  jne code
  cmp [ecx+2C], 1
  jne code
  mov eax, #98

code:
  mov [ecx],eax
  jmp return

flag:
dd 1

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
}

 

 

P.S.

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

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

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

Проверил твой и свой вариант скрипта - всё равно работает криво и с крашами.

Мой вариант пробовал, без твоих изменений?

Отсюда:

 

 

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

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

Мой вариант пробовал, без твоих изменений?

Отсюда:

 

 

 

Этот тоже. Игра нервно реагирует как-то на прямое изменение брони. Скорее всего, при прямом подборе начинает работать что-то ещё и как это отлавливать - не знаю.

И вот забавная деталь - при попытке пострелять из серьёзной пушки игра крашится =) Причём краш происходит при любом изменении функции "mov [ecx], eax".

Какую-то непростую зверюшку я себе для опытов выбрал...

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

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

Поэтому советую скачать более раннюю версию этой же игры (да графика в разы хуже, но зато репак от Механиков работает стабильно) и экспериментировать и учиться на ней,

 

А по текущему скрипту -

Как видно из твоего скрина 

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

И вот тут происходит любопытная вещь:

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

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

Так что можно попробовать модифицировать твой последний скрипт:

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

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

  This script does 99 HP & 98 ARM all time
}

[ENABLE]

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

newmem:
  mov edx, [ebp+08]  
  cmp [ecx+A0], 2    
  jne @f             
  cmp esi, eax  
  jne @f        
  mov eax, #99
  cmp [ecx+14], 0  
  jne @f
  cmp [flag], 1  
  jne @f
  mov [ecx+14], #98
  sub [ecx+18],24  // Меняем поинтер на DD4-DB0 = 24
  mov [ecx+1C], 1  //Пишем тот флаг
  mov [flag], 0
  jmp code

@@:
  cmp [ecx+40], #16
  jne code
  cmp [ecx+2C], 1
  jne code
  mov eax, #98

code:
  mov [ecx],eax
  jmp return

flag:
dd 1

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
}

 

PS: Немного спутал не add, а sub нужно так как структура смещается вверх.

 

 

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

PS1: И ещё забыл написать, я не уверен, что через твой фильтр 

cmp [ecx+40], #16

не проскакивают другие адреса, это тоже нужно проверять.

Через мой двойной фильтр:

cmp [ecx+2c],1
  jne code
  cmp esi,1
  jne code

у меня в игре не проскакивали другие адреса, правда из СУПЕР-Пушек я не стрелял.

 

 

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

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

у меня в игре не проскакивали другие адреса, правда из СУПЕР-Пушек я не стрелял.

Я тут кое-что прояснил по пушке...Игра крашится даже при попытке нахождения всех опкодов, имеющих доступ к адресу патронов пушки. Если учитывать, что до CE 6.4 игра тупо падала даже при подключении отладчика - то явно проблема в кривом коде игры. А если вспомнить, что это порт классики с SE1 на движок SE3 и то, что последний раз фиксы на игру (2010 года) выходили в апреле 2015, подозрения перерастают в уверенность.

 

В прочем, по поводу пушки у меня есть одна идейка. Сейчас опробую.

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

 

Обновлено.

Не работает. Идея основывалась на том, что в EBX при стрельбе из пушки пишется 1, но при внедрении модернизированного скрипта при стрельбе из серьёзной пушки игра всё равно падает. И что ты будешь делать....

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

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

опробовал?

Да, опробовал. Заодно выполз пролёт с регистрами. При вычислении здоровья противников eax и esi также одинаковы. Теперь скрипт выглядит так и работает корректно (кроме пушки - так и не понял, как починить):

 

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

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

  This script does 99 HP & 98 ARM all time
}

[ENABLE]

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

label(code)
label(return)
label(flag)

newmem:
  mov edx, [ebp+08]  //Ставим инъекцию здесь, чтобы не захватывало иного кода
  cmp [ecx+A0], 2    //Фильтр №1 на игрока
  jne @f             //Прыжок на безымяную метку (не совпадает)
  cmp [ecx+A4], #45  //Фильтр №2 на игрока
  jne @f        //Прыжок на безымяную метку (не совпадает)
  mov eax, #99
  cmp [flag], 1
  jne @f
  mov [ecx+14], #98
  sub [ecx+18], 24  // Меняем указатель на DD4-DB0 = 24
  mov [ecx+1C], 1  //Пишем тот флаг
  mov [flag], 0
  jmp code

@@:
  cmp [ecx+2C], 1
  jne code
  cmp [ecx+40], #16
  jne code
  mov eax, #98

code:
  mov [ecx],eax
  jmp return

flag:
dd 1

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
}

 

 

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

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

Заодно выполз пролёт с регистрами.

Да нету там пролёта - через двойной фильтр проходит только НР нашего героя (и больше никакого адреса) . Ну поменял так поменял.

И esi=1 при работе с бронькой тоже правильный фильтр, только что проверил (установил игру без патча).

Для НР:

  cmp [ecx+A0], 2
  jne @f
  cmp esi, eax
  jne @f

Дл Armor:

  cmp [ecx+2C], 1
  jne code
  cmp esi,1
  jne code

Да и бронь добавляется тоже корректно (в случае если мы её ещё не подобрали).

 

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

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

Да нету там пролёта - через двойной фильтр проходит только НР нашего героя (и больше никакого адреса) . Ну поменял так поменял.

И esi=1 при работе с бронькой тоже правильный фильтр, только что проверил (установил игру без патча).

У меня пролетало. Я в конце-концов плюнул и начал поштучно отлавливать монстров, находить их ХП и смотреть в структуре - меняется ли значение от моего урона. Как я понял есть несколько классов монстров и класс игрока игра также считает за монстра, монстра с параметром брони.

 

А вот как лучше заморозить значение патронов в оружии, если в структуре игрока хранятся сведения о количестве, но нет максимального (я пока не нашёл)?

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

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

А вот как лучше заморозить значение патронов в оружии, если в структуре игрока хранятся сведения о количестве, но нет максимального (я пока не нашёл)?

Если ты уже нашёл фильтр для патронов, то всё просто:

  cmp [ecx+...], ...// Здесь твой фильтр для срабатывания инструкции на патронах любого оружия - фильтр нужно подобрать один для всех видов. 
  jne code
  mov eax,[ecx]    // Здесь загружаем предыдущее значение, но в данной игре возможно патроны не будут меняться не только при выстреле, 
                   // но и при подборе, поэтому проще написать сразу нужное количество  mov eax,#100.
code:
  mov [ecx],eax
  jmp return

Хотя для данной игры можно просто записывать при срабатывании инструкции на здоровье (так как фильтр для здоровья уже есть), просто обновляться значение патронов будут, только, когда по ГГ проходит урон. и проблема ещё в этом случае будет в том, что придётся записывать для каждого оружия своё смещение.

 

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

ЗЫ:

Вот точно какая проблема есть в скрипте - это в сигнатуре, проверил её, а она не уникальна, т.е.:

по сигнатуре 8B 55 08 89 01 8B находятся 4 адреса (это тоже может приводить к вылетам):

sl = AOBScan("8B 55 08 89 01 8B");

Found: 4 
008EC6DA 
68849F9E 
688C5353 
693307A7 

поэтому добавь ещё один байт в конце со значеннием 12, тогда будет только один адрес:

по сигнатуре:

sl = AOBScan("8B 55 08 89 01 8B 12");

Found: 1 
008EC6DA 

 Почему СЕ выбрала такую сигнатуру 8B 55 08 89 01 8B, когда я первый раз писал скрипт не знаю, видимо ошиблась ;).

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

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

Если ты уже нашёл фильтр для патронов, то всё просто:


  cmp [ecx+...], ...// Здесь твой фильтр для срабатывания инструкции на патронах любого оружия - фильтр нужно подобрать один для всех видов. 
  jne code
  mov eax,[ecx]    // Здесь загружаем предыдущее значение, но в данной игре возможно патроны не будут меняться не только при выстреле, 
                   // но и при подборе, поэтому проще написать сразу нужное количество  mov eax,#100.
code:
  mov [ecx],eax
  jmp return

Хотя для данной игры можно просто записывать при срабатывании инструкции на здоровье (так как фильтр для здоровья уже есть), просто обновляться значение патронов будут, только, когда по ГГ проходит урон. и проблема ещё в этом случае будет в том, что придётся записывать для каждого оружия своё смещение.

 

 

Я, нашёл их чуть ранее. Начинаются с 588, чередуются через смещение в 6.

 

В 15.03.2016в15:35, SergBrNord сказал:

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

  Скрыть содержимое

[ECX] + ...

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

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

5А8 - ракеты

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

5C8 - огнемёт

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

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

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

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

 

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

6737cf34a31d882c6bf2.jpg

 

 

Проблема в том, что у разного оружия - разные пределы патронов + идёт варьирование значения от сложности игры(!) :

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

 

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

миниган/автомат - 999;

ракеты - 100;

гранаты - 100;

огнемёт - 999;

лазерное ружьё - 800;

серьёзная пушка - 60;

снайперская винтовка - 100;

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

 

И вот тут возникает трудность - как сделать так, чтобы смотрелось нормально. Можно, конечно всему пихать по 5 патронов...

 

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

Вот точно какая проблема есть в скрипте - это в сигнатуре, проверил её, а она не уникальна, т.е.:

по сигнатуре 8B 55 08 89 01 8B находятся 4 адреса (это тоже может приводить к вылетам):


sl = AOBScan("8B 55 08 89 01 8B");

Found: 4 
008EC6DA 
68849F9E 
688C5353 
693307A7 

А каким образом это проверять?

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

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

А каким образом это проверять?

Я проверяю с помощью этого - 

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

Я, нашёл их чуть ранее.

Я писал про фильтр, а не про патроны. А что ты нашёл патроны я видел. В игре всё ищется легко.

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

И вот тут возникает трудность - как сделать так, чтобы смотрелось нормально.

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

Но для этой игры я бы все скрипты переписал не на пишущую инструкцию, а на читающую, Тогда не нужно было бы ждать пока по ГГ или броне нанесётся урон.

Читающие инструкцию выводят всё в туже структуру, только она взята ещё выше.

И кстати нашёл по поводу сверки шиврованного значения в игре (о чём тоже писал ранее), вот это место в коде:

SamHD_TSE.exe+4EC6F4 - 39 41 04                - cmp [ecx+04],eax
SamHD_TSE.exe+4EC6F7 - 74 0A                   - je SamHD_TSE.exe+4EC703
SamHD_TSE.exe+4EC6F9 - C7 05 68A2F500 01000000 - mov [SamHD_TSE.exe+B5A268],00000001 { [00000001] }
SamHD_TSE.exe+4EC703 - 8B 01                   - mov eax,[ecx]

Как видим, если не совпадают, то записывается по адресу  SamHD_TSE.exe+B5A268 1 и наверное что-то должно произойти, скорее всего вылет из игры.

Так что эту проверку можно отключить просто заменив 74 на EB (т.е. je на jmp).

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

Написал скрипт от читающий инструкции, без вылетов, добавляется бронька до её подбора.

Попробуй скрипт:

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

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

  This script does blah blah blah
}

[ENABLE]

aobscanmodule(GodMod,SamHD_TSE.exe,CC 8B 01 33 C1 39 41 04) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
registersymbol(GodMod)

newmem:
  cmp [ecx+A0],2
  jne @f
  cmp [ecx+A4],#45
  jne @f
  mov [ecx],#99
  xor eax,ecx
  mov [ecx+04],eax
  jmp code

@@:
  cmp [ecx+40], #16
  jne code
  cmp [ecx+2C], 1
  jne code
  mov [ecx],#99
  xor eax,ecx
  mov [ecx+04],eax


code:
  mov eax,[ecx]
  xor eax,ecx
  cmp [ecx+04],eax
  jmp return

GodMod+01:
  jmp newmem
  nop
  nop
return:

[DISABLE]
GodMod+01:
  db 8B 01 33 C1 39 41 04

unregistersymbol(GodMod)
dealloc(newmem)

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

"SamHD_TSE.exe"+4EC6DA: 8B 55 08                       -  mov edx,[ebp+08]
"SamHD_TSE.exe"+4EC6DD: 89 01                          -  mov [ecx],eax
"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 
// ---------- INJECTING HERE ----------
"SamHD_TSE.exe"+4EC6F0: 8B 01                          -  mov eax,[ecx]
"SamHD_TSE.exe"+4EC6F2: 33 C1                          -  xor eax,ecx
"SamHD_TSE.exe"+4EC6F4: 39 41 04                       -  cmp [ecx+04],eax
// ---------- DONE INJECTING  ----------
"SamHD_TSE.exe"+4EC6F7: 74 0A                          -  je SamHD_TSE.exe+4EC703
"SamHD_TSE.exe"+4EC6F9: C7 05 68 A2 F5 00 01 00 00 00  -  mov [SamHD_TSE.exe+B5A268],00000001
"SamHD_TSE.exe"+4EC703: 8B 01                          -  mov eax,[ecx]
"SamHD_TSE.exe"+4EC705: C3                             -  ret 
"SamHD_TSE.exe"+4EC706: CC                             -  int 3 
"SamHD_TSE.exe"+4EC707: CC                             -  int 3 
"SamHD_TSE.exe"+4EC708: CC                             -  int 3 
"SamHD_TSE.exe"+4EC709: CC                             -  int 3 
"SamHD_TSE.exe"+4EC70A: CC                             -  int 3 
"SamHD_TSE.exe"+4EC70B: CC                             -  int 3 
}

 

Зы: переделал скрипт с твоими фильтрами вроде пашет нормально и на всякий случай добавил 

  xor eax,ecx
  mov [ecx+04],eax

запись шифрованного значения.

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

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

И кстати нашёл по поводу сверки шиврованного значения в игре (о чём тоже писал ранее), вот это место в коде:


SamHD_TSE.exe+4EC6F4 - 39 41 04                - cmp [ecx+04],eax
SamHD_TSE.exe+4EC6F7 - 74 0A                   - je SamHD_TSE.exe+4EC703
SamHD_TSE.exe+4EC6F9 - C7 05 68A2F500 01000000 - mov [SamHD_TSE.exe+B5A268],00000001 { [00000001] }
SamHD_TSE.exe+4EC703 - 8B 01                   - mov eax,[ecx]

Как видим, если не совпадают, то записывается по адресу  SamHD_TSE.exe+B5A268 1 и наверное что-то должно произойти, скорее всего вылет из игры.

Так что эту проверку можно отключить просто заменив 74 на EB (т.е. je на jmp).

Сделал так, чтобы инструкция постоянно срабатывала - ничего не произошло. Скучно =(

 

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

Написал скрипт от читающий инструкции, без вылетов, добавляется бронька до её подбора.

При активации скрипта НР будет подыматься до максимальной  (в зависимости от сложности игры) и потом опять откатываться на #99.

Попробуй скрипт:

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


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

  This script does blah blah blah
}

[ENABLE]

aobscanmodule(GodMod,SamHD_TSE.exe,CC 8B 01 33 C1 39 41 04) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
registersymbol(GodMod)

newmem:
  cmp edi,1
  jne code
  cmp [ecx+A0],2
  jne @f
  mov [ecx],#99      // НР
  jmp code

@@:
  cmp [ecx+2C], 1
  jne code
  mov [ecx],#99      // Armor


code:
  mov eax,[ecx]
  xor eax,ecx
  cmp [ecx+04],eax
  jmp return

GodMod+01:
  jmp newmem
  nop
  nop
return:

[DISABLE]
GodMod+01:
  db 8B 01 33 C1 39 41 04

unregistersymbol(GodMod)
dealloc(newmem)

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

"SamHD_TSE.exe"+4EC6DA: 8B 55 08                       -  mov edx,[ebp+08]
"SamHD_TSE.exe"+4EC6DD: 89 01                          -  mov [ecx],eax
"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 
// ---------- INJECTING HERE ----------
"SamHD_TSE.exe"+4EC6F0: 8B 01                          -  mov eax,[ecx]
"SamHD_TSE.exe"+4EC6F2: 33 C1                          -  xor eax,ecx
"SamHD_TSE.exe"+4EC6F4: 39 41 04                       -  cmp [ecx+04],eax
// ---------- DONE INJECTING  ----------
"SamHD_TSE.exe"+4EC6F7: 74 0A                          -  je SamHD_TSE.exe+4EC703
"SamHD_TSE.exe"+4EC6F9: C7 05 68 A2 F5 00 01 00 00 00  -  mov [SamHD_TSE.exe+B5A268],00000001
"SamHD_TSE.exe"+4EC703: 8B 01                          -  mov eax,[ecx]
"SamHD_TSE.exe"+4EC705: C3                             -  ret 
"SamHD_TSE.exe"+4EC706: CC                             -  int 3 
"SamHD_TSE.exe"+4EC707: CC                             -  int 3 
"SamHD_TSE.exe"+4EC708: CC                             -  int 3 
"SamHD_TSE.exe"+4EC709: CC                             -  int 3 
"SamHD_TSE.exe"+4EC70A: CC                             -  int 3 
"SamHD_TSE.exe"+4EC70B: CC                             -  int 3 
}

 

 

Броня работает, здоровье отказывается уменьшаться. Сейчас пофикшу.

 

UPD.

Заставил здоровье прибавляться, но изменение здоровья каким-то образом уменьшает коэффициент входящего урона в монстров. Посмотрю xor-ы.

 

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

А супер-оружие это которое на дне первого озера подбираем?

Это пушка, стреляющая ядрами. буквально =)

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

latest?cb=20110827181444&path-prefix=ru

Вот линк на мои сейвы. Самый первый - там пушка уже есть. Только сохранено рядом с монстром.

https://www.dropbox.com/s/f0obmwevlkmb8qn/SeriousSamHD_TSE.rar?dl=0

 

P.S.

А можно ли перемещаться от скрипта к участку кода, который он изменяет? 

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

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

Броня работает, здоровье отказывается уменьшаться. Сейчас пофикшу.

Перепроверь тот скрипт, я его чуть-чуть изменил.

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

Это пушка, стреляющая ядрами. буквально =)

Да не, я не буду тестить - тесть сам, я то думал она там рядом просто лежит, в самом начале.

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

Наверное нужно затестить - запустить игру и не подключать СЕ и скрипты и посмотреть - вылетит ли она или нет.

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

А можно ли перемещаться от скрипта к участку кода, который он изменяет? 

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

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

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

Сделал так, чтобы инструкция постоянно срабатывала - ничего не произошло. Скучно =(

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

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

Всё фильтра сидят делают. 

В этой игре  за базовый адрес можно взять регистр esi - его даже игра использует на жизни. 

От него в смещении esi + 58 хранятся ID персонажей. Но так как СЕ не может добавить 'PlayerPuppet' за место фильтра, то его перевести надо из текста в какой не будь указатель и поставить сравнение на нем. Это отделит врагов от персонажа. 

Броня хранится в смещении +49С а жизнь в смещении + 488  Всем максимальные характеристики того или иного, хранятся там же. Это сидеть надо и смотреть.

В итоге получается: 

Вот эта инструкция сравнения на HP персонажа, срабатывает при врубления отладчика на жизни персонажа  cmp [esi+00000498],eax  видать сравнение жизни в eax лежит 64 - а то есть в 10_ом 100

Вот на этой инструкции и делается всё. 

Все последующие смещения характеристик, оружия и тому подобного для персонажа идут в этой же структуре.  

Вот в данном видео я на пример  пока не все нашел смещения для оружия и затолкал их на активацию сразу всего и жизни и брони и не которых видов оружия. Вот в этом режиме и можно будет искать все последующие смещения. Так как в нем есть практически всё. Есть конечно инструкция отвечающая за всё оружие в игре, но не знай будет ли она стабильно работать и не вылетать. Лучше уж так по смещениям сделать - видов оружий в игре не много и не которые типы патронов совпадают даже. На пример тоже самое ружьё и двухстволка или пулемет и два автомата в руке используют один и тот же тип патронов.

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

 

 

 

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

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

Всё фильтра сидят делают. 

А что ты умничаешь.

Выложи скрипт свой.  Посмотрю как ты в скрипте с XORированием сделал. Очень интересно посмотреть.Так как в игре идёт сверка.

Я делал автоматический поиск указателей на НР (но там 300 цепочек остаётся и во всех первое смещение +488). Но так и не до отсеил до конца - ломает.

Что в esi идёт начало структуры это было понятно с самого начала. А вот этот поинтер (который на смещении +58) я не открывал (не догадался посмотреть по этому смещению, искал по поинтерам около НР), да там действительно есть нормальное ID.PlayerPuppet. Ну теперь с таким ID проблем вообще нет написать скрипт.

Но ты всё же выложи свой скрипт - интересно.

И расскажи ещё как ты вышел на инструкцию  cmp [esi+00000498],eax   из адреса НР.

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

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

Выложи скрипт свой.  Посмотрю как ты в скрипте с XORированием сделал.

Где ты тут видишь шифрование то. 

newmem:
  push ecx
  mov ecx,[esi+58]
  cmp [ecx],79616C50  Это в обще фильтр идет 
  jne code
  mov [esi+00000488],#999 //heath
  mov [esi+00000A10],#200 //ammo shotsgun
  mov [esi+00000A80],#200 // ammo sniper
  mov [esi+0000049C],#999 // Armor

code:

А то сразу умничаешь...  Фильтр взять с поинтера и всё.. и то для того что бы врагов отделить от персонажа.

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

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

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

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