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

[Indiana Jones and the Emperor's Tomb] Как быть, в таком случае?!


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

Столкнулся с такой ситуацией игра "Indiana Jones and the Emperor's Tomb", скрипты работают нормально до перехода на другой уровень. Если отключить перед переходом читы, а потом включить после загрузки уровня аобскан отрабатывает нормально, т.е. нет смысла удлинять цепочку байт . А если не отключать, то чит не выключается (остаётся активным), но не работает. Если выйти в меню игры чит отключиться, загрузить снова уровень и снова будет норм работать до перехода на следующий уровень. Игра при этом не глючит и не вылетает, просто перестают работать скрипты после загрузки следующего уровня. Версия игры - v 1.01 ,  репак от "Механиков"

Вот скрипты (может кому и так пригодятся?

Спойлер

Inf.Health

{ Game   : indy.exe
}

[ENABLE]

aobscan(InfHealth,D5 85 C0 74 1B D9 80 84 00 00 00) // should be unique
alloc(newmem,$1000)


label(return)

newmem://600 fl ;
  fld dword ptr [eax+00000088]
  fst dword ptr [eax+00000084]
  jmp return

InfHealth+05:
  jmp newmem
  nop
return:
registersymbol(InfHealth)

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

unregistersymbol(InfHealth)
dealloc(newmem)

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

"G_Indy.sgl"+AFA1A: 56                       -  push esi
"G_Indy.sgl"+AFA1B: 57                       -  push edi
"G_Indy.sgl"+AFA1C: 8B F1                    -  mov esi,ecx
"G_Indy.sgl"+AFA1E: FF D5                    -  call ebp
"G_Indy.sgl"+AFA20: 8B F8                    -  mov edi,eax
"G_Indy.sgl"+AFA22: 85 FF                    -  test edi,edi
"G_Indy.sgl"+AFA24: 0F 84 A0 02 00 00        -  je G_Indy.sgl+AFCCA
"G_Indy.sgl"+AFA2A: FF D5                    -  call ebp
"G_Indy.sgl"+AFA2C: 85 C0                    -  test eax,eax
"G_Indy.sgl"+AFA2E: 74 1B                    -  je G_Indy.sgl+AFA4B
// ---------- INJECTING HERE ----------
"G_Indy.sgl"+AFA30: D9 80 84 00 00 00        -  fld dword ptr [eax+00000084]
// ---------- DONE INJECTING  ----------
"G_Indy.sgl"+AFA36: D8 B0 88 00 00 00        -  fdiv dword ptr [eax+00000088]
"G_Indy.sgl"+AFA3C: D8 15 5C F3 4B 08        -  fcom dword ptr [G_Indy.sgl+17F35C]
"G_Indy.sgl"+AFA42: DF E0                    -  fnstsw ax
"G_Indy.sgl"+AFA44: F6 C4 05                 -  test ah,05
"G_Indy.sgl"+AFA47: 7A 3B                    -  jp G_Indy.sgl+AFA84
"G_Indy.sgl"+AFA49: DD D8                    -  fstp st(0)
"G_Indy.sgl"+AFA4B: D9 05 5C F3 4B 08        -  fld dword ptr [G_Indy.sgl+17F35C]
"G_Indy.sgl"+AFA51: D9 56 18                 -  fst dword ptr [esi+18]
"G_Indy.sgl"+AFA54: D9 C0                    -  fld st(0)
"G_Indy.sgl"+AFA56: D8 66 1C                 -  fsub dword ptr [esi+1C]
}

Inf.Oxigen

{ Game   : indy.exe
}

[ENABLE]

aobscan(Oxig,D9 80 C4 04 00 00) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
fld dword ptr [eax+000004C8]
fst dword ptr [eax+000004C4]

code:

  jmp return

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

[DISABLE]
Oxig:
  db D9 80 C4 04 00 00

unregistersymbol(Oxig)
dealloc(newmem)

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

"G_Indy.sgl"+B0468: 83 C4 10                 -  add esp,10
"G_Indy.sgl"+B046B: C3                       -  ret
"G_Indy.sgl"+B046C: 90                       -  nop
"G_Indy.sgl"+B046D: 90                       -  nop
"G_Indy.sgl"+B046E: 90                       -  nop
"G_Indy.sgl"+B046F: 90                       -  nop
"G_Indy.sgl"+B0470: 83 EC 14                 -  sub esp,14
"G_Indy.sgl"+B0473: 56                       -  push esi
"G_Indy.sgl"+B0474: 8B F1                    -  mov esi,ecx
"G_Indy.sgl"+B0476: FF 15 E4 D2 2F 0F        -  call dword ptr [G_Indy.sgl+17D2E4]
// ---------- INJECTING HERE ----------
"G_Indy.sgl"+B047C: D9 80 C4 04 00 00        -  fld dword ptr [eax+000004C4]
// ---------- DONE INJECTING  ----------
"G_Indy.sgl"+B0482: D8 B0 C8 04 00 00        -  fdiv dword ptr [eax+000004C8]
"G_Indy.sgl"+B0488: 8A 46 2C                 -  mov al,[esi+2C]
"G_Indy.sgl"+B048B: 8D 54 24 0C              -  lea edx,[esp+0C]
"G_Indy.sgl"+B048F: 52                       -  push edx
"G_Indy.sgl"+B0490: 68 00 00 80 3F           -  push 3F800000
"G_Indy.sgl"+B0495: 84 C0                    -  test al,al
"G_Indy.sgl"+B0497: C7 44 24 1C 00 00 80 3F  -  mov [esp+1C],3F800000
"G_Indy.sgl"+B049F: C7 44 24 18 00 00 80 3F  -  mov [esp+18],3F800000
"G_Indy.sgl"+B04A7: C7 44 24 14 00 00 80 3F  -  mov [esp+14],3F800000
"G_Indy.sgl"+B04AF: 6A 00                    -  push 00
}

NoReload

{ Game   : indy.exe
}

[ENABLE]

aobscan(InfAmmo,8B 81 E4 0F 00 00 89) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
 push [ecx+00000FE8]
 pop [ecx+00000FE4]
code:
  mov eax,[ecx+00000FE4]
  jmp return

InfAmmo:
  jmp newmem
  nop
return:
registersymbol(InfAmmo)

[DISABLE]
InfAmmo:
  db 8B 81 E4 0F 00 00

unregistersymbol(InfAmmo)
dealloc(newmem)

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

"G_Indy.sgl"+5A427: 90                 -  nop 
"G_Indy.sgl"+5A428: 90                 -  nop 
"G_Indy.sgl"+5A429: 90                 -  nop 
"G_Indy.sgl"+5A42A: 90                 -  nop 
"G_Indy.sgl"+5A42B: 90                 -  nop 
"G_Indy.sgl"+5A42C: 90                 -  nop 
"G_Indy.sgl"+5A42D: 90                 -  nop 
"G_Indy.sgl"+5A42E: 90                 -  nop 
"G_Indy.sgl"+5A42F: 90                 -  nop 
"G_Indy.sgl"+5A430: 8B 54 24 04        -  mov edx,[esp+04]
// ---------- INJECTING HERE ----------
"G_Indy.sgl"+5A434: 8B 81 E4 0F 00 00  -  mov eax,[ecx+00000FE4]
// ---------- DONE INJECTING  ----------
"G_Indy.sgl"+5A43A: 89 02              -  mov [edx],eax
"G_Indy.sgl"+5A43C: 8B 81 E8 0F 00 00  -  mov eax,[ecx+00000FE8]
"G_Indy.sgl"+5A442: 8B 4C 24 08        -  mov ecx,[esp+08]
"G_Indy.sgl"+5A446: 89 01              -  mov [ecx],eax
"G_Indy.sgl"+5A448: B0 01              -  mov al,01
"G_Indy.sgl"+5A44A: C2 08 00           -  ret 0008
"G_Indy.sgl"+5A44D: 90                 -  nop 
"G_Indy.sgl"+5A44E: 90                 -  nop 
"G_Indy.sgl"+5A44F: 90                 -  nop 
"G_Indy.sgl"+5A450: 56                 -  push esi
}


OneHitKill

{ Game   : indy.exe
}

[ENABLE]
 
aobscan(OHK,00 D8 86 84 00 00 00) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem://2 enem ; 1 Pers ;
  cmp [esi+00000054],#2
  jne code
  fsub dword ptr [esi+00000088]

code:
  fadd dword ptr [esi+00000084]
  jmp return

OHK+01:
  jmp newmem
  nop
return:
registersymbol(OHK)

[DISABLE]
OHK+01:
  db D8 86 84 00 00 00

unregistersymbol(OHK)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "GCore.dll"+14AEEE

"GCore.dll"+14AECC: 74 09                          -  je GCore.dll+14AED7
"GCore.dll"+14AECE: E8 9D 1F EF FF                 -  call GCore.dll+3CE70
"GCore.dll"+14AED3: 3B C6                          -  cmp eax,esi
"GCore.dll"+14AED5: 74 55                          -  je GCore.dll+14AF2C
"GCore.dll"+14AED7: 8B 8E 94 04 00 00              -  mov ecx,[esi+00000494]
"GCore.dll"+14AEDD: 8B 06                          -  mov eax,[esi]
"GCore.dll"+14AEDF: D9 44 24 0C                    -  fld dword ptr [esp+0C]
"GCore.dll"+14AEE3: 8B 51 1C                       -  mov edx,[ecx+1C]
"GCore.dll"+14AEE6: 8B CE                          -  mov ecx,esi
"GCore.dll"+14AEE8: D8 8A 88 00 00 00              -  fmul dword ptr [edx+00000088]
// ---------- INJECTING HERE ----------
"GCore.dll"+14AEEE: D8 86 84 00 00 00              -  fadd dword ptr [esi+00000084]
// ---------- DONE INJECTING  ----------
"GCore.dll"+14AEF4: D9 9E 84 00 00 00              -  fstp dword ptr [esi+00000084]
"GCore.dll"+14AEFA: FF 90 10 06 00 00              -  call dword ptr [eax+00000610]
"GCore.dll"+14AF00: 85 C0                          -  test eax,eax
"GCore.dll"+14AF02: 74 28                          -  je GCore.dll+14AF2C
"GCore.dll"+14AF04: 8B 16                          -  mov edx,[esi]
"GCore.dll"+14AF06: 53                             -  push ebx
"GCore.dll"+14AF07: 8B CE                          -  mov ecx,esi
"GCore.dll"+14AF09: FF 92 14 06 00 00              -  call dword ptr [edx+00000614]
"GCore.dll"+14AF0F: 8B F8                          -  mov edi,eax
"GCore.dll"+14AF11: 8B 86 40 04 00 00              -  mov eax,[esi+00000440]
}

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

{ Game   : indy.exe
}

[ENABLE]
 
aobscan(Vagon,D9 9E 84 00 00 00 74) // should be unique
alloc(newmem,$1000)


label(return)

newmem://10000 fl; ebx ;edx ; 54 = 2 ;58 = 3
  fld dword ptr [esi+00000088]
  fstp dword ptr [esi+00000084]

  jmp return

Vagon:
  jmp newmem
  nop
return:
registersymbol(Vagon)

[DISABLE]
Vagon:
  db D9 9E 84 00 00 00

unregistersymbol(Vagon)
dealloc(newmem)

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

"G_Indy.sgl"+C141D: D9 05 58 F3 40 0F        -  fld dword ptr [G_Indy.sgl+17F358]
"G_Indy.sgl"+C1423: D8 4C 24 10              -  fmul dword ptr [esp+10]
"G_Indy.sgl"+C1427: D9 5C 24 10              -  fstp dword ptr [esp+10]
"G_Indy.sgl"+C142B: D9 86 84 00 00 00        -  fld dword ptr [esi+00000084]
"G_Indy.sgl"+C1431: D8 64 24 10              -  fsub dword ptr [esp+10]
"G_Indy.sgl"+C1435: 8B 8E 88 02 00 00        -  mov ecx,[esi+00000288]
"G_Indy.sgl"+C143B: 8B 86 80 02 00 00        -  mov eax,[esi+00000280]
"G_Indy.sgl"+C1441: 41                       -  inc ecx
"G_Indy.sgl"+C1442: 3B C3                    -  cmp eax,ebx
"G_Indy.sgl"+C1444: 89 8E 88 02 00 00        -  mov [esi+00000288],ecx
// ---------- INJECTING HERE ----------
"G_Indy.sgl"+C144A: D9 9E 84 00 00 00        -  fstp dword ptr [esi+00000084]
// ---------- DONE INJECTING  ----------
"G_Indy.sgl"+C1450: 74 72                    -  je G_Indy.sgl+C14C4
"G_Indy.sgl"+C1452: 8B 16                    -  mov edx,[esi]
"G_Indy.sgl"+C1454: 8B CE                    -  mov ecx,esi
"G_Indy.sgl"+C1456: C7 44 24 14 06 00 00 00  -  mov [esp+14],00000006
"G_Indy.sgl"+C145E: 89 9C 24 84 00 00 00     -  mov [esp+00000084],ebx
"G_Indy.sgl"+C1465: 88 5C 24 54              -  mov [esp+54],bl
"G_Indy.sgl"+C1469: C7 44 24 48 00 00 00 00  -  mov [esp+48],00000000
"G_Indy.sgl"+C1471: C7 44 24 4C 00 00 00 00  -  mov [esp+4C],00000000
"G_Indy.sgl"+C1479: C7 44 24 50 00 00 00 00  -  mov [esp+50],00000000
"G_Indy.sgl"+C1481: FF 92 54 02 00 00        -  call dword ptr [edx+00000254]
}

 

Думаю должно быть решение подобной проблемы?!:)

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

Три года на форуме, а тему создал не в том разделе. Закрываю.

@Xipho

// Руслан, открыл тему, чтобы не переносить из старой в новую тему скрипты. Garik66

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

  • Xipho закрыл тема
  • Garik66 открыл тема
1 час назад, SerVick сказал:

Думаю должно быть решение подобной проблемы?!:)

А какой именно из скриптов не выключается? Не проверял?

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

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

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

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

Каким-то образом сигна не отрабатывает.

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

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

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

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

восстанавливать их состояние.

Т.е. только через костыль?

Тыды проще повесить все на одну ГК и в инструкции пользователям написать выкл/вкл

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

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

Т.е. только через костыль?

Ну не сказал бы что это костыль, все делается автоматически и пользователь этого не замечает.

 

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

Тыды проще повесить все на одну ГК и в инструкции пользователям написать выкл/вкл

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

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

Ну не сказал бы что это костыль, все делается автоматически и пользователь этого не замечает.

Согласен. Но стоит ли это затрат времени. Нужно проверить какие скрипты были активированы при переходе на следуюший уровень и потом именно их активировать. Мне например точно лень.
Не ну, если кто зарабатывает на скриптах, то конечно. 

 

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

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

, плюс я могу забыть про это.?

Согласен, что забываешь отключить, или просто поторопишься. Т.к. для перехода на другой уровень подтверждения не требуется в этой игре. Да и опять же, если не играл, как знать где переход на другой уровень?!

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

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

Согласен, что забываешь отключить, или просто поторопишься. Т.к. для перехода на другой уровень подтверждения не требуется в этой игре. Да и опять же, если не играл, как знать где переход на другой уровень?!

Ну тогда - искать тригер, думаю тебе будет сложновато это.

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

Или найти ID локаций к примеру, но от сюда уже не далеко и до тригера про который писал @partoftheworlD 

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

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

Ну тогда - искать тригер, думаю тебе будет сложновато это.

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

 

 

Как вариант, пойти на форум спидранеров и найти авто-сплитер, они как раз таки основываются на состоянии игры, если повезет, то в авто-сплитере будет прописана сигнатура с этим адресом.

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

7 часов назад, Garik66 сказал:

думаю тебе будет сложновато это.

Да правильно, сложновато. Вот как пример найти тригер. Ладно про тригер я почитать могу, но с ним потом делать вы вот к примеру в приведённых скриптах можете пример как должно выглядеть сие. Что скажем нашёл я 1/0 (после загрузки уровня я так думаю этот адрес не должен меняться?) и что мне с этим делать?! Не обязательно чтоб работал  скрипт (просто пример как должно писаться в скрипте) какой выберите из тех, что я закинул. И по поводу тригера..., поиск неизвестного - это понятно, но как и от чего отталкиваться, вернее не до конца понимаю, что такое -тригер и с чем его "едят"? Кстати время не ведётся в игре, или по крайней -мере не выводится на экран(игра на другом компе, сейчас установлю сюда и точно напишу).  В общем можно написать последовательно, что мне нужно сделать по шагам?!

К примеру:

Шаг 1) Поиск неизвестного (от чего отталкиваться, и что искать)

Шаг 2) ????? и т.д..

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

P.S. Учёт времени, количество убитых противников и т.д. не ведётся. Если, только где -то в скрытых параметрах игры. В общем нигде подобная информации нет включая меню игры.

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

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

и что мне с этим делать?


Добавить в отдельный скрипт как проверку, если значение равно 0, то сохранить состояние скриптов в CE(какие включены), если значение равно 1, то записать состояние скриптов из памяти. И добавить таймер на этот скрипт, чтобы он проверял состояние каждые 100 мс.

 

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

что такое -тригер и с чем его "едят"? 

триггер это флаг указывающий, что произошло то или иное действие в игре

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

С тригером ясно,  Вот как сие искать, от чего отталкиваться. Понятно, что обычно байт 1/0. Но по какому принципу подобное ищется, можно как неизвестное -это понятно, главное понимать -что ищешь и как это работает, тогда и с поисками можно "мудрить". И естественно куда - это вписывать в каждую функцию, или можно отдельно на все функции как -то сделать?!

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

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

или можно отдельно на все функции как -то сделать?!

Короче суть такова:

Тебе нужно найти какое отличие м/у уровнями. Как вариант я тебе предложил по координатам сделать. Если в игре уровней не много, то по конкретным координатам или по порталам перехода.

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

По Авто-Отключению/Авто-Включению скриптов было несколько тем. Скрипт пишется на LUA.

Тоже самое и с тригером, но как на него выходить поиском я не знаю, а реверсить игровой код довольно сложно.

 

ЗЫ: да и сомневаюсь что кто-то будет это делать, так что придется самому тебе покопаться и поизучать игру.

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

 

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

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

Garik66, благодарю! В том то и дело, что мне самому хочется понять и сделать,  а иначе зачем было тему открывать?! Можно было бы тогда попросить кого -то. Вот уже есть над чем работать и в каком направлении двигаться понятно. В общем надо темы про авто -включение читать...:) А с поиском думаю разберусь.

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

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

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

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