В этой теме мы перейдем к рассмотрению более мощного отладчика, т.к. дальнейшие уроки, будут уже проходить с ним. Итак, азы OllyDBG (мы используем версию 1.10 т.к. под нее можно найти достаточно много плагинов да и 2.0 сыровата).
В первых двух уроках мы уже нашли ячейку памяти в которой игра записывает сумму набранных балов, нашли потом инструкцию в игре которая непосредственно отвечает за запись в эту ячейку памяти, в отладчике утилиты Cheat Engine увидели относительный адрес (или смещение) инструкции относительно модуля. Теперь для практики научимся зная относительное смещение, получать фактическое место нахождения инструкции в процессе который является нашей игрой. Можно конечно работать с относительным дальше и в OllyDbg, но все же посмотрим как получать фактический адрес инструкции.
Включаем Косынку и потом запускаем OLLYDBG, затем в OLLYDBG нажимаем File -> Attach для того чтобы "подцепиться", у нас появляется новое окно в котором мы ищем наш процесс (sol.exe), кликаем на нем один раз, и второй клик на кнопке "Attach", расположенную ниже, и сразу как только желтенькая полоска внизу пробежала (это значит анализ байт-кода закончился, это делается чтоб в отладчике вы видели инструкции ассемблера а не только байт-код) нажимаем F9, для продолжения выполнения процесса, т.к. когда OllyDBG цепляется к процессу она его приостанавливает.
Вспомним - когда в Cheat Engine мы видели относительный адрес, Мы знаем что интересующая нас инструкция была написана так "sol.exe+30b8", sol.exe, это один из модулей внутри процесса.мы видели строку вида "sol.exe+30b8", что значит адрес инструкции "mov [esi+30],eax" находится на 30b8-м байте от точки начала модуля "sol.exe". Точка начала модуля sol.exe, называется базовым адресом.
Так, мы знаем, что нам нужна инструкция "mov [esi+30],eax", в модуле "sol.exe" которая внутри него находится на 30b8-м байте. Адрес начала самого модуля, может отличаться от каждого запуска игры, загрузки системы и так далее, например в S.T.A.L.K.E.R. основной модуль который интересен, это xrEngine.dll, который очень часто меняет свой базовый адрес (точку от которой он загружается в память).
Найдем в OllyDBG где же находится базовый адрес модуля. Для этого открываем меню View -> Executable Modules , появится окошко. Теперь находим в этом окне нужный на модуль. Вот здесь то и указан в первой колонке (Base) базовый адрес каждого модуля. Смотрим. У sol.exe он 01000000, и кликнем по нему два раза.
Появляется у нас еще одно новое окно с байт-кодом и программным кодом на языке ассемблера этого модуля:
Запускаем обычный Windows калькулятор, и переключаем у него вид в "Вид -> Инженерный" (Windows XP), на Windows 7
это вид называется "Вид -> Программист" Ставим там отметку на "Hex"
Теперь плюсуем наш базовый адрес с тем относительным адресом, который мы нашли в Cheat Engine. Адрес был sol.exe+30b8, значит 1000000 + 30b8 = 10030b8
Можем это вспомнить в уроке №2 по Cheat Engine где мы узнали как находить что же собственно изменяет значение в памяти (или посмотреть оттуда там картинку)
И так в OLLYDBG нажимаем комбинацию клавиш Ctrl+G, и в появившемся
окошке пишем "10030B8" (без кавычек) и жмем ОК.
Перед тем как кликнуть по нему два раза, нажимаем клавишу F12: Это приостановит выполнение самого процесса, чтоб не произошло моментального сбоя. Дальше два раза кликаем по строке на которую стал курсор и у нас появляется окошко. В этом окошке мы так же как и в предыдущем уроке пишем "nop" (без кавычек) т.е. ничего не делать (в Cheat Engine мы так же делали Replace with code that does nothing) и не забываем поставить галочку на Fill with NOP's (это нужно сделать потому, что инструкция mov [esi+30],eax, в байт-коде, занимает 3 байта, а инструкция nop - 1 байт, таким образом, если заменить только 1 байт, то получится неправильная инструкция, удалить "лишний" код, тоже нельзя, но можно сделать чтобы он ничего не делал, таким образом мы это и делаем), жмем кнопку Assemble.
Заходим в Косынку и пробуем прибавить себе очков...... Если не получается набить там очки, значит мы все правильно сделали. Если бы сделали неправильно, то в ячейку запись по-пержнему бы производилась, а если бы накосячили с правкой ассемблерного кода, скорее всего процесс (игра) завалилась бы с ошибкой.
P.S. Спасибо за полученные знания Андрею ( ShadowAGT ).
Если что не правильно написал, по правьте. Или если вам непонятно что-то, можете тут и спросить. Будем рады пообщаться, и обменяться опытом! Желающие научиться и стать разработчиками - присоединяйтесь!!!
Весь этот урок я делал и на Windows 7 и Windows XP.Все отлично работало.