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

Помогите по созданию фильтра


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

Как создать фильтр в игре на жизнь? Т.е. Когда я заменяю инструкцию нопом на уменьшение жизни то бессмертные становятся все враги и я! Я знаю что надо сделать какой то фильтр с помощью cmp но не знаю как, надо еще и какой-то айди игрока находить а как это сделать?

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

В гугле тоже искал вообще находит какую-то бредятину.

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

Игра: Shank v1.0

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

  • Ответов 55
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

С начало попробуй так:

1.Найди адрес жизней своего героя.

2.Сделай брякпоинт на запись и потеря немного жизней.

3.Появится инструкция отвечающая жизни твои и скорее всего врагов.

4.Переходим в отладчик и жмем правой кнопкой мыши на эту инструкцию

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

Таким образом ты узнаешь адреса врагов и добавь их в таблицу.

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

с твоей жизнь и жизнью врагов.

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

7.Если они все одинаковые тогда ищи на свой адрес здоровья, многоуровневый указатель.

И пиши скрипт сним.

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

Фу, блин нашёл! Вот:

0076584C=>[...+9A4]=>[...+64]=>начало_структуры_игрока+70=здоровье

или

630B5023=>[...+9A4]=>[...+64]=>начало_структуры_игрока+70=здоровье

Заморозил - бессмертен, враги дохнут)

Скрипт, уж извините, писать лень)

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

Именно v1.0, а не v1.0u3?

Мне кажется это неважно так как скрипт пишу aobscan'ом.

С начало попробуй так:

1.Найди адрес жизней своего героя.

2.Сделай брякпоинт на запись и потеря немного жизней.

3.Появится инструкция отвечающая жизни твои и скорее всего врагов.

4.Переходим в отладчик и жмем правой кнопкой мыши на эту инструкцию

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

Таким образом ты узнаешь адреса врагов и добавь их в таблицу.

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

с твоей жизнь и жизнью врагов.

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

7.Если они все одинаковые тогда ищи на свой адрес здоровья, многоуровневый указатель.

И пиши скрипт сним.

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

Фу, блин нашёл! Вот:

0076584C=>[...+9A4]=>[...+64]=>начало_структуры_игрока+70=здоровье

или

630B5023=>[...+9A4]=>[...+64]=>начало_структуры_игрока+70=здоровье

Заморозил - бессмертен, враги дохнут)

Скрипт, уж извините, писать лень)

Ммм.. Если не сложно объясните что это? Я новичок неделю назад начал трейнеры делать.

P.S Пока что только умею делать скрипты с помощью aobscan...

Вот пока такое надумал

но как я уже говорил у всех жизнь бесконечная буду дальше делать как вы подсказали

[ENABLE]
aobscan(infhsh,D9 5D 70 E8 ?? ?? ?? ?? 8B C8 E8 ?? ?? ?? ?? D9 45 70)//004C53A9
label(_infhsh)
registersymbol(_infhsh)
aobscan(perehod,55 8B EC 51 89 4D FC 8B 45 FC 8B 40 5C 8B E5 5D C3) //0040E350
label(exit)
alloc(newmem,1024)

infhsh:
_infhsh:
jmp newmem
nop
nop
nop
newmem:
nop
call perehod
exit:
jmp infhsh+8

[DISABLE]
_infhsh:
fstp dword ptr [ebp+70]
call 0040E350
dealloc(newmem)
unregistersymbol(_infhsh)

С начало попробуй так:

1.Найди адрес жизней своего героя.

2.Сделай брякпоинт на запись и потеря немного жизней.

3.Появится инструкция отвечающая жизни твои и скорее всего врагов.

4.Переходим в отладчик и жмем правой кнопкой мыши на эту инструкцию

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

Таким образом ты узнаешь адреса врагов и добавь их в таблицу.

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

с твоей жизнь и жизнью врагов.

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

7.Если они все одинаковые тогда ищи на свой адрес здоровья, многоуровневый указатель.

И пиши скрипт сним.

Проверил как вы сказали. Придётся делать фильтр так как они получают доступ к одной инструкции.

А многоуровневые указатели искать не хочу не удобно их использовать. С инструкциями получше.

Ну а на счёт ID игрока поможете?? как его находить? и сверять?

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

У нас на форуме есть видео по анализу структур. Когда ты нашел, как писали выше, адрес своего здоровья и здоровья хотя бы пары врагов - через СЕ можешь воспользоваться функцией Dissect Data/Structures, и добавить туда все адреса. Потом надо сидеть и анализировать структуру в поиске такого значения, которое

1. Отличается у твоего игрока и одинаково у врагов

2. При перезапуске игры не изменяется.

