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

[Sacred 2] Особенности взлома.


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

Для Sacred 2 v.2.65.2 есть готовая таблица от Recifense с форума СЕ с нужной мне опцией GodMode. Ещё пробую сделать на эту игру телепорт по курсору. Проблема в том, что игра состоит из двух процессов - s2gs.exe и sacred2.exe. Таблица с режимом GodMode подсоединяется с процессу s2gs.exe и работает с ним, а реальные координаты персонажа находятся в процессе sacred2.exe. Что можно сделать, чтобы работало одновременно и то и другое? Версия СЕ 6.7.

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

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

А какой из exe кушает больше оперативки?

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

Не знаю не знаю.. У меня ничего подобного не было.
Скорее всего первое лаунчер второе уже игра. Смотри кто больше жрет то и нужный процесс.
Попробуй кстати вот это я когда играл делал себе трейнер тп по метке на карте ссылка
За качество не ручаюсь ибо делал когда не особо разбирался.
Если не будет ТПшиться попробуй в окно игру сделать.


Если найду таблицу скину.

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

Just now, Garik66 said:

А какой из exe кушает больше оперативки?

 

Больше оперативки у sacred2.exe, примерно на порядок. С него же и запускается игра через ярлык.
Если нужно, вот ссылка на таблицу Recifense и её описание:
http://fearlessrevolution.com/viewtopic.php?t=654
Таблица реально работает.

 

 

Just now, what228 said:

Попробуй кстати вот это

 

Just now, what228 said:

Вот нашел.

 

Большое спасибо, попробую.

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

Just now, what228 said:

Но не помню на какую версию.

 

Проверил. К сожалению, видимо, версия не совпадает - работает только скорость, остальное при активации вылетает с ошибкой или виснет. В любом случае спасибо за помощь.

 

 

Just now, Garik66 said:

Вот на него и нужно делать ГодМод.

 

У меня не получилось. Находится экранное значение и ещё какие-то, пробовал искать и шифрованные тоже, но что нашёл - не подходят. Зато у Recifense таблица реально работает, но именно с процессом s2gs.exe. Думаю, не зря же он так сделал. В таблице what228 годмода тоже нет.

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

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

У меня не получилось. Находится экранное значение и ещё какие-то, пробовал искать и шифрованные тоже, но что нашёл - не подходят. Зато у Recifense таблица реально работает, но именно с процессом s2gs.exe. Думаю, не зря же он так сделал. В таблице what228 годмода тоже нет.

Если будет время я скачаю и посмотрю игру. Если конечно ты раньше не сделаешь :) 
"Sacred 2 (2010) [Ru/En] (2.65.2/2dlc) Repack R.G. Механики [Gold Edition]" вот этот ( nnmclub... )

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

Попробовал решение проблемы в лоб. Идея так себе, но лучшего пока не придумалось. Запустил два СЕ, один прицепил к одному процессу, другой к другому, на одном СЕ активировал годмод, на другом самодельный телепорт по курсору. Работает одновременно, но плохо, игра подвисает и подтормаживает. Может быть ещё и сам телепорт получился корявый, не уверен, что сделал как надо.
Интересно, можно ли, запустив только один СЕ и подсоединившись к одному процессу, как-нибудь "перейти" к другому? В игре ведь оба процесса как-то "общаются" между собой, может и через СЕ есть способ работать сразу с двумя?

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

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

как-то "общаются" между собой


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

 

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

может и через СЕ есть способ работать сразу с двумя?


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

 

Как вариант, я несу чушь из-за нескольких дней без сна.:D

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

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

самодельный телепорт по курсору.

Вот по быстрому сейчас набросал:

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

[ENABLE]
aobscanmodule(INJECT,s2core.dll,89 50 0C 8B 51 04 89 50 10 8B 49 08 89 48 14 C2 04 00 CC CC CC 8B 54) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
registersymbol(INJECT)
label(cursorcoordsaver)
label(curMapID)
label(curMapID2)
label(curX)
label(curY)
label(curZ)
label(TeleportChecker)
registersymbol(curMapID)
registersymbol(curMapID2)
registersymbol(curX)
registersymbol(curY)
registersymbol(curZ)
registersymbol(TeleportChecker)

