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

[Salt and Sanctuary] Взлом Фокуса


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

Здравствуйте! Использую Cheat Engine 6.7 для взлома параметров персонажа в игре Salt and Sanctuary. Хочу найти адрес с  числом например: 39.8 (значение параметра Фокус). Выставляю: найти точное значение, Float. Он находит, а потом изменяю параметр в игре и пишу его в Cheat Engine и жму отсеить, но ничего не выходит и ппрограмма показывает 0 адресов. Пробовал найти его и через неизвестное число. При этом другие параметры (здоровье, запас сил) найти могу и быстро, а нужного мне просто нет! Помогите пожалуйста со взломом)

 

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

Попробуй искать диапазоном. Например, в игре у тебя 39.8, ищи диапазон 38-41. Далее значение меняется, допустим, на 26.4, ищешь диапазон  25-28. Тип, конечно же, оставляешь float. Должно получиться.

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

Попробовал искать чисто диапазоном. Либо первый же отсев показывает 0, либо после 2-3 остается порядка 750 адресов и опять ноль.

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

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

При этом другие параметры (здоровье, запас сил) найти могу и быстро

Раз это находишь, то можешь попробовать поискать все адреса именно в структуре игрока при условии, что одна структура содержит и здоровье, и запас сил, к примеру, ограничиваешь поиск по диапазону адресов начиная с адреса начала структуры до адреса начала структуры + 4096 байт, после ищешь неизвестное во всех типах и меняя значения отсеиваешь изменилось/не изменилось и лучше искать в типе 4 байт для 32 битной игры, и 8 байт для 64 битной игры. Ограничивать здесь GvNjzdrQB1k.jpg

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

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

Раз это находишь, то можешь попробовать поискать все адреса именно в структуре игрока при условии, что одна структура содержит и здоровье, и запас сил, к примеру, ограничиваешь поиск по диапазону адресов начиная с адреса начала структуры до адреса начала структуры + 4096 байт, после ищешь неизвестное во всех типах и меняя значения отсеиваешь изменилось/не изменилось и лучше искать в типе 4 байт для 32 битной игры, и 8 байт для 64 битной игры. Ограничивать здесь GvNjzdrQB1k.jpg

Извините пожалуйста) Я тут понял, что мало что понял. А можно по подробнее о том, что вы мне по рекомендовали?

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

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

А можно по подробнее о том, что вы мне по рекомендовали?

Ну в общем посмотри находится здоровье и выносливость по одинаковому базовому адресу, если это так, то ты можешь искать значения не во всей памяти, а лишь в структуре игрока, которая находится по базовому адресу здоровья и выносливости, для того чтобы проверить ставишь брейкпоинт на запись на этих адресах(здоровья и выносливости) и смотришь инструкции которые пишут в этот адрес, обычно они вида mov [esi+0xoffset], eax для целочисленных значений и movss [esi+ 0xoffset], xmm0 для значений с плавающей точкой, если в обоих случаях значение esi одинаковое как в данном примере, то можешь ограничить поиск лишь по структуре игрока, а для этого в Memory Scan Options в строке Start пишешь значение из esi, а в Stop значение, которое посчитаешь в калькуляторе т.е. esi + 0x4096, этого должно хватить чтобы охватить всю структуру игрока.

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

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

Ну в общем посмотри находится здоровье и выносливость по одинаковому базовому адресу, если это так, то ты можешь искать значения не во всей памяти, а лишь в структуре игрока, которая находится по базовому адресу здоровья и выносливости, для того чтобы проверить ставишь брейкпоинт на запись на этих адресах(здоровья и выносливости) и смотришь инструкции которые пишут в этот адрес, обычно они вида mov [esi+0xoffset], eax для целочисленных значений и movss [esi+ 0xoffset], xmm0 для значений с плавающей точкой, если в обоих случаях значение esi одинаковое как в данном примере, то можешь ограничить поиск лишь по структуре игрока, а для этого в Memory Scan Options в строке Start пишешь значение из esi, а в Stop значение которое посчитаешь в калькуляторе т.е. esi + 0x4096, этого должно хватить чтобы охватить всю структуру игрока.

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

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

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

Получи урон

В случае с выносом 3 инструкции [esi+0000008C]. В случае со здоровьем только одна инструкция [edx+60]

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

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

В случае с выносом 3 инструкции [esi+0000008C]. В случае со здоровьем только одна инструкция [edx+60]

Значения у esi и edx равны?

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

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

Тогда мой вариант не поможет, проще будет игру скачать и посмотреть.

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

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

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

Спасибо большое!

VZUONeXvmPE.jpg

 

Ну в общем такие дела тут, пришлось даже вики этой игры читать. 

Фокус рассчитывается как 15 + 5 * Willpower, скрипт ниже  изменяет количество очков силы воли(willpower),  но тут такое дело, что отладчик от CE не воспринимает некоторый код т.к. игра написана на .Net поэтому нельзя определить откуда, что и где делает это значение, но вчитавшись в вики можно узнать, что выносливость зависит от количества силы воли, а значит вооружившись более подходящим отладчиком dnSpy, можно через выносливость выйти на участок кода который рассчитывает фокус, а так же декомплировать весь код игры.

 

Скрипт.

Спойлер

{ Game   : salt.exe
  Version: 
  Date   : 2018-04-30
  Author : Alexander

  This script does blah blah blah
}

[ENABLE]

aobscan(poise,8B 44 82 08 EB 02) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  // eax = 0 Strength
  // eax = 1 Endurance
  // eax = 2 Dexterity
  // eax = 3 Willpower
  // eax = 4 Magic
  // eax = 5 Wisdom
  //
  cmp eax, 3
  jne code
  mov eax,[edx+eax*4+08]
  mov eax, #1337
  jmp ProjectTower.player.PlayerStats::GetEquipAdjustedStat+33
  jmp return
code:
  mov eax,[edx+eax*4+08]
  jmp ProjectTower.player.PlayerStats::GetEquipAdjustedStat+33
  jmp return

poise:
  jmp newmem
  nop
return:
registersymbol(poise)

[DISABLE]

poise:
  db 8B 44 82 08 EB 02

unregistersymbol(poise)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: 115A5E4B

""+115A5E2C: 8B F1                 -  mov esi,ecx
""+115A5E2E: 8B 5D 08              -  mov ebx,[ebp+08]
""+115A5E31: 8B 46 04              -  mov eax,[esi+04]
""+115A5E34: 8B 40 04              -  mov eax,[eax+04]
""+115A5E37: 3B 45 F0              -  cmp eax,[ebp-10]
""+115A5E3A: 7E 15                 -  jle 115A5E51
""+115A5E3C: 8B 45 F0              -  mov eax,[ebp-10]
""+115A5E3F: 8B 56 04              -  mov edx,[esi+04]
""+115A5E42: 3B 42 04              -  cmp eax,[edx+04]
""+115A5E45: 0F 83 45 05 00 00     -  jae 115A6390
// ---------- INJECTING HERE ----------
""+115A5E4B: 8B 44 82 08           -  mov eax,[edx+eax*4+08]
""+115A5E4F: EB 02                 -  jmp 115A5E53
// ---------- DONE INJECTING  ----------
""+115A5E51: 33 C0                 -  xor eax,eax
""+115A5E53: 89 45 EC              -  mov [ebp-14],eax
""+115A5E56: 33 FF                 -  xor edi,edi
""+115A5E58: 85 DB                 -  test ebx,ebx
""+115A5E5A: 74 2B                 -  je 115A5E87
""+115A5E5C: A1 7C 38 0E 06        -  mov eax,[060E387C]
""+115A5E61: 8B 40 04              -  mov eax,[eax+04]
""+115A5E64: 8B 53 0C              -  mov edx,[ebx+0C]
""+115A5E67: 3B 50 04              -  cmp edx,[eax+04]
""+115A5E6A: 0F 83 20 05 00 00     -  jae 115A6390
}

 

 

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