А дальше - дело техники: пишешь фильтр на проверку этого значения. Вот и все. Более подробно ты сможешь посмотреть все это в видео от keng или Coder. Поищи по форуму, их у нас полно.

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

Вот что нашлось: стоит обратить внимание на 002C

dc47e4753f5249e4fc7886503c578b8a.png

А вот примерный скрипт:

[ENABLE]

alloc(newmem,2048)

label(returnhere)

label(originalcode)

label(exit)

newmem:

cmp [ebp+2C],#15

jne exit

originalcode:

fstp dword ptr [ebp+70]

exit:

call 0040E350

jmp returnhere

004C53A9:

jmp newmem

nop

nop

nop

returnhere:

[DISABLE]

dealloc(newmem)

004C53A9:

fstp dword ptr [ebp+70]

call 0040E350

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

Не вижу другого варианта кроме как проходить по цепочке указателей и сравнивать с ebp.

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

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

Когда победил первую инструкция по отниманию здоровья, то вылезла другая:

004C6B17 - D9 5C 24 1C - fstp dword ptr [esp+1C]

004C6B1B - D9 44 24 1C - fld dword ptr [esp+1C]

004C6B1F - D9 53 70 - fst dword ptr [ebx+70] <---

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

Введу одно уточнение - чтобы удобнее было проводить анализ, адреса Enemy1..3 лучше объединить в одну группу Enemies. Тогда цветами он будет выделять адреса, которые одинаковы для группы, но разнятся для других групп. По себе знаю - так анализировать проще.

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


[ENABLE]
alloc(newmem, 2048)
label(function)
label(returnhere)
label(exit)
newmem:
push ecx
mov ecx,00
cmp ecx,01
pop ecx
je function
movss [ebp-1C],xmm6
function:
mov [ebp-1C],(float)1
exit:
jmp returnhere
00BF04C1:
jmp newmem
returnhere:
[DISABLE]
dealloc(newmem)
00BF04C1:
movss [ebp-1C],xmm6

Всем привет, почему всегда выполняется function?

je - это ведь переход,когда равно.

Да если даже сделать cmp ecx,00 всеравно перейдет по function.

Раньше делал и все нормально работало, а тут то ли не выспался,то ли что.

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

Действительно не выспался)


movss [ebp-1C],xmm6
function:
mov [ebp-1C],(float)1

У тебя всегда будет выполняться function, т.к. нет прыжка через неё. Сделай:


movss [ebp-1C],xmm6
jmp exit
function:
mov [ebp-1C],(float)1
exit:
jmp returnhere

Если же ты говорил по поводу нерабочего перехода на je function, то всё работает нормально.

00 01 не переходит, 00 00 переходит.

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

Вот что нашлось: стоит обратить внимание на 002C

dc47e4753f5249e4fc7886503c578b8a.png

А вот примерный скрипт:

[ENABLE]

alloc(newmem,2048)

label(returnhere)

label(originalcode)

label(exit)

newmem:

cmp [ebp+2C],#15

jne exit

originalcode:

fstp dword ptr [ebp+70]

exit:

call 0040E350

jmp returnhere

004C53A9:

jmp newmem

nop

nop

nop

returnhere:

[DISABLE]

dealloc(newmem)

004C53A9:

fstp dword ptr [ebp+70]

call 0040E350

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

Не вижу другого варианта кроме как проходить по цепочке указателей и сравнивать с ebp.

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

Сделал как у вас в скрипте Вы там написали смещение 2С как это было в анализаторе структур, я сделал так же но результата 0, потом прибавил свое смещение к 70 в HEX получилось 7С и скрипт работает!!!! НО через раз почему-то т.е. 60% ударов не наносят урон, а остальные 40% наносят урон. Что же делать?

Вот что получилось

[ENABLE]
alloc(newmem,1024)
label(exit)
label(returnhere)
label(shank)
004C53A9:
jmp newmem
nop
nop
nop
returnhere:
newmem:
cmp [ebp+7C],(float)60
je shank
fstp dword ptr [ebp+70]
jmp exit
shank:
nop
nop
nop
exit:
jmp returnhere
[DISABLE]
004C53A9:
fstp dword ptr [ebp+70]
dealloc(newmem)

Может что-то просто не правильно?

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

d0c, здоровье всё равно отнимается в этом скрипте или в каком-то другом месте. см. пост #9

(float)60 у Шенка всегда?

В том то и дело у него оно почему-то меняется но как-то странно 60 потом другое, потом опять другое, и опять 60 - как-то так(и у врагов то же самое)

Короче, после каждого удара ID игрока меняется например сначала у shank'a ID (float)60, после удара уже (float)109.6764896796; потом еще удар и (float)80; еще удар и обратно (float)60

Что же делать?

как-то же без указателей можно по-любому

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

В том то и дело у него оно почему-то меняется но как-то странно 60 потом другое, потом опять другое, и опять 60 - как-то так(и у врагов то же самое)

Короче, после каждого удара ID игрока меняется например сначала у shank'a ID (float)60, после удара уже (float)109.6764896796; потом еще удар и (float)80; еще удар и обратно (float)60

Что же делать?

как-то же без указателей можно по-любому

Вряд ли ID персонажа имеет тип float, нужно искать целое 1-4 байт.

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

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

И еще спрошу кое-что(наверное не по теме) есть код:

25442dbb7936df68829c15feb633642c.png

Я выделил красным то что мне не понятно - alloc(newmem.2048,а это тут для чего????) - ведь без этого не работает

Вряд ли ID персонажа имеет тип float, нужно искать целое 1-4 байт.

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

Ну я сначала искал 4 байта но ничего не нахожу(4 байт просто нет! а если и есть то там вообще фигня написана никак не относящаяся к ID

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

И еще спрошу кое-что(наверное не по теме) есть код:

25442dbb7936df68829c15feb633642c.png

Я выделил красным то что мне не понятно - alloc(newmem.2048,а это тут для чего????) - ведь без этого не работает

Вот что нашлось, если с английским хорошо:

alloc(allocname,sizeinbytes, preferedregion OPTIONAL) //same as label, but allocates the memory it points to itself

Похоже на адрес, из которого будет совершён прыжок в выделенную область. И адрес 5 байтовый.

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

Хммм... А зачем же это? Если там ниже в скрипте и так показано откуда будет jmp newmem. Ну да ладно - это не важно.

И вы сказали что привязать к какому-то уникальному идентификатору которого нет у врагов верно?

Я попробовал но ничего не получилось(пробовал привязать к гранатам, можете наглядно показать? Можно на любой игре.)

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

Я попробовал но ничего не получилось(пробовал привязать к гранатам, можете наглядно показать? Можно на любой игре.)

Сейчас пробую на этой)

Кажись поддалось)

В структуре по смещению +128h у Шенка всегда 4, у противников 0.

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

newmem:
cmp [ebp+128],4
je exit

originalcode:
fstp dword ptr [ebp+70]

exit:
call 0040E350
jmp returnhere

004C53A9:
jmp newmem
nop
nop
nop
returnhere:

[DISABLE]
dealloc(newmem)
004C53A9:
fstp dword ptr [ebp+70]
call 0040E350

Как и в прошлый раз не доломал я и d0c. Здоровье всё равно отнималось, это происходило из-за ранений от комбо атак противников. Заплатка:

[ENABLE]
alloc(newmem2,2048)
label(returnhere2)
label(originalcode2)
label(exit2)

newmem2:
cmp [ebx+128],4
je exit2

originalcode2:
fstp dword ptr [ebx+70]

exit2:
fld dword ptr [esi+000000D0]
jmp returnhere2

004C6B1F:
jmp newmem2
nop
nop
nop
nop
returnhere2:

[DISABLE]
dealloc(newmem2)
004C6B1F:
fstp dword ptr [ebx+70]
fld dword ptr [esi+000000D0]

Прошёл весь первый уровень и часть второго на макс. уровне сложности, перезапускал игру - всё работает нормально)

P.S.


004C6B37 - D9 5B 70 - fstp dword ptr [ebx+70] - лечение
004841E4 - FF 48 10 - dec [eax+10] - уменьшение гранат

P.S.S. Можно было попробовать заморозить гранаты и привязываться к ним, но память под них в данном случае выделяется в другом месте. Так что не вариант)

Скрипт 2 в 1

[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
label(returnhere2)
label(originalcode2)
label(exit2)

newmem:
cmp [ebp+128],4 - нет ранений от атак
je exit

originalcode:
fstp dword ptr [ebp+70]

exit:
call 0040E350
jmp returnhere

newmem+30:
cmp [ebx+128],4 - нет ранений от комбо-атак
je exit2

originalcode2:
fstp dword ptr [ebx+70]

exit2:
fld dword ptr [esi+000000D0]
jmp returnhere2

004C53A9:
jmp newmem
nop
nop
nop
returnhere:

004C6B1F:
jmp newmem+30
nop
nop
nop
nop
returnhere2:

[DISABLE]
dealloc(newmem)
004C53A9:
fstp dword ptr [ebp+70]
call 0040E350

004C6B1F:
fstp dword ptr [ebx+70]
fld dword ptr [esi+000000D0]

Теперь самое интересное: если сделать гранаты бесконечными, то после гибели персонажа скрипт не работает)))

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

Сейчас пробую на этой)