newmem:
curMapID:
  dd 0
curMapID2:
  dd 0
curX:
  dd 0
curY:
  dd 0
curZ:
  dd 0
TeleportChecker:
  dd 0

cursorcoordsaver:
  cmp [TeleportChecker],0
  je code
  cmp esi,01
  jne code
  push [eax]
  pop [curMapID]
  push [eax+04]
  pop [curMapID2]
  push [eax+0C]
  pop [curX]
  push [eax+10]
  pop [curY]
  push [eax+14]
  pop [curZ]
  mov [eax+0C],edx
  mov edx,[ecx+04]
  jmp return

code:
  mov [eax+0C],edx
  mov edx,[ecx+04]
  jmp return

INJECT:
  jmp cursorcoordsaver
  nop
return:

[DISABLE]

INJECT:
  db 89 50 0C 8B 51 04

unregistersymbol(INJECT)
//-----------------------
unregistersymbol(curMapID)
unregistersymbol(curMapID2)
unregistersymbol(curX)
unregistersymbol(curY)
unregistersymbol(curZ)
unregistersymbol(TeleportChecker)
//-----------------------
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "s2core.dll"+9B60B

"s2core.dll"+9B5F0: 8B C1           -  mov eax,ecx
"s2core.dll"+9B5F2: 8B 4C 24 04     -  mov ecx,[esp+04]
"s2core.dll"+9B5F6: 8B 11           -  mov edx,[ecx]
"s2core.dll"+9B5F8: 89 10           -  mov [eax],edx
"s2core.dll"+9B5FA: 8B 51 04        -  mov edx,[ecx+04]
"s2core.dll"+9B5FD: 89 50 04        -  mov [eax+04],edx
"s2core.dll"+9B600: 8B 51 08        -  mov edx,[ecx+08]
"s2core.dll"+9B603: 83 C1 0C        -  add ecx,0C
"s2core.dll"+9B606: 89 50 08        -  mov [eax+08],edx
"s2core.dll"+9B609: 8B 11           -  mov edx,[ecx]
// ---------- INJECTING HERE ----------
"s2core.dll"+9B60B: 89 50 0C        -  mov [eax+0C],edx
"s2core.dll"+9B60E: 8B 51 04        -  mov edx,[ecx+04]
// ---------- DONE INJECTING  ----------
"s2core.dll"+9B611: 89 50 10        -  mov [eax+10],edx
"s2core.dll"+9B614: 8B 49 08        -  mov ecx,[ecx+08]
"s2core.dll"+9B617: 89 48 14        -  mov [eax+14],ecx
"s2core.dll"+9B61A: C2 04 00        -  ret 0004
"s2core.dll"+9B61D: CC              -  int 3 
"s2core.dll"+9B61E: CC              -  int 3 
"s2core.dll"+9B61F: CC              -  int 3 
"s2core.dll"+9B620: 8B 54 24 04     -  mov edx,[esp+04]
"s2core.dll"+9B624: D9 42 0C        -  fld dword ptr [edx+0C]
"s2core.dll"+9B627: D9 41 0C        -  fld dword ptr [ecx+0C]
}

 

----------------

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

[ENABLE]
aobscan(INJECT0,D9 41 0C D8 60 0C 8B 11 2B 10 89 54 24 08)
alloc(newmem,$1000,s2core.cWorldPosition::getAbsDistanceTo2DSquare+5)
label(code)
label(return)
registersymbol(INJECT0)

newmem:
  cmp [TeleportChecker],0
  je code
  cmp [curX],0
  je code
  push [curMapID]
  pop [ecx]
  push [curMapID2]
  pop [ecx+04]
  push [curX]
  pop [ecx+0C]
  push [curY]
  pop [ecx+10]
  push [curZ]
  pop [ecx+14]
  mov [TeleportChecker],0

