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

"Фильтры" на примере Stronghold Legends


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

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

Теперь пытаюсь найти адреса здоровья юнитов, и тут загвоздка: это не float и не 4 байта.

Вопрос: может быть здоровье типом байт (т.е. 255 это полностью здоровый, а 0 труп)?

P.S. здоровье у юнитов полоской отображается...

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

В общем здоровье юнитов там байтовое значение...

Хотя, проблема всё же есть. Когда я смотрю какие значения проскакивают в той инструкции, что со значением здоровья работает, то понимаю что нет там того значения, а есть какое-то float.

Вопрос: как всё же выйти на инстркцию, которая именно с byte значением работает?

Однако, интересный факт: и float, и byte значения отвечают за одно и то же, то есть по сути можно с любым типом работать...

StrongholdLegends.exe+3E82D9

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

Кому не сложно, помогите плз фильтр сделать на свой-чужой!

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

1) Для твоих двух юнитов:

- Скопируй вверх пять инструкции  и вниз десять относительно StrongholdLegends.exe+3E82D9. Приведи значения регистров на сработанном бряке.

2) Для  двух юнитов - врагов:

- Скопируй вверх пять инструкции  и вниз десять относительно StrongholdLegends.exe+3E82D9. Приведи значения регистров на сработанном бряке.

Итого получиться 4 листинга, приведи их здесь.

3) Поставь бряк на адрес здоровья твоего одного юнита "на доступ" и приведи здесь все сработавшие инструкции:

   - когда ничего не происходит (зайди в игру подожди немного и выйди, никто не кому не должен наносить урона);

   - когда ты отнимаешь здоровье у врага;

   - когда враг отнимает здоровье у твоего юнита.

4) Поставь бряк на адрес здоровья врага "на доступ" и приведи здесь все сработавшие инструкции:

   - когда ничего не происходит (зайди в игру подожди немного и выйди, никто не кому не должен наносить урона);

   - когда ты отнимаешь здоровье у врага;

   - когда враг отнимает здоровье у твоего юнита.

Итого получиться 4 листинга + 6 листингов. Можешь их написать здесь, а можешь сам проанализировать. Тебе нужно найти зацепку: либо найти инструкции которые работают только с твоими юнитами или только с врагами, либо найти аналогично регистры, либо сравнивать структуры, либо искать цепочку указателей на структуры от глубокого уровня вверх. Ставить на "уровни бряки" и по тойже схеме что выше анализировать листинги. Может быть это всё покажется сложным, но если игр 20 таким образом обманешь, то всё уже делаешь на автоматизме.... 

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

Это кусок кода 5 вверх и 10 вниз.


007E82CB - df e0 - fnstsw ax
007E82CD - f6 c4 41 - test ah,41
007E82D0 - 7b 25 - jnp 007e82f7
007E82D2 - d9 41 4c - fld dword ptr [ecx+4c]
007E82D5 - d8 64 24 04 - fsub dword ptr [esp+04]
>>007E82D9 - d9 51 4c - fst dword ptr [ecx+4c]
007E82DC - d8 1d 68 01 91 00 - fcomp dword ptr [00910168] : [00000000]
007E82E2 - df e0 - fnstsw ax
007E82E4 - f6 c4 41 - test ah,41
007E82E7 - 7a 13 - jp 007e82fc
007E82E9 - 8b 44 24 08 - mov eax,[esp+08]
007E82ED - c7 41 4c 00 00 00 00 - mov [ecx+4c],00000000
007E82F4 - 89 41 54 - mov [ecx+54],eax
007E82F7 - b0 01 - mov al,01
007E82F9 - c2 08 00 - ret 0008
007E82FC - 32 c0 - xor al,al

Это Регистры на юнитов.

EAX=43160037
EBX=80000002
ECX=3425DDC0
EDX=0000000B
ESI=3425DDC0
EDI=342762D0
EBP=00840089
ESP=0012FA60
EIP=007E82DC

Probable base pointer =3425DDC0


EAX=40A00037
EBX=20000000
ECX=33F2DE50
EDX=0000000B
ESI=33F2DE50
EDI=010806AD
EBP=010806AD
ESP=0012F86C
EIP=007E82DC

Probable base pointer =33F2DE50

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

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

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

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

В общем всё что ты описывал это хорошо, но не нужно. Всё оказалось проще.


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)

StrongholdLegends.exe+3E82D9:
jmp newmem
nop
nop
nop
nop
returnhere:

newmem:
cmp dword ptr [ecx+178],1 // это и есть фильтр )))
jne originalcode
fst dword ptr [ecx+4c] // оригинальный шмат
fcomp dword ptr [00910168] // он же...
push eax
mov eax,[ecx+48] // вот тут хранится максимальное значение здоровья юнита
mov [ecx+4c],eax // тут присвоил максимум...
pop eax
jmp returnhere

originalcode:
fst dword ptr [ecx+4c]
fcomp dword ptr [00910168]
jmp returnhere


[DISABLE]
StrongholdLegends.exe+3E82D9:
fst dword ptr [ecx+4c]
fcomp dword ptr [00910168]

вот этот шмат делает всех юнитов бессмертными...

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

Akama, всё что я описывал это были общие рекомендации. Между прочем твоё решение было в этих рекомендациях, если ты не увидел.

По-другому твой скрипт можно так написать:


[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)

StrongholdLegends.exe+3E82D9:
jmp newmem
nop
nop
nop
nop
returnhere:

newmem:
fst dword ptr [ecx+4c]
fcomp dword ptr [00910168]
cmp dword ptr [ecx+178],1
jne returnhere
push [ecx+48]
pop [ecx+4c]
jmp returnhere


[DISABLE]
StrongholdLegends.exe+3E82D9:
fst dword ptr [ecx+4c]
fcomp dword ptr [00910168]

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

  • 2 недели спустя...
  • 4 месяца спустя...

Подскажите как найти фильтр ГГ чтобы патроны и жизнь бесконечные были только у моего игрока. И как сделать бессмертие чтобы ни одно оружие не убивало. А то меня гранатой убивает. Игра Battlefield 2

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

  • 2 года спустя...
×
×
  • Создать...

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

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