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

Что за "движок" игры и как с этим бороться...?


SerVick

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

Парни, всем привет!!:D Столкнулся вот с такой проблемой в игре. Делаю скрипт с АОБ, всё работает норм, но после загрузки нового уровня скрипты, если были включены не отключаются. А если выключить перед переходом на другой уровень, то не влючаются. Правда, если перезапустить трейнер, или СЕ всё включится, но опять до следующего уровня. Как решить данную проблему, что -бы не пере запускать трейнер, или СЕ?:)

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

SerVick, что-то неправильно нашел или для каждого уровня свои указатели, или ошибку где допустил.

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

Как решить данную проблему, что -бы не пере запускать трейнер, или СЕ

Ну нужен скрипт, чтоб точно сказали, в чем ошибка, и игра.

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

24 минуты назад, SerVick сказал:

Как решить данную проблему, что -бы не пере запускать трейнер, или СЕ?

Отключать за некоторое время до смены уровня, либо найти какой-нибудь триггер в конце уровня и использовать его для отключения скриптов,могу предположить, что игра динамически выделяет память под код на каждый уровень, типа 0x400000 на первом уровне, 0x500000 на втором и т.д.рандомно. Ещё вариант есть, но мне надо знать адреса выглядят как game.exe/game.dll + 0x или просто адрес?

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

Да дело -то в том, что дело не в скрипте. Он работает, вот пример такой был. Включил скрипт- работает(определим как уровень 1), перед переходом на следующий уровень выключил, после перехода (уровень 2) не включается, перейдя на уровень 3 снова работает... ? Если нужен вот скрипт: (код жизни)

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

[ENABLE]
aobscanmodule(Heal,G_Indy.sgl,D5 85 C0 74 1B D9 80 84 00 00 00)
alloc(newmem,$1000)
label(return)

newmem:
  fld dword ptr [eax+00000088]
  fst dword ptr [eax+00000084]
  jmp return

Heal+05:
  jmp newmem
  db 90
return:
registersymbol(Heal)

[DISABLE]
Heal+05:
  db D9 80 84 00 00 00

unregistersymbol(Heal)
dealloc(newmem)

 

 

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

Но это уже на оружие, а скрипт вот 

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

aobscanmodule(Ammo,G_Indy.sgl,8B 91 E4 0F 00 00)
alloc(newmem,$1000)
label(return)

newmem:
  mov [ecx+00000FE4],#6
  jmp return

Ammo:
  jmp newmem
  db 90
return:
registersymbol(Ammo)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
Ammo:
  db 8B 91 E4 0F 00 00

unregistersymbol(Ammo)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "G_Indy.sgl"+5A780

"G_Indy.sgl"+5A76B: D8 3D 58 F3 2F 0F              -  fdivr dword ptr [G_Indy.sgl+17F358]
"G_Indy.sgl"+5A771: D9 9E F4 0F 00 00              -  fstp dword ptr [esi+00000FF4]
"G_Indy.sgl"+5A777: 5E                             -  pop esi
"G_Indy.sgl"+5A778: C3                             -  ret 
"G_Indy.sgl"+5A779: 32 C0                          -  xor al,al
"G_Indy.sgl"+5A77B: 5F                             -  pop edi
"G_Indy.sgl"+5A77C: 5E                             -  pop esi
"G_Indy.sgl"+5A77D: C3                             -  ret 
"G_Indy.sgl"+5A77E: 90                             -  nop 
"G_Indy.sgl"+5A77F: 90                             -  nop 
// ---------- INJECTING HERE ----------
"G_Indy.sgl"+5A780: 8B 91 E4 0F 00 00              -  mov edx,[ecx+00000FE4]
// ---------- DONE INJECTING  ----------
"G_Indy.sgl"+5A786: 33 C0                          -  xor eax,eax
"G_Indy.sgl"+5A788: 85 D2                          -  test edx,edx
"G_Indy.sgl"+5A78A: 0F 9F C0                       -  setg al
"G_Indy.sgl"+5A78D: C3                             -  ret 
"G_Indy.sgl"+5A78E: 90                             -  nop 
"G_Indy.sgl"+5A78F: 90                             -  nop 
"G_Indy.sgl"+5A790: 56                             -  push esi
"G_Indy.sgl"+5A791: 6A 08                          -  push 08
"G_Indy.sgl"+5A793: 8B F1                          -  mov esi,ecx
"G_Indy.sgl"+5A795: E8 16 48 04 00                 -  call G_Indy.sgl+9EFB0
}

 

 

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

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