code:
  fld dword ptr [ecx+0C]
  fsub dword ptr [eax+0C]
  jmp return

INJECT0:
  jmp newmem
  nop
return:

[DISABLE]
INJECT0:
  db D9 41 0C D8 60 0C

unregistersymbol(INJECT0)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: s2core.cWorldPosition::getAbsDistanceTo2DSquare+5

s2core.cWorldPosition::getAbsDistanceTo2D+6A: F3 0F51 C0                       - sqrtss xmm0,xmm0
s2core.cWorldPosition::getAbsDistanceTo2D+6E: F3 0F11 44 24 10                 - movss [esp+10],xmm0
s2core.cWorldPosition::getAbsDistanceTo2D+74: D9 44 24 10                      - fld dword ptr [esp+10]
s2core.cWorldPosition::getAbsDistanceTo2D+78: 8B E5                            - mov esp,ebp
s2core.cWorldPosition::getAbsDistanceTo2D+7A: 5D                               - pop ebp
s2core.cWorldPosition::getAbsDistanceTo2D+7B: C2 0400                          - ret 0004
s2core.cWorldPosition::getAbsDistanceTo2D+7E: CC                               - int 3 
s2core.cWorldPosition::getAbsDistanceTo2D+7F: CC                               - int 3 
s2core.cWorldPosition::getAbsDistanceTo2DSquare: 51                               - push ecx
s2core.cWorldPosition::getAbsDistanceTo2DSquare+1: 8B 44 24 08                      - mov eax,[esp+08]
// ---------- INJECTING HERE -----------
s2core.cWorldPosition::getAbsDistanceTo2DSquare+5: D9 41 0C                         - fld dword ptr [ecx+0C]
// ---------- DONE INJECTING  ----------
s2core.cWorldPosition::getAbsDistanceTo2DSquare+8: D8 60 0C                         - fsub dword ptr [eax+0C]
s2core.cWorldPosition::getAbsDistanceTo2DSquare+B: 8B 11                            - mov edx,[ecx]
s2core.cWorldPosition::getAbsDistanceTo2DSquare+D: 2B 10                            - sub edx,[eax]
s2core.cWorldPosition::getAbsDistanceTo2DSquare+F: 89 54 24 08                      - mov [esp+08],edx
s2core.cWorldPosition::getAbsDistanceTo2DSquare+13: DB 44 24 08                      - fild dword ptr [esp+08]
s2core.cWorldPosition::getAbsDistanceTo2DSquare+17: 8B 51 04                         - mov edx,[ecx+04]
s2core.cWorldPosition::getAbsDistanceTo2DSquare+1A: DD 05 408EAF01                   - fld qword ptr [01AF8E40]
s2core.cWorldPosition::getAbsDistanceTo2DSquare+20: 2B 50 04                         - sub edx,[eax+04]
s2core.cWorldPosition::getAbsDistanceTo2DSquare+23: DCC9                             - fmul st(1),st(0)
s2core.cWorldPosition::getAbsDistanceTo2DSquare+25: 89 54 24 08                      - mov [esp+08],edx
}

 

