Часть втораяПосле выполнения шагов 1-8, описанных в части первой данной инструкции, у Вас должны быть запущены: игра, в которой Вы напали на отряд нейтралов и повесили на один из отрядов "Жажду крови"; WinHex и IDA, где в окне IDA View-EIP видна интересующая нас инструкция (
add cl, 3) вместе с её адресом в образе исполняемого файла, загруженного в оперативную память (0041FBAE).
9. Установите курсор в строку с найденной инструкцией (
add cl, 3) и выберите пункт меню View -> Open subviews -> Hex dump для того, чтобы увидеть машинную команду, соответствующую данной ассемблерной инструкции. В появившемся окне Вы увидите примерно следующее:
Зелёным цветом выделены три байта: 80, С1 и 03. Это и есть искомая машинная команда: 80 С1 03.
Примечание Если по какой-то причине в окне Hex View подсвечена другая инструкция, вызовите контекстное меню окна Hex View правой кнопкой мыши и выберите пункт Synchronize with -> IDA View-EIP (заголовок окна изменится на Hex View-EIP), а затем в окне IDA View-EIP снова установите курсор в строку с интересующей инструкцией (add cl, 3). Если Вы потеряли эту инструкцию, её всегда можно найти по адресу 0041FBAE (выбрав пункт меню Jump -> Jump to address... или нажав горячую клавишу G).
Обязательно запишите её адрес в исполняемом файле на диске: 0001FBAE (он указан в статусной строке слева).
10. Можно было бы уже переходить к поиску и замене найденной машинной команды в исполняемом файле игры, но сначала давайте всё-таки посмотрим, каким образом значение атаки отряда возвращается к исходному после того, как действие заклинания "Жажда крови" истечёт. В части первой я советовал убрать установленный брейкпоинт. Это было нужно для того, чтобы выполнение игры не прервалось в самом неожиданном месте при запуске игры в следующий раз. Дело в том, что адреса структур данных в оперативной памяти меняются при каждом запуске приложения, поэтому найденный нами ранее адрес, по которому хранится значение атаки отряда Горгулий, при следующем запуске игры был бы уже другим.
Итак, снова установим брейкпоинт на запись по адресу 022A273F (у Вас он будет другим), продолжим игру (F9) и подождём, пока не закончится действие заклинания "Жажда крови", т.е. ровно три раунда. После того, как третий раунд подойдёт к концу, игра прервётся по только что установленному брейкпоинту. Нажмите OK и увидите инструкцию, при выполнении которой произошёл останов, сверху от строчки, выделенной синим цветом.
Чуть выше Вы можете видеть инструкцию
sub cl, 3, которая вычитает число 3 из значения регистра
cl. На языке игры это означает, что при снятии заклинания "Жажда крови" атака отряда уменьшается на 3 ед.
Теперь Вам должно быть понятно, зачем мы проделали этот дополнительный объём работы. Ведь если бы мы просто заменили первую инструкцию (
add cl, 3), но оставили бы без изменения вторую (
sub cl, 3), то столкнулись бы с неприятными последствиями в виде неправильно работающего заклинания "Жажда крови".
Аналогично пункту 9 находим машинный код, соответствующий ассемблерной инструкции
sub cl, 3, а также записываем её адрес.
11. Время менять инструкции. Сначала выйдем из режима отладки: Debugger -> Detach from process, затем закроем IDA, не забыв сохранить базу данных (просто нажмите OK при закрытии IDA), закроем вкладку Primary Memory (ПКМ -> Close) в WinHex и выйдем из игры. Таким образом, у нас останется открытым только WinHex.
Теперь следует открыть исполняемый файл игры в WinHex'е: File -> Open..., перейти по найденным адресам и изменить машинные команды
add cl, 3 и
sub cl, 3 на нужные нам.
В качестве примера я увеличу прирост атаки отряда на 5 ед. (вместо 3 ед.) при наложении на отряд "Жажды крови". Для этого сначала перейдём по первому найденному адресу. Обязательно убедитесь в том, что значения адресов в колонке Offset являются шестнадцатеричными, а не десятичными. Если они всё-таки десятичные, кликните один раз по колонке. Теперь нажмите Alt+G и в появившееся окошко введите первый найденный нами адрес: 0001FBAE (вводить можно и без ведущих нулей, при вводе также неважен и регистр букв). Если всё сделано правильно, то курсор будет установлен на первый байт машинной команды 80 С1 03 (
add cl, 3). Измените её на 80 С1 05 (
add cl, 5). Аналогичным образом замените инструкцию
sub cl, 3 на
sub cl, 5.
Теперь осталось только сохранить внесённые в исполняемый файл игры изменения: File -> Save As..., закрыть WinHex и запустить игру, чтобы убедиться, что всё работает.