Akama Опубликовано 14 декабря, 2010 Поделиться Опубликовано 14 декабря, 2010 Решил над игрушкой поиздеваться, нашёл всё что мог.Теперь пытаюсь найти адреса здоровья юнитов, и тут загвоздка: это не float и не 4 байта.Вопрос: может быть здоровье типом байт (т.е. 255 это полностью здоровый, а 0 труп)?P.S. здоровье у юнитов полоской отображается...Ложная тревога, пока тему создавал сам нашёл что там и как )))В общем здоровье юнитов там байтовое значение...Хотя, проблема всё же есть. Когда я смотрю какие значения проскакивают в той инструкции, что со значением здоровья работает, то понимаю что нет там того значения, а есть какое-то float.Вопрос: как всё же выйти на инстркцию, которая именно с byte значением работает?Однако, интересный факт: и float, и byte значения отвечают за одно и то же, то есть по сути можно с любым типом работать...StrongholdLegends.exe+3E82D9по этой инструкции (или адресу, я в терминах не особо...) проскакивает здоровье юнитов всех, и моих и чужих. Кому не сложно, помогите плз фильтр сделать на свой-чужой! Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 15 декабря, 2010 Поделиться Опубликовано 15 декабря, 2010 1) Для твоих двух юнитов:- Скопируй вверх пять инструкции и вниз десять относительно StrongholdLegends.exe+3E82D9. Приведи значения регистров на сработанном бряке.2) Для двух юнитов - врагов:- Скопируй вверх пять инструкции и вниз десять относительно StrongholdLegends.exe+3E82D9. Приведи значения регистров на сработанном бряке.Итого получиться 4 листинга, приведи их здесь.3) Поставь бряк на адрес здоровья твоего одного юнита "на доступ" и приведи здесь все сработавшие инструкции: - когда ничего не происходит (зайди в игру подожди немного и выйди, никто не кому не должен наносить урона); - когда ты отнимаешь здоровье у врага; - когда враг отнимает здоровье у твоего юнита.4) Поставь бряк на адрес здоровья врага "на доступ" и приведи здесь все сработавшие инструкции: - когда ничего не происходит (зайди в игру подожди немного и выйди, никто не кому не должен наносить урона); - когда ты отнимаешь здоровье у врага; - когда враг отнимает здоровье у твоего юнита.Итого получиться 4 листинга + 6 листингов. Можешь их написать здесь, а можешь сам проанализировать. Тебе нужно найти зацепку: либо найти инструкции которые работают только с твоими юнитами или только с врагами, либо найти аналогично регистры, либо сравнивать структуры, либо искать цепочку указателей на структуры от глубокого уровня вверх. Ставить на "уровни бряки" и по тойже схеме что выше анализировать листинги. Может быть это всё покажется сложным, но если игр 20 таким образом обманешь, то всё уже делаешь на автоматизме.... Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 18 декабря, 2010 Автор Поделиться Опубликовано 18 декабря, 2010 Это кусок кода 5 вверх и 10 вниз.007E82CB - df e0 - fnstsw ax007E82CD - f6 c4 41 - test ah,41007E82D0 - 7b 25 - jnp 007e82f7007E82D2 - 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 ax007E82E4 - f6 c4 41 - test ah,41007E82E7 - 7a 13 - jp 007e82fc007E82E9 - 8b 44 24 08 - mov eax,[esp+08]007E82ED - c7 41 4c 00 00 00 00 - mov [ecx+4c],00000000007E82F4 - 89 41 54 - mov [ecx+54],eax007E82F7 - b0 01 - mov al,01007E82F9 - c2 08 00 - ret 0008007E82FC - 32 c0 - xor al,alЭто Регистры на юнитов.EAX=43160037EBX=80000002ECX=3425DDC0EDX=0000000BESI=3425DDC0EDI=342762D0EBP=00840089ESP=0012FA60EIP=007E82DCProbable base pointer =3425DDC0EAX=40A00037EBX=20000000ECX=33F2DE50EDX=0000000BESI=33F2DE50EDI=010806ADEBP=010806ADESP=0012F86CEIP=007E82DCProbable base pointer =33F2DE50 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 20 декабря, 2010 Поделиться Опубликовано 20 декабря, 2010 Этой информации не достаточно. Тебе нужно сравнить как минимум 4 листинга регистров юнитов. Два твоих двух разных юнитов и два разных юнитов- врагов. Это сравнение первое которое можно сделать перед тем как ты сравнивал структуры юнитов твоих и врагов. Оно не всегда помогает и в этом случае уже можно сравнивать инструкции на бряках здоровья твоего и чужого юнитов. Если опять не определил фильтров, то ищёшь указатель уровня вверх по дизассемблерному коду и аналогично проходишь все этапы с ним: сравнение структур указателей твоего игрока и других юнитов, сравнение регистров, сравнение инструкций... не получилось, тогда опять ищем указатель на уровень выше и делаем заново с ним. Утомительно, не спорю, но возможно иначе никак. Хотя есть ещё изворотливый способ, например, сравнивать дампы стека во время бряков на здоровье юнитов и также другой памяти игры.... Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 27 декабря, 2010 Автор Поделиться Опубликовано 27 декабря, 2010 В общем всё что ты описывал это хорошо, но не нужно. Всё оказалось проще.[ENABLE]alloc(newmem,2048)label(returnhere)label(originalcode)StrongholdLegends.exe+3E82D9:jmp newmemnopnopnopnopreturnhere:newmem:cmp dword ptr [ecx+178],1 // это и есть фильтр )))jne originalcodefst dword ptr [ecx+4c] // оригинальный шматfcomp dword ptr [00910168] // он же...push eaxmov eax,[ecx+48] // вот тут хранится максимальное значение здоровья юнитаmov [ecx+4c],eax // тут присвоил максимум...pop eaxjmp returnhereoriginalcode:fst dword ptr [ecx+4c]fcomp dword ptr [00910168]jmp returnhere[DISABLE]StrongholdLegends.exe+3E82D9:fst dword ptr [ecx+4c]fcomp dword ptr [00910168]вот этот шмат делает всех юнитов бессмертными... Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 27 декабря, 2010 Поделиться Опубликовано 27 декабря, 2010 Akama, всё что я описывал это были общие рекомендации. Между прочем твоё решение было в этих рекомендациях, если ты не увидел.По-другому твой скрипт можно так написать:[ENABLE]alloc(newmem,2048)label(returnhere)label(originalcode)StrongholdLegends.exe+3E82D9:jmp newmemnopnopnopnopreturnhere:newmem: fst dword ptr [ecx+4c] fcomp dword ptr [00910168] cmp dword ptr [ecx+178],1jne returnhere push [ecx+48] pop [ecx+4c]jmp returnhere[DISABLE]StrongholdLegends.exe+3E82D9:fst dword ptr [ecx+4c]fcomp dword ptr [00910168] Ссылка на комментарий Поделиться на другие сайты Поделиться
Akama Опубликовано 8 января, 2011 Автор Поделиться Опубликовано 8 января, 2011 push [ecx+48] pop [ecx+4c]Очень полезная вещь, не приходится сохранять и восстанавливать значения регистров eax и т.д. Ссылка на комментарий Поделиться на другие сайты Поделиться
Ramil Опубликовано 9 мая, 2011 Поделиться Опубликовано 9 мая, 2011 Подскажите как найти фильтр ГГ чтобы патроны и жизнь бесконечные были только у моего игрока. И как сделать бессмертие чтобы ни одно оружие не убивало. А то меня гранатой убивает. Игра Battlefield 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Fixer Опубликовано 4 октября, 2013 Поделиться Опубликовано 4 октября, 2013 раз автору помогли - уберите тему из заголовка. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения