krocki Опубликовано 12 августа, 2015 Поделиться Опубликовано 12 августа, 2015 (изменено) К примеру возьмём RPG игру любую с прокачкой героя.Взламываю и пишу АА скрипт на жизни, но столкнулся с одной проблемой!Сделал скрипт на вечную жизнь, но при получении очков опыта,жизни не увеличиваются и не уменьшаются при уроне герою, в общем тупо заморозка значения жизней.Как сделать\написать скрипт что бы жизни не уменьшались, но при получении опыта что бы они увеличивались. [ENABLE]alloc(newmem,64)label(returnhere)label(originalcode)newmem:cmp [eax+20],00120000 //Фильтр для жизней (ID).je returnhere //Если равно, то прыгаем на возврат.jmp originalcode //Делаем принудительный прыжок на тот случай если не равно.originalcode:mov [eax+04],edi //Оригинальная инструкция.jle "GAME.EXE"+5839Bjmp returnhere"GAME.EXE"+58384:jmp newmemreturnhere:[DISABLE]dealloc(newmem)"GAME.EXE"+58384:mov [eax+04],edijle "GAME.EXE"+5839B Изменено 12 августа, 2015 пользователем krocki Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 12 августа, 2015 Поделиться Опубликовано 12 августа, 2015 [terminus]-------------------------------------------------------------------------------- Привет! Думаю, код изменения жизней и код получения опыта пересекается. Скорее всего, у жизней есть максимальный уровень (0-100, 0-110 на втором уровне, 0-120 на третьем уровне и так далее), так что тебе нужно будет найти это максимальное значение и изменить скрипт таким образом, чтобы в инструкцию всякий раз записывалось именно оно, а не просто отключалась инструкция изменения текущего значения. Могу попробовать показать на примере, но мне нужна игра для этого. Пока что могу только предложить внимательно изучить стек и содержимое регистров, а так же поискать то самое "максимальное значение" и выяснить, что его читает или в него пишет. --------------------------------------------------------------------------------[/terminus] Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 12 августа, 2015 Автор Поделиться Опубликовано 12 августа, 2015 keng Здаров! Можешь хотя бы показать пример на моём скрипте как это должно выглядеть. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 12 августа, 2015 Поделиться Опубликовано 12 августа, 2015 Могу, как только дома окажусь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 августа, 2015 Поделиться Опубликовано 12 августа, 2015 В структуре скорее всего будут рядом максимальное кол-во живучести.А скрипт будет выглядеть примерно так:[ENABLE]alloc(newmem,64)label(returnhere)newmem:cmp [eax+20],00120000 jne @f mov edi,[eax+08] // либо [eax+0] или [eax]. Посмотри в структуре. @@:mov [eax+04],edi jle "GAME.EXE"+5839Bjmp returnhere"GAME.EXE"+58384:jmp newmemreturnhere:[DISABLE]"GAME.EXE"+58384:mov [eax+04],edijle "GAME.EXE"+5839Bdealloc(newmem) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 12 августа, 2015 Поделиться Опубликовано 12 августа, 2015 [terminus]-------------------------------------------------------------------------------- Да, Гарик прав. В той же структуре, но по другому смещению оно должно лежать. Самый простой способ выяснить это смещение (помимо анализа глазками) - это посмотреть, что читает и пишет в адрес здоровья во время получения опыта или уровня - в общем, тогда, когда меняется максимальное количество. Должна быть инструкция, которая один раз срабатывает, но с другим смещением. --------------------------------------------------------------------------------[/terminus] Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 12 августа, 2015 Автор Поделиться Опубликовано 12 августа, 2015 (изменено) Garik66 Спасибо за идею посмотрел в структуре нужно просто [eax+0C] вставить.Но не понятно только в скрипте что это @f и это @@: ...объясните мне. Изменено 12 августа, 2015 пользователем krocki Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 12 августа, 2015 Поделиться Опубликовано 12 августа, 2015 @@: - Это безымянная метка @F - Это прыжок вперед на ближайшую безымянную метку. Есть еще @B - это прыжок назад на ближайшую безымянную метку. Безымянная метка аналогична записи "label(name)", только ее не нужно создавать, а с прыжками итак все понятно должно быть, я думаю. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 августа, 2015 Поделиться Опубликовано 12 августа, 2015 @@ - безымянная метка.@f - короткий прыжок вперёд на ближайшую безымянную метку.@b - короткий прыжок назад на ближайшую безымянную метку. Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 12 августа, 2015 Автор Поделиться Опубликовано 12 августа, 2015 NullAlex А я и не знал что так можно АА в скриптах творить...афигеть.Всегда пользовался label'ом...а тут такое! Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 августа, 2015 Поделиться Опубликовано 12 августа, 2015 krocki, вот в этом видео я немного рассказываю про прыжки (переходы: Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 12 августа, 2015 Поделиться Опубликовано 12 августа, 2015 [terminus]-------------------------------------------------------------------------------- А еще, по большому секрету скажу, можно прыгать на количество байт: jmp short 00h-7Fh ; Вперед (вниз) по коду jmp short 80h-FFh ; Назад (вверх) по коду Команд jmp, на самом деле, довольно много. Основная разница - это short и far, а в 80x86, если мне не изменяет память, под эту команду выделено аж пять разных опкодов. Подробнее - [тут] и [тут]. --------------------------------------------------------------------------------[/terminus] Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 12 августа, 2015 Автор Поделиться Опубликовано 12 августа, 2015 (изменено) В общем всё понятно...и как это делается!...Спасибо всем за инфу. Тему можно закрыть если что.Вот какой скрипт у меня получился:alloc(newmem,64)label(returnhere)newmem:cmp [eax+20],00080000jne @Fmov edi,[eax+0C]@@:mov [eax+04],edijle "GAME.EXE"+5839Bjmp returnhere"GAME.EXE"+58384:jmp newmemreturnhere:[DISABLE]dealloc(newmem)"GAME.EXE"+58384:mov [eax+04],edijle "GAME.EXE"+5839BЯ то не новичок в АSМ\HACK, просто привык по старинке делать.Вот тут решил кое что новое приобрести\навык.А про прыжки команд я ещё с TSearch'а помню. Изменено 12 августа, 2015 пользователем krocki Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 24 сентября, 2015 Поделиться Опубликовано 24 сентября, 2015 [terminus]--------------------------------------------------------------------------------А еще, по большому секрету скажу, можно прыгать на количество байт:jmp short 00h-7Fh ; Вперед (вниз) по кодуjmp short 80h-FFh ; Назад (вверх) по кодуКоманд jmp, на самом деле, довольно много. Основная разница - это short и far, ав 80x86, если мне не изменяет память, под эту команду выделено аж пять разныхопкодов. Подробнее - [тут] и [тут].--------------------------------------------------------------------------------[/terminus]Ув. Keng , у меня вопрос... В этом уроке ты учил делать фильтр (отличать свои хп от чужих) Но там использовался адрес здоровья врага , вроде он там статический ... А как написать скрипт , если он динамический и при перезапуске игры меняется ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения