Статус темы:
Закрыта.
  1. HelBot Младший Cержант

    Регистрация:
    22 фев 2014
    Сообщения:
    107
    Симпатии:
    23
    Репутация:
    20
    Пол:
    Мужской

    Взлом gta vice city, метод указателей через artmoney

    Тема в разделе "ArtMoney", создана пользователем HelBot, 19 мар 2014.

    Взлом GTA Vice City, метод указателей через ArtMoney

    Игра: Grand Theft Auto - Vice City
    Цель:
    Бессмертие только для главного героя
    Инструменты:
    Artmoney, TSearch
    Дополнительно: использование метода указателей


    Итак, начнем. Запускаем игру, запоминаем количество жизней:

    [​IMG]

    сворачиваем игру и запускаем Artmoney и выбираем игру из списка процессов.

    [​IMG]

    Далее делаем поиск:

    [​IMG]

    Почему именно так? Да потому, что жизни в вайсе хранятся в переменной с плавающей точкой. Далее делаем что-нибудь, чтобы потратить немного жизней, например падаем с крыши невысокого здания (чтобы не насмерть и чтобы жизней осталось на еще два-три таких падения) Далее делаем отсев с получившимися жизнями по принципу скриншота… то есть диапазон значений вычисляется так:

    нижний порог диапазона = текущие жизни-1
    верхний порог диапазона = текущие жизни+1
    Повторяем отсев до тех пор, пока не останется ОДИН адрес.
    Вот что получилось у меня в итоге:

    В игре:

    [​IMG]

    А в Artmoney:

    [​IMG]

    Как видим, в игре у нас 66 процентов, а в АртМани 66.02 Это потому, что игра просто отбрасывает сотые доли и пишет в жизни тока целую часть. Наверное это сделано для затруднения взлома игры. Ну да нам это не помеха :)

    Запускаем TSearch:

    [​IMG]

    и открываем процесс игры. Надеюсь с этим вы справитесь без меня...

    Далее включаем отладчик:

    [​IMG]

    и открываем AutoHack window. Тоже надеюсь, что найдете где.

    В этом окне нажимаем зеленую стрелочку:

    [​IMG]

    Эта стрелочка позволяет установить breakpoint (точку останова) на адрес наших жизней:
    [​IMG]
    Это наш адрес жизней найденный, в АртМани, вставляем его в окно установки breakpoint’a:

    [​IMG]

    Обратите внимание на тип breakpoint’a: он должен быть открытым, то есть срабатывать и на чтение из этого адреса и на запись. Далее мы возвращаемся в игру и бегаем пару секунд, но жизни НЕ тратим! Да, и в артмани их не замораживаем! После возврата в TSearch видим, что наше breakpoint сработал, и еще как сработал:

    [​IMG]

    Последний из найденных сразу же отсеиваем, так как это сравнение жизней, оно нам не нужно. А вот остальные придется перебирать вручную. Я этого делать не буду, дабы не затягивать туториал, и сразу покажу какой работает на моей версии игры, так как я ее уже ломал. Для начала найдем дырку в коде, для вставки нашей процедуры. Я использую для этой цели CodeCaver:

    [​IMG]

    я воспользуюсь отмеченным адресом, так как в нем много пустого места... Включаем в TSearch очень удобную фишку Easy Write:

    [​IMG]

    Затем нажимаем new:

    [​IMG]

    Получаем такое окно:

    [​IMG]

    В верхней части окна пишется код для патча адресов игры, а в нижней – для восттановления исходных значений, если вдруг вы решили поиграть честно :)

    [​IMG]

    В верхней части набираем такой код: Сразу даю пояснения…

    Код:
    Offset 0x006E794F --- помните, я выбрал этот адрес для своей процедуры fld dword ptr [ecx+0x354] – восстанавливаем оригинальную инструкцию mov dword ptr [ecx+0x354],0x4479C000 – записываем 999.00 в адрес жизней jmp 0x501979 возврат в игровую рутину Offset 0x501973 – инструкция по этому адресу читает жизни jmp 0x006E794F – делаем переход на свою процедуру nop – так как оригинальная инструкция всего 6 байт длиной а переход 5 байт длиной, то нам надо вставить это, для баланса байт, иначе получим вылет из игры.
    А в нижней вставляем это:
    Код:
    Offset 0x501973 fld dword ptr [ecx+0x354]
    То есть восстановление оригинального кода игры, для честной игры. Включив эту опцию, возвращаемся в игру. Мы стали бессмертными. Но что это? Все прохожие и менты тоже стали бессмертными. Вот тут и начинается основная часть нашего взлома.

    Выключаем бессмертие. В окне AutoHack выбираем вкладку Дизассемблера.

    [​IMG]

    Затем делаем все четко по скриншотам:

    [​IMG]

    Этим мы заставим TSearch смотреть, что же происходит в регистрах при выполнении данной инструкции. Далее кликаем на Register:

    [​IMG]

    И видим такое окно:

    [​IMG]
    Проставляем регистры как на скриншоте и включаем наблюдение (красная рожица слева). Возвращаемся в игру. В игре НИ В КОЕМ СЛУЧАЕ НЕ ВСТУПАЕМ НИ В КАКИЕ РАЗБОРКИ И НЕ ТРАТИМ ЖИЗНИ!!! Бегаем пару сек и
    снова возвращаемся в это окно. Вот и нашли значение для поиска указателя (если вы помните, это и есть цель этого тутора):
    [​IMG]

    Далее переводим его в десятичную систему (калькулятором все пользоваться умеют?). И ищем как обычное число в артмани… А можно сразу искать его в шестнадцатиричном. Вот так:

    [​IMG]

    то есть мы вводим в строку поиска шестнадцатиричное значение, и просто напросто подставляем в конце h чтобы дать АртМани понять, что это шестнадцатиричное значение. Скорее всего адресов найдется много. Выходим из игры, АртМани и TSearch не закрываем! Снова заходим в игру и идем в TSearch. Снова выбираем процесс, Включаем отладчик в TSearch’e и переходим в окно Автохака. Оно должно было оставаться открытым. Выключаем наблюдение, снова включаем, переходим в игру, бегаем пару секунд и снова возвращаемся в Автохак

    [​IMG]

    Видим, что регистр изменился… Делаем отсев по этому значению в АртМани… Повторяем заново, до тех пор, пока не останется только один адрес… Если же после 5-6 отсеиваний адресов все равно несколько, то берем любой

    Я взял адрес 0078F7E4 он мне больше всего понравился:

    [​IMG]

    Вот практически и все! Дорабатываем наш код: (Объясняю только то, что изменилось)
    Offset 0x006E794F
    fld dword ptr [ecx+0x354]
    push eax – сохраняю регистр на всякий случай
    mov eax,[0x0078F7E4] – считываю из нашего указателя адрес для сравнения
    cmp ecx,eax – сравниваю с текущим указателем
    pop eax – восстанавливаю регистр (а вдруг он используется)
    jne 0x501979 – если указатели не равны, то возвращаюсь без записи
    mov dword ptr [ecx+0x354],0x4479C000 – записываю жизни
    jmp 0x501979 возвращаюсь в игру.

    А это все без изменений

    Offset 0x501973
    jmp 0x006E794F nop Вот и все!!! Теперь бессмертны только мы!!! На момент выхода эта статья была актуальна, но сейчас уже появились инструменты, более удобные в использовании. В ближайшем будущем данная статья будет переписана с использованием современных инструментов.
Статус темы:
Закрыта.