Не претендую на правильный asm код.
Но значение фокуса в игре нашел.

Спойлер

K2K3A2R.png

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

При этих условиях, искать нужно число float(с точкой) 78. Определил опытным путём. Далее увеличилось, уменьшилось по урокам. Горячие клавиши настроены в CE на паузу, увеличилось, уменьшилось.

Одинаковые части в адресах - только буква ЦЭ в конце.

Спойлер

vX9xFNQ.png

2 адреса имеют одинаковое значение(экранное, и реальное). Замораживая поочерёдно можно понять что есть что.
Поставил бряк(f5) на чтение на реальное значение 78. Получил 100500 инструкций. При чём срабатывают и добавляются новые и от простоя в игре, и при прыжке, и при прокате через шифт.

Просто взял самую 1-ю(это не самый лучший вариант) и запилил скрипт(кривой).

Спойлер

{ Game   : salt.exe
  Version: 
  Date   : 2018-04-30
  Author : Admin

  This script does blah blah blah
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

 
 
aobscan(focus,D9 82 8C 00 00 00 D9 C0 DF F2 DD D9 7A) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
mov dword ptr [edx+0000008C],(float)78
code:
  fld dword ptr [edx+0000008C]
  jmp return

focus:
  jmp newmem
  nop
return:
registersymbol(focus)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
focus:
  db D9 82 8C 00 00 00

unregistersymbol(focus)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: 06628569

06628553: DF F2              -  fcomip st(0),st(2)
06628555: DD D9              -  fstp st(1)
06628557: 7B 04              -  jnp 0662855D
06628559: DD D8              -  fstp st(0)
0662855B: EB 09              -  jmp 06628566
0662855D: 72 04              -  jb 06628563
0662855F: DD D8              -  fstp st(0)
06628561: EB 03              -  jmp 06628566
06628563: D9 59 28           -  fstp dword ptr [ecx+28]
06628566: D9 41 30           -  fld dword ptr [ecx+30]
// ---------- INJECTING HERE ----------
06628569: D9 82 8C 00 00 00  -  fld dword ptr [edx+0000008C]
// ---------- DONE INJECTING  ----------
0662856F: D9 C0              -  fld st(0)
06628571: DF F2              -  fcomip st(0),st(2)
06628573: DD D9              -  fstp st(1)
06628575: 7A 36              -  jp 066285AD
06628577: 73 34              -  jae 066285AD
06628579: DD D8              -  fstp st(0)
0662857B: D9 05 60 5A 13 00  -  fld dword ptr [00135A60]
06628581: D8 0D 80 86 62 06  -  fmul dword ptr [06628680]
06628587: D8 69 30           -  fsubr dword ptr [ecx+30]
0662858A: D9 59 30           -  fstp dword ptr [ecx+30]
}

 

Держи скрипт на фокус. Твои 3 дня убиты в никуда :)  Теперь наша энергия\фокус не тратится, в игре у себя проверял - работает. Перезапускал игру - не крашит.

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

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

Держи скрипт на фокус.

У меня не работает на 1.0.0.7, эта инструкция за хп и стамину отвечает в моей игре.

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

55 минут назад, vagingameh сказал:

хмм, странно
 

  Скрыть контент

 

Ваш скрипт у меня так же не сработал к несчастью:(

 

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

Ну в общем такие дела тут

Ваш способ работает! Я вот прекрасно зная основные механики игры не додумался накрутить силы воли ? Да и спортивный интерес у меня был: покорить отдельно взятую эту полосочку.  

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

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

покорить отдельно взятую эту полосочку

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

 

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

Я вот прекрасно зная основные механики игры не додумался накрутить силы воли

Это необходимая вещь рассматривать что-то с разных углов и пробовать самые нестандартные методы.

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

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

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

 

Это необходимая вещь рассматривать что-то с разных углов и пробовать самые нестандартные методы.

Останавливает незнание языков программирования в большей степени думаю. И отсутствие владения Английским языком на высоком уровне. Нет доступа к огромному пласту информации. 

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

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

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

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