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

Нужна помощь в написании скрипта...


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

К примеру возьмём 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"+5839B
jmp returnhere

"GAME.EXE"+58384:
jmp newmem
returnhere:

[DISABLE]
dealloc(newmem)
"GAME.EXE"+58384:
mov [eax+04],edi
jle "GAME.EXE"+5839B

post-24-0-15330500-1439397233_thumb.png

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

[terminus]--------------------------------------------------------------------------------

Привет! Думаю, код изменения жизней и код получения опыта пересекается. Скорее

всего, у жизней есть максимальный уровень (0-100, 0-110 на втором уровне, 0-120

на третьем уровне и так далее), так что тебе нужно будет найти это максимальное

значение и изменить скрипт таким образом, чтобы в инструкцию всякий раз

записывалось именно оно, а не просто отключалась инструкция изменения текущего

значения. Могу попробовать показать на примере, но мне нужна игра для этого.

Пока что могу только предложить внимательно изучить стек и содержимое регистров,

а так же поискать то самое "максимальное значение" и выяснить, что его читает

или в него пишет.

--------------------------------------------------------------------------------[/terminus]

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

В структуре скорее всего будут рядом максимальное кол-во живучести.

А скрипт будет выглядеть примерно так:

[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
Ссылка на комментарий
Поделиться на другие сайты

[terminus]--------------------------------------------------------------------------------

Да, Гарик прав. В той же структуре, но по другому смещению оно должно лежать.

Самый простой способ выяснить это смещение (помимо анализа глазками) - это

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

уровня - в общем, тогда, когда меняется максимальное количество. Должна быть

инструкция, которая один раз срабатывает, но с другим смещением.

--------------------------------------------------------------------------------[/terminus]

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

Garik66 Спасибо за идею посмотрел в структуре нужно просто [eax+0C] вставить.

Но не понятно только в скрипте что это @f и это @@: ...объясните мне.

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

@@: - Это безымянная метка

@F - Это прыжок вперед на ближайшую безымянную метку.

Есть еще @B - это прыжок назад на ближайшую безымянную метку.

Безымянная метка аналогична записи "label(name)", только ее не нужно создавать, а с прыжками итак все понятно должно быть, я думаю.

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

@@ - безымянная метка.

@f - короткий прыжок вперёд на ближайшую безымянную метку.

@b - короткий прыжок назад на ближайшую безымянную метку.

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

[terminus]--------------------------------------------------------------------------------

А еще, по большому секрету скажу, можно прыгать на количество байт:

jmp short 00h-7Fh ; Вперед (вниз) по коду

jmp short 80h-FFh ; Назад (вверх) по коду

Команд jmp, на самом деле, довольно много. Основная разница - это short и far, а

в 80x86, если мне не изменяет память, под эту команду выделено аж пять разных

опкодов. Подробнее - [тут] и [тут].

--------------------------------------------------------------------------------[/terminus]

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

В общем всё понятно...и как это делается!...Спасибо всем за инфу. Тему можно закрыть если что.

Вот какой скрипт у меня получился:

alloc(newmem,64)

label(returnhere)

newmem:
cmp [eax+20],00080000
jne @F
mov edi,[eax+0C]

@@:
mov [eax+04],edi
jle "GAME.EXE"+5839B
jmp returnhere

"GAME.EXE"+58384:
jmp newmem
returnhere:

[DISABLE]
dealloc(newmem)
"GAME.EXE"+58384:
mov [eax+04],edi
jle "GAME.EXE"+5839B

Я то не новичок в АSМ\HACK, просто привык по старинке делать.

Вот тут решил кое что новое приобрести\навык.

А про прыжки команд я ещё с TSearch'а помню.

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

  • 1 месяц спустя...

[terminus]--------------------------------------------------------------------------------

А еще, по большому секрету скажу, можно прыгать на количество байт:

jmp short 00h-7Fh ; Вперед (вниз) по коду

jmp short 80h-FFh ; Назад (вверх) по коду

Команд jmp, на самом деле, довольно много. Основная разница - это short и far, а

в 80x86, если мне не изменяет память, под эту команду выделено аж пять разных

опкодов. Подробнее - [тут] и [тут].

--------------------------------------------------------------------------------[/terminus]

Ув. Keng , у меня вопрос...  В этом уроке ты учил делать фильтр (отличать свои хп от чужих) 

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

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

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

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

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