Вот как выглядит адрес для инъекции кода "G_Indy.sgl"+5A780

На сколько я помню, в aobscanmodule можно указывать откуда начинать поиск .Если код динамически выделяется, то можешь использовать точку входа или же глобальную переменную указывающую на начало модуля, чтобы в своем скрипте в сигнатуре динамически получать откуда начинается модуль и искать необходимые тебе инструкции, думаю такой вариант должен избавить тебя от проблемы с перезапуском CЕ/трейнера.

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

partoftheworlD , если -бы ещё знать как это сделать?:) Я ещё дилетант в таких вопросах. Может для примера покажешь, или где посмотреть на эту тему. В общем как это всё делается???

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

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

Может для примера покажешь, или где посмотреть на эту тему. В общем как это всё делается???


Попробую, я сам только что придумал.:D

 

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

 

Создаешь 2 переменные oldModule, newModule, какая-то из глобальных переменных может быть указателем на точку входа или же на начало модуля и устанавливаешь переменным твой адрес, После лучше в цикле проверять раз в 1 секунду не изменилась ли глобальная переменная после смены уровня, если нет, то производить инъекцию, если изменилась, то удалить метку используя oldModule и найти эти же инструкции используя newModule, присвоить oldModule newModule и снова инъекция. Если подумать подольше, думаю можно проще сделать будет, но пока только такое придумал.
 

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

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

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

Я трейнеры делаю -же не профессионально, а на СЕ, а на нём сам понимаешь больших знаний не надо, если не мудрить с дизайном... .:)

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

Если что поправишь, примерно описал как мне кажется сработает, но это тестировать надо и нужен общий цикл под newmem2, тогда должно работать в теории.

 

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

[ENABLE]
aobscanmodule(GlobalVar, XX XX XX XX XX XX XX)
alloc(newmem,$1000)
alloc(newmem2,$1000)
registersymbol(GlobalVar)
registersymbol(oldModule)
registersymbol(newModule)
label(return)
label(GlobalVars)
label(new)
label(old)
label(return2)

newmem2:
mov [GlobalVars],eax   //Указатель на начало модуля
mov edx, [GlobalVars]  //Адрес начала модуля

cmp oldModule, 0       //Проверки, не изменились ли адреса (лучшше эту проверку в loop запихнуть)
je new
cmp newModule, 0
je new
cmp oldModule, edx  
je old

cmp oldModule, edx
jne new

jmp Heal+05

old:
aobscanmodule(Heal, oldModule,D5 85 C0 74 1B D9 80 84 00 00 00) //Указание старого адреса модуля для поиска байт

new:
unregistersymbol(Heal)      //Перерегистрируем символ
mov [oldModule], edx        //Присваиваем адрес на начало модуля
mov [newModule], edx
aobscanmodule(Heal, newModule,D5 85 C0 74 1B D9 80 84 00 00 00)  //Указание нового адреса модуля для поиска байт

GlobalVar:
jmp newmem2

newmem:
  fld dword ptr [eax+00000088]
  fst dword ptr [eax+00000084]
  jmp return

Heal+05:
  jmp newmem
  nop
return:
registersymbol(Heal)
[DISABLE]
Heal+05:
  db D9 80 84 00 00 00

unregistersymbol(Heal)
unregistersymbol(GlobalVar)
unregistersymbol(oldModule)
unregistersymbol(newModule)
dealloc(newmem)
dealloc(newmem2)
Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

Спасибо, partoftheworlD!!!  Сейчас погляжу и попробую. Просто немного понимаю в кодах, но говорю не спец.  в этих вопросах. И это только на один скрипт жизни, т.е. не каждую функцию так надо писать? И ещё вот сразу какой вопрос, в этом месте так и пишется в квадратных скобках?  mov [GlobalVars],eax //Указатель на начало модуля, ну и в других подобных местах. И если да, то как и где это смотрится, что бы записывать подобный скрипт... ? 

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

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

Спасибо, partoftheworlD!!!  Сейчас погляжу и попробую.

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

aobscanmodule(GlobalVar, XX XX XX XX XX XX XX)

Если его нет, то и скрипт не подойдет, надо будет ещё костыли придумывать.

 

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

И это только на один скрипт жизни, т.е. не каждую функцию так надо писать?

На все

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

И ещё вот сразу какой вопрос, в этом месте так и пишется в квадратных скобках?  

Да

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

то как и где это смотрится, что бы записывать подобный скрипт... ? 

Я в IDA смотрю, а вообще можно и в CE берешь текущий адрес начала модуля и ищешь в CE типа как в способе ручного поиска указателей, если повезет сразу зеленый адрес будет.

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

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

Как решить данную проблему, что -бы не пере запускать трейнер, или СЕ?:)

Сталкивался и не раз: 1 вариант в сигнатуре меняется что-то, 2 вариант меняется инструкция. Оба варианта решаемы.

Решение 1 варианта:

1. Вариант (помогал, но не всегда), скачать Плагин АА от Мастера. Для 32-битных игрушек, он работает довольно корректно.

2. Вариант (помогает всегда) нужно найти (для контроля лучше больше чем на 3 уровнях) сигнатуры , посмотреть что меняется и заменить на XX, при этом проверять Сканером сигнатур, уникальна ли сигна, есть нет - удлинять её.

 

Решение 2 варианта:

найти все инструкции, может быть и для каждого уровня придётся. 

  

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

Я так понял, мне надо найти указатель, и от него уже отталкиваться и вписывать байты отталкиваясь от указателя... .? В общем пока не очень понятно, что мне сделать на этом этапе, я конечно могу поискать указатель, хоть это и хлопотное обычно дело... .:)

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

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

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

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

Garik66, а где можно скачать этот плагин.  

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

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

Видел я твои скрипты :) Ты используешь постоянно одну и туже метку. Как идет по дефолту INJECT - так ты во всех скриптах его и используешь.  Включить то ты включишь, а вот выключить - ты уже не выключишь. Но судя по скрипту - ты уже видать стал менять название, но опять же - не знай для красоты (ну как бы в красивом виде показать) не знай понял эту ошибку и стал уже менять названия.

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

LIRW, Привет!!! Да как ты тогда сказал, я и меняю названия в метке. Или надо, что -то ещё делать сами метки менять. Но после того как ты сказал, что нельзя что -бы везде было метка INJECT, я и пишу всегда разное. И всё норм работало, до этой игры. Может, что ещё надо так подскажи. Я же учусь. Пусть и по немного,.. . На ошибках и учатся... .:) 

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

20 минуты назад, SerVick сказал:

LIRW, Привет!!! Да как ты тогда сказал, я и меняю названия в метке. Или надо, что -то ещё делать сами метки менять. Но после того как ты сказал, что нельзя что -бы везде было метка INJECT, я и пишу всегда разное. И всё норм работало, до этой игры. Может, что ещё надо так подскажи. Я же учусь. Пусть и по немного,.. . На ошибках и учатся... .:) 

А что за игра?

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

Проблема скорее всего в том, что в сигнатуре чита 

aobscanmodule(Ammo,G_Indy.sgl,8B 91 E4 0F 00 00)

затесались изменяющиеся оффсеты. Их нужно заменить на знаки ?? и при необходимости удлинить цепочку байт, если она потеряет уникальность. В данном случае 8B 91 E4 0F 00 00 это 

mov edx,[ecx+00000FE4]

так вот этот оффсет  FE4 может быть другим на другом уровне. Меняем его на ???? и получаем aobscanmodule(Ammo,G_Indy.sgl,8B 91 ?? ?? 00 00) Теперь добавляем ещё парочку байт ниже по коду и получаем что-то вроде 

aobscanmodule(Ammo,G_Indy.sgl,8B 91 ?? ?? 00 00 33 C0 85 D2)

или в CE вместо вопросов принято писать иксы xx ? Вроде и так и так можно.

Цитата

Правда, если перезапустить трейнер, или СЕ всё включится, но опять до следующего уровня.

Хотя могу ошибаться и проблема именно в том, что CE "теряет" dll-ку.  Как быть в этом случае не подскажу, случай экзотический( В игре ГЭГ вон то же самое, но там тренер нужен только в одном месте игры, так что выкрутиться можно.

 

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

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

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

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