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

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

Всем привет. Помогите пожалуйста. Вот в чем проблема. В игре пытаюсь найти 'шанс критического удара'. При добавлении 1 бала способностей 'шанс крит.удара увеличивается на 2, это в % соотношении. Что я делал: иследовал инстукции которые работают с атрибутами и навыками, умениями,далее ставил бряки на значения и инструкции,(на запись и доступ), затем исследовал все регисты при бряке на расструктаризацию и фиксирование на изменения, в итоге так и не нашел нужного. Единственное что мало исследовал стек, так как в нем плохо разбираюсь, а в нем большой потенциал получение нужного. Получается что при начислении очков способностей срабатывает умножение либо деление. Поиск и отсев тоже не помог. Какие еще варианты поиска могут быть ? Еще как можно увелить значение таймера инструкцией 'fld [edi+18] ',а не делая его постоянным через ' mov ' ?

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

Использовать поиск неизвестное значение, далее увеличелось, уменьшелось или изменилось, не изменилось...

Я так именно и делал, ничего с этого не вышло. Оставшиеся адреса просто перестают менятся.

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

Поиск и отсев тоже не помог. Какие еще варианты поиска могут быть ?

Что значит "поиск и отсев тоже не помог"?

Значения в игре могут иметь любой тип данных, но представляться в виде процентов. Бывает и так, что данные могут идти не по нарастающей, а по убывающей, то есть, исходя из экранного представления шанса критического удара, в виде процентов, можно предположить, что максимальным значением будет равным 100%, и это не значит, что реальное значение должно быть равным 100, оно может быть равным и 0 (нулю).

Еще раз:

Допустим, реальное значение в игре имеет тип данных 1 байт (беззнаковое), диапазон которого: от нуля до 255. Соответственно: значение "255" - будет приравнено к 0% шансу критического удара, и "0" (ноль) - как 100% шанс. И наоборот.

Значит, нужно искать методом "неизвестное значение", и "изменилось"/"не изменилось". Но это только основы, на деле же игра может часто менять адреса, поэтому найти нужный адрес становится труднее. И как один из вариантов: можно выйти на структуру игрока, и в ней найти значение этого самого шанса критического удара (скорее всего, структура будет вложенная, т.е. содержать указатель на структуру боевых характеристик персонажа).

В данную игру я не играл, поэтому не могу сказать, как и в какую сторону копать, на деле же, возможно, все будет проще.

Еще как можно увелить значение таймера инструкцией 'fld [edi+18] ',а не делая его постоянным через ' mov ' ?

А чем mov не угодил?

mov dword ptr [edi+18],(float)60
Или имеется в виду "одноразовое" увеличение таймера (по нажатии хоткея, например)? Тогда придется заводить переменную-флаг, и уже по ней ориентироваться.
Ссылка на комментарий
Поделиться на другие сайты

Еще как можно увелить значение таймера инструкцией 'fld [edi+18] ',а не делая его постоянным через ' mov ' ?

NullAlex правильно написал нужно 

 

заводить переменную-флаг, и уже по ней ориентироваться.

так как инструкция 

mov dword ptr [edi+18],(float)60 

просто замораживает значение из-за того что игровая инструкция 

fld [edi+18] 

постоянно (т.е. часто) обращается к адресу.

Т.е. код инъекции будет выглядеть примерно так:

cmp [flag],1jne originalcodmov dword ptr [edi+18],(float)60mov [flag],0originalcod:fld [edi+18]jmp returnflag:dd 1 

или, если хочешь, чтобы можно было менять начальное значение таймера, то так:

cmp [flag],1jne originalcodmov [flag],0fld [TimerNew]jmp returnoriginalcod:fld [edi+18]jmp returnflag:dd 1TimerNew:dd (float)60 / вводим в таблице адрес с адресом и названием TimerNew и меняем на 2, 3 минуты и т.д.

ЗЫ: Если дальше в игровом коде нету что-то типа:

fstp [edi+18]

то последний код нужно будет немного изменить.

В игре пытаюсь найти 'шанс критического удара'. Какие еще варианты поиска могут быть ?

Скорее всего сам 'шанс критического удара' в игре - это константа. а меняются именно кол-во вложенных очков в это умение и игровой код умножает кол-во вложенных очков на константу. Соответственно нужно искать целое значение (скорее всего 4 байта), но для отсева нужно несколько очков умений, чтобы вложить. 

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

NullAlex

Структуру игрока я исследовал и нашел там массу интересного но не то что искал, подструктурные указатели фиксировал на изменения но не смог в них разобратся. Попробую тогда метод на уменьшение, аналогом примера это снятие одевание предмета который меняет значение крит.удара. Что касается таймера, то через команду 'моv' значение становится постоянным и не уменьшается. Иследовав стек нашел что таймер работает под смещением [esp+18], а в [esp+24] вычитается на (float)-0.02. Можно конешно б было прописать так 'mov [esp+24],(float)0.01, но это не то. Хотелось бы прописать всем способностям (float)30. В [edi+14]находится начальный таймер отчета, но скрипт с ним не работает,

Garik66

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

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

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

А можно полную картину на доступ к адресу? И скриншот стека.

По идее можно на прямую работать со стеком. То есть создать метку и работать с float.

Например

Fld dword ptr [esp+24]

fadd dword ptr [labla]

fstp dword ptr [esp+24]

labla:

dd (float)0.02

то есть по идее таймер замрет на месте.

К примеру в игре Two worlds2 при бряке на отнимание жизней(игрока или мобов в стеке прописывается урон)

То есть

fild dword ptr [esp+4] //загружаем в барабан урон(целое значение)

fimul dword ptr [mulls] //умножаем на наш множитель(прописываем вручную)

fistp dword ptr [esp+4] //выгружаем из барабана в esp+4 полученное значение

mov eax,[ecx+000001C0] //оригинальная инструкция

Дополню что инструкция идет на доступ, потому что "mov [ecx+000001C0],eax" ,корорая пишет, урон уже будет посчитан. Поэтому со стеком желательно работать с инструкциями на доступ.

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

Попробовал твой Пример со стеком, у меня не вышло Видимо что то сделал не так. Вот Скрин стека на урон по  Врагу.

Esp+4 Это уронEsp+8 Это Жизни врагаEsp+14 Может быть это множитель уронаEsp+20 урон cmp dword ptr [edi+0000011C],00 Это инструкция разветвления свой - чужой. 0 враг, 1 игрок,
 

Как правильно записать стек в скрипт ?

fild dword ptr [esp+4]fild dword ptr [esp+20]sal [esp+4],2sal [esp+20],2fistp dword ptr [esp+4]fistp dword ptr [esp+20]  fild dword ptr [esi]mov [esp+08],eax  jmp return
Такой  вариант не работает,

С таймером Разобрался немного Проанализировав инструкции Получилось  так

code:cmp [esi+00],017B2148 //Invisiblcmp [esi+00],017B2068 //обзорjne @fmov [esi+14],(float)-1fld dword ptr [esi+14]jmp return@@:  //fld dword ptr [esi+14]  fstp dword ptr [esi+18]  jmp return

NullAlex: Тег кода не зря придумали.

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

Инструкция только с адресом врагов работает? И надо отталкиваться с инструкции которая пишет или читает а не сравнивает.

Можешь сделать скрин доступа на адрес жизней?

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

42fe977c99ec.pnghttp://i004.radikal.ru/1509/f6/42fe977c99ec42fe977c99ec.png.png

 Инструкция обращаемая общая, Работает со всеми

NullAlex: Тег спойлера не зря придумали.

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

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

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

61bf077824b3.png

f7b37751fd51.png

NullAlex: Зачем одни и те же ссылки дублировать по нескольку раз? Да еще и обрамлять в тег цитаты, которой не существует? И повторяю: тег спойлера не зря придуман.

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

NullAlex, извеняюсь, не специально, просто еще не разобрался как правильно заливать, путаюсь.

Lamalamaz, увы, скрипт включается но не работает. Что если сделать так, использовать фильтр на инструкцию записи жизней, на игрока стандартно, а на инструкцию врагов приписать деление (div). Как правильно написать что бы деление проводилось на 2 ? . Урон всегда проходит по инструкциям работающими с жизнями ?

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

Что именно не работает? Множитель урона отображается? З.Ы. Множитель урона можно менять на лету в таблице,по умолчанию стоит 1. Поставь 400(к примеру) и проверь должно

всех с 1 удара выносить.

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

"lamalamaz", пробовал варианты от 1 до 100, урон от изменений не менялся. Но попробую от 1000 и более. А если в общем как можно выйти на инструкцию урона ? Если по трассировке стека или доступа ? Может с помощью каких еще инструментов отладчиков ?

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

Поправлю скрипт, наверное смещение динамическое(то есть значение по смещению)

Я не выходил на инструкцию урона, я сам написал скрипт рассчитывающий урон то есть.

mov [esi],ecx Инструкция на запись жизней где

[esi] предыдущее значение жизни

ecx новое значение жизней

mov [lbl],ecx //новое значение в метку

fild dword ptr [esi] загружаем старое значение

fisub dword ptr [lbl] отнимаем новое значение

fistp dword ptr [dam] получаем урон

fild dword ptr [dam] загружаем урон

fimul dword ptr [mn] умножаем на множитель

fistp dword ptr [dam] полученный урон умноженный на множитель

fild dword ptr [lbl] загружаем новое значение жизней

fisub dword ptr [dam] отнимаем урон умноженный на множитель

fistp dword ptr [lbl] получаем значение жизней уже с вычетом урона с множителем

mov ecx,[lbl] загружаем полученное значение по адресу значения новой жизни

mov [esi],ecx оригинальная инструкция

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

Попробуй этот скрипт(что странно смещения судя по скриншотам одинаковые,у меня скрипт работает,но попробуй измененный скрипт).

EoCApp2.CT

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

Lamalamaz, хорошо, проверю отпишу. Суть в том, что сами игры мне не так интересны как менять самому игровой код под свой лад, этот процесс куда более интересней и увлекательней. Хотелось бы разобрать игру более детально. Возможно что шанс на крит.урон находится под числом 4000, как множитель, которое находится в стеке по смещению урона. Esp+4.региона памяти. Так как через стек вышел на инструкцию отвечающую за % (fmul) отношение успешного выполнения любого заклинания а также на магические возможности оружия(заморозить, окаменить,т.д) и на время продолжительности заклинаний и их параметров. Если интересно потестить могу скинуть.

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

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

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

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