Но удивляет одно что при смене локации адрес который работал с курсором больше с ним не работал :(
( Сначала первый скрипт потом второй. Не объединял т.к. нету времени уж простите :( )
 

 

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

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

Скорее всего ты взял лишь координаты а ID локаций не брал. У меня в скрипте это curMapID curMapID2.



P.S. сейчас спать охота по этому если завтра найду время доделаю и еще God Mode сделаю.

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

17 hours ago, what228 said:

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

 

Странно. У меня адреса координат курсора вообще оказались "зелёными" - статическими.

 

17 hours ago, what228 said:

Скорее всего ты взял лишь координаты а ID локаций не брал.

 

Не, про это я знаю, ID тоже взял, с этим я ещё в TQ столкнулся.

Вот мой скрипт телепорта, срабатывает по * на цифр. клавиатуре:

Spoiler

[ENABLE]
aobscanmodule(INJECT,s2core.dll,8B 50 04 89 4C 24 18 8B 48 08 89 54 24 1C 8B 50)
alloc(newmem,$1000)

label(code)
label(return)
label(_teleport)
registersymbol(INJECT)

newmem:

_teleport:
    pushad
    push 6A 
    call GetAsyncKeyState 
    shr ax,#15
    test ax,ax
    popad
    jz code
  fld dword ptr [006ABE40]
  fstp dword ptr [eax+04]
  fld dword ptr [006ABE48]
  fstp dword ptr [eax+0C]
  fld dword ptr [006ABE4C]
  fstp dword ptr [eax+10]
  fld dword ptr [006ABE50]
  fstp dword ptr [eax+14]
  jmp code

code:
  mov edx,[eax+04]
  mov [esp+18],ecx
  jmp return

INJECT:
  jmp newmem
  nop
  nop

return:

[DISABLE]
INJECT:
  db 8B 50 04 89 4C 24 18 8B 48 08 89 54 24 1C 8B 50

unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "s2core.dll"+A563D

"s2core.dll"+A5613: 8D 4C 24 44           -  lea ecx,[esp+44]
"s2core.dll"+A5617: E8 34 C0 FF FF        -  call s2core.dll+A1650
"s2core.dll"+A561C: 8D 4C 24 5C           -  lea ecx,[esp+5C]
"s2core.dll"+A5620: E8 2B C0 FF FF        -  call s2core.dll+A1650
"s2core.dll"+A5625: 6A 01                 -  push 01
"s2core.dll"+A5627: 8D 8C 24 94 00 00 00  -  lea ecx,[esp+00000094]
"s2core.dll"+A562E: FF 15 FC 53 D3 00     -  call dword ptr [s2core.dll+F53FC]
"s2core.dll"+A5634: 8B CE                 -  mov ecx,esi
"s2core.dll"+A5636: E8 75 BB FF FF        -  call s2core.dll+A11B0
"s2core.dll"+A563B: 8B 08                 -  mov ecx,[eax]
// ---------- INJECTING HERE ----------
"s2core.dll"+A563D: 8B 50 04              -  mov edx,[eax+04]
"s2core.dll"+A5640: 89 4C 24 18           -  mov [esp+18],ecx
// ---------- DONE INJECTING  ----------
"s2core.dll"+A5644: 8B 48 08              -  mov ecx,[eax+08]
"s2core.dll"+A5647: 89 54 24 1C           -  mov [esp+1C],edx
"s2core.dll"+A564B: 8B 50 0C              -  mov edx,[eax+0C]
"s2core.dll"+A564E: 89 4C 24 20           -  mov [esp+20],ecx
"s2core.dll"+A5652: 8B 48 10              -  mov ecx,[eax+10]
"s2core.dll"+A5655: 89 54 24 24           -  mov [esp+24],edx
"s2core.dll"+A5659: 8B 50 14              -  mov edx,[eax+14]
"s2core.dll"+A565C: 8B 06                 -  mov eax,[esi]
"s2core.dll"+A565E: 89 4C 24 28           -  mov [esp+28],ecx
"s2core.dll"+A5662: 6A 01                 -  push 01
}

 

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

 

17 hours ago, what228 said:

если завтра найду время доделаю и еще God Mode сделаю.

 

Спасибо. Кстати, у Recifense всё-таки не совсем GM, хотя и назван так. С одного суперудара герой вроде бы выживает, но если враги его быстро лупят всей толпой, то может помереть.

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

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

Странно. У меня адреса координат курсора вообще оказались "зелёными" - статическими.

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

 

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

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

 

Проверка на одинарное нажатие решит эту проблему.

 

    pushad
    push 6A 
    call GetAsyncKeyState 
    test al,1
    popad
    jz code

на C будет выглядеть как if(GetAsyncKeyState(0x6A) & 1)

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

37 минут назад, Foxhound сказал:

Странно. У меня адреса координат курсора вообще оказались "зелёными" - статическими.

Инструкция* имел ввиду.
 

 

Бессмертие там непонятное но: видимо дамаг полученный где-то суммируется и если превысил кол-во хп то игрок умирает и не важно сколько у тебя сейчас хп.

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

Just now, partoftheworlD said:

Проверка на одинарное нажатие решит эту проблему.

 

Да, это было бы хорошо.

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

 

 

Just now, what228 said:

Инструкция* имел ввиду.

 

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

 

Just now, what228 said:

Бессмертие там непонятное но: видимо дамаг полученный где-то суммируется и если превысил кол-во хп то игрок умирает и не важно сколько у тебя сейчас хп.

 

Тогда может хотя бы "беск. ХП" получится сделать? В смысле, текущее хп всегда = мах хп. Или даже, если игра не взбунтуется, вообще сделать его 999999, чтобы хп точно не было меньше полученного дамага.

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

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

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

Использовать флаги.

 

 

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

Не получилось,

 

Хм странно. У меня в скриптах работает:

push 60    
call GetAsyncKeyState 
test al, 1
jz   Reset

 

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

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

Тогда может хотя бы "беск. ХП" получится сделать?

Как раз трейнер от Refi... так и работает записывает макс хп но как ты видел ты умираешь все ровно :)
 

 

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

Может тогда мой скрипт имеет смысл как-нибудь допилить, чтобы нормально работал? Что посоветуешь?

Не знаю ты опробуй для начала. Bот другой скрипт /del . В виде фильтра юзал регистры не знаю будет работать у тебя иль нет но ты провеь ^_^


Последовательность активации:
1. CursorCoords - координаты курсора

2. MarkCoords - координаты точки на карте

3. MarkChecker - проверка стоит точка иль нет

4. MyCoords - заменяет мои на сохраненные координаты
Ну а клавиши написаны.

Не объединял и не упрощал т.к. не было нужды в этом.

 

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

Just now, what228 said:

ты опробуй для начала. Bот другой скрипт

 

Эммм... Поясни пожалуйста, как им пользоваться? В таблице есть скрипт "Teleport on Waypoint", я его активирую, а дальше? К скрипту телепорта прикреплён пункт "Activate", но никаких хоткеев на него не назначено. Пробовал его менять на 1, ничего не происходит, а потом игра крашится и, что странно, СЕ тоже.

Скрипт вакуум работает забавно - все окружающие персы, коровы и т.д. собираются в точке моего героя, пытаются куда-то уйти и втягиваются обратно. :) Это так и задумано?

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

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

Эммм...

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

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

Just now, what228 said:

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

 

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

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

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

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

Вот так выглядит
dasasddddddddddddddddd222222222222.png

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

Just now, what228 said:

Вот так выглядит

 

О как! Не, из вложения твоего поста скачивается совсем не такая таблица, там этого нет. Я уже раз 5-6 скачивал. Точный размер скачиваемого файла: 26206. Может я сам чего туплю, но я правда не понимаю, в чём дело.

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

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

таблица

Хм.. не знаю попробуй еще раз вот!
sacred2.CT

P.S. я скидывал старую таблицу из бэкапов :D 

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

Just now, what228 said:

попробуй еще раз вот!

 

Во, совсем другое дело. :)

Попробовал.

Телепорт по курсору работает, ура.

По метке по карте - не работает, или может я сам неправильно что-то делаю. Открываю карту, втыкаю "булавку" в доступное место, потом жму Alt+B. Пробовал нажимать и прямо на карте и в игре.  В пункте "Activate" появляется 1 и сменяется на 0, но герой остаётся на месте. Вообще же такой телепорт реализовать было бы очень круто, а то дико надоедает бегать туда-сюда.

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

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

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

  cmp byte ptr [markchecker],#127
  je precode

Удали эти строки из MyCoords и не включай MarkChecker скорее всего из-за него а если все равно не тпшит то фильтры надо другие.

MarkChecker нужен чтоб когда точки не стоит сохраненные координаты обнулялись.

Его во все можно не использовать и сделать более простым скрипт но мне было лень :).

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

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

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

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