Кажись поддалось)

В структуре по смещению +128h у Шенка всегда 4, у противников 0.

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

newmem:
cmp [ebp+128],4
je exit

originalcode:
fstp dword ptr [ebp+70]

exit:
call 0040E350
jmp returnhere

004C53A9:
jmp newmem
nop
nop
nop
returnhere:

[DISABLE]
dealloc(newmem)
004C53A9:
fstp dword ptr [ebp+70]
call 0040E350

Как и в прошлый раз не доломал я и d0c. Здоровье всё равно отнималось, это происходило из-за ранений от комбо атак противников. Заплатка:

[ENABLE]
alloc(newmem2,2048)
label(returnhere2)
label(originalcode2)
label(exit2)

newmem2:
cmp [ebx+128],4
je exit2

originalcode2:
fstp dword ptr [ebx+70]

exit2:
fld dword ptr [esi+000000D0]
jmp returnhere2

004C6B1F:
jmp newmem2
nop
nop
nop
nop
returnhere2:

[DISABLE]
dealloc(newmem2)
004C6B1F:
fstp dword ptr [ebx+70]
fld dword ptr [esi+000000D0]

Прошёл весь первый уровень и часть второго на макс. уровне сложности, перезапускал игру - всё работает нормально)

P.S.


004C6B37 - D9 5B 70 - fstp dword ptr [ebx+70] - лечение
004841E4 - FF 48 10 - dec [eax+10] - уменьшение гранат

P.S.S. Можно было попробовать заморозить гранаты и привязываться к ним, но память под них в данном случае выделяется в другом месте. Так что не вариант)

Скрипт 2 в 1

[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
label(returnhere2)
label(originalcode2)
label(exit2)

newmem:
cmp [ebp+128],4 - нет ранений от атак
je exit

originalcode:
fstp dword ptr [ebp+70]

exit:
call 0040E350
jmp returnhere

newmem+30:
cmp [ebx+128],4 - нет ранений от комбо-атак
je exit2

originalcode2:
fstp dword ptr [ebx+70]

exit2:
fld dword ptr [esi+000000D0]
jmp returnhere2

004C53A9:
jmp newmem
nop
nop
nop
returnhere:

004C6B1F:
jmp newmem+30
nop
nop
nop
nop
returnhere2:

[DISABLE]
dealloc(newmem)
004C53A9:
fstp dword ptr [ebp+70]
call 0040E350

004C6B1F:
fstp dword ptr [ebx+70]
fld dword ptr [esi+000000D0]

Теперь самое интересное: если сделать гранаты бесконечными, то после гибели персонажа скрипт не работает)))

А вот на счет заплатки, Вы где-то сверху писали то что поймали еще какую-то(вторую) инструкцию которая отвечает за уменьшение здоровья, как вы ее нашли? Последовательностью каких действий?

А еще можете скинуть скрин анализа структур?

И как вы написали адреса в анализаторе структур?

1 группа:

1 Адрес) Адрес здоровья шанка

2 Адрес) кол-во гранат

2 группа:

1 Адрес) здоровье enemy1

2 Адрес) здоровье enemy2 ???

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

Добавлю кое-что.

Вы по-моему что-то упустили(или может у меня что-то тупит) в первом уровне когда выходишь из здания там есть большой человек и у него хп столько же сколько у shank'a, он тоже бессмертный опять же проблема 1 уровень пройти невозможно...(такая проблема только с врагом под именем "Big" с другими здоровяками проблем нет)

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

А вот на счет заплатки, Вы где-то сверху писали то что поймали еще какую-то(вторую) инструкцию которая отвечает за уменьшение здоровья, как вы ее нашли? Последовательностью каких действий?

Можно на ты) где-то читал, что со времён фидо такие правила пошли)

Просто применил первую заплатку, поставил отслеживание инструкций, которые пишут по этому адресу, и дал врагам себя сильно побить. Вот она и выплыла. Можно было через поиск инструкций, но здесь они оказались разные ebp и ebx.

А еще можете скинуть скрин анализа структур?

Проанализировал в CE и не сохранял. Если очень надо, то да.

И как вы написали адреса в анализаторе структур?

1 группа:

1 Адрес) Адрес здоровья шанка

2 Адрес) кол-во гранат

2 группа:

1 Адрес) здоровье enemy1

2 Адрес) здоровье enemy2 ???

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

Гранаты, как оказалось не входят в эту структуру или просто не нашёл связи. Обычным поиском отсевом типа byte.

Тебе нужен процесс занесения в структуру?

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

Добавлю:

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

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

Добавлю:

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

Не знаю как без скриптов, но здоровяки и собачки мочатся с комбо 30-60, либо гранатами.

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


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

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

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