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

Лидеры

  1. JustHack

    JustHack

    Разработчики


    • Баллы

      5

    • Постов

      342


  2. MasterGH

    MasterGH

    Ветераны


    • Баллы

      2

    • Постов

      2 999


  3. partoftheworlD

    partoftheworlD

    Пользователи+


    • Баллы

      1

    • Постов

      2 687


  4. xapek

    xapek

    Пользователи


    • Баллы

      -9

    • Постов

      64


Популярный контент

Показан контент с высокой репутацией 13.03.2018 во всех областях

  1. 1. Персонаж падает с большой высоты и разбивается Ищем адрес скорости прыжка прыгая под speedhack. Находим эту скорость. Ставим бряк на доступ. Прыгаем. Инструкции на чтение добавляем в список адресов и там начинаем нопить - Либо по одной - Либо рискнем по половине от половины - Либо рискнем и все сразу занопим Если повезет, а должно повезти, то инструкция не прочитает то значение скорости, которое уложило бы персонажа на землю и можно будет прыгать на огромную высоту. 2. Как делать супер прыжок Ищем под speedhack скорость float (назовем её velocityZ, Z - вертикальная ось) по вертикальной оси прыгая персонажем. Когда прыгаем. то скорость в один момент увеличивается. Затем, скорость постоянно уменьшается от положительного до отрицательного значения. Когда на земле, то скорость быстро записывается и равна нулю. Дальше смотрим что это рабочий адрес. Прыгаем и замораживаем значение. Если адрес рабочий, то персонаж зависает в воздухе или движется. Дальше ставим бряк на запись на этот адрес и снимаем speedhack Прыгнули и увидели инструкции. Например одна из них будет movss [rdi+0000010C],xmm0 и работает каждый раз при прыжке по одному разу за прыжок (прыгнули — сработала, прыгнули — сработала). Вот в неё и легко сделать инъекцию с рядом стоящими адресами с умножением на scale величину. Все и персонаж будет с суперпрыжком. Чтобы он не разбивался при прыжке смотрим пункт1 Еще один вариант — не писать инъекцию кода, а искать адрес силы прыжка в структуре. Это можно сделать меняя значения в структуре где-то рядом с [rdi+0000010C] и смотреть что происходит в игре. Можно найти, а можно и не найти, и возможно этот процесс будет долгий. Еще можно в пошаговой отладке пройтись, посмотреть стек, протресить и попробовать найти адрес в структуре (при чем структура не обязательно будет с адресом в rdi) без рандомного поиска в структуре. Но у последнего есть свои плюсы, можно найти разные параметры движения игрока и увидеть изменения в игре. 3. Менять данные в структурах или менять код? В примере выше пришлось создать два новых поля scaleXY: dd (float)4 scaleZ: dd (float)4 И умножать их на скорости X,Y,Z персонажа. С одной стороны больше кода писать и добавлять новые поля, а с другой стороны выделить время и найти подход к поиску значения стартовой скорости в структуре. Можно в структуре ничего не искать, а написать скрипт выше и это может быть быстрее чем искать в структуре. С другой стороны если в структуре рандомно ставить параметры в течении времени X на 4К байт, то можно найти: адрес скорости, адрес гравитации, адрес чувствительности и много чего еще. И еще одно ограничение. Расструктуризация не всегда правильная. Упорно вместо float может видеть 4 байта. Это в лучшем случае, в худшем разные смешения смержены и выводятся разные типы данных. В общем исследование игровой структуры эта тема интересная. Можно сказать это поиск свойств, по которым будет меняется поведения персонажа в игре. Структуру желательно обследовать какой оффест, что делает и какого он типа (через брейкпоинт). Это всего 4К байт проанализировать. Каждое смещение подписать и сохранить. Сделав это вы скажите себе я исследовал всю структуру и знаю, что делает смещение. Lua может помочь автоматизировать анализ структур и пока я думаю об этом. Данные структур могут сильно повлиять на поведение персонажа, на прохождение потоком отладочных инструкций игры по разным условиям — выполнять и не выполнять ответвления кода с разными условиям. В общем есть над чем подумать. Всегда было приоритетным менять код, но теперь стал задумываться о том чтобы больше смотреть в сторону правки данных структур. Фактически код мы не правим, а меняем данные и код работает уже с другими данными.
    1 балл
  2. Наконец-то дошли руки до третий части. Речь пойдет о создании структур программно. Пример, что будет в конце записи Сразу к делу. Нужен поинтер и процесс. Запустим туториал из Cheat Engine из меню Health->Cheat Engine Tutorial. Прохождение туториала подробно описано здесь Подключаемся к процессу идем на 8-мой шаг. В руководстве есть поинтер [[[["Tutorial-i386.exe"+XXXXXX]+C]+14]+0]+18 Вместо XXXXXX может быть любое смещение. Поэтому надо бы поискать Нашил адрес. Поставили бряк. Нашли esi Поставили бряк Вышли сюда Поинтер получили, дальше пойдет Lua. Открываем Lua консоль и проверяем поинтер Выведем адрес и его значение Окей. Поинтер верный. Другой вариант читать значение поинтера примерно такой local address = getAddress("game.exe") address = readPointer(address + 0x123) address = readPointer(address + 0x456) local value = readFloat(address + 0x789) Есть и такие варианты value = readInteger("[[[[[[[[[witcher3.exe + 028F3F60] +0] +18] +20] +40] +40] + 1c0] +10] +28]") value = readFloat("[[[[[[[[[witcher3.exe + 028F3F60] +0] +18] +20] +40] +40] + 1c0] +10] +28]") value = readDouble("[[[[[[[[[witcher3.exe + 028F3F60] +0] +18] +20] +40] +40] + 1c0] +10] +28]") Теперь самое интересное — создание структур с помощью Lua Построим структуру [[[[005FD660]+C]+14]+0]+18. На +18 будет наш адрес. Сначала построим один уровень —"005FD660" Если выполнить скрипт выше, то мы построим структуру одного уровня. Построим теперь структуру двух уровней "[005FD660]+C". Второй уровень нужно развернуть Для этого после создания структуры создам дочернюю myStructure2 = createStructure('MyStructure2') myStructure2.autoGuess('[005FD660]', 0, 50) -- И поместим её по индексу local offset = 0 myStructure.getElementByOffset(offset).setChildStruct(myStructure2) -- Чтобы развернуть список поитеров. К сожалению разворачивается только два уровня structureFrm.Menu.Items[1][6].doClick() Итого получается такой скрипт до второго уровня Создадим и развернем весь указатель [[[[005FD660]+C]+14]+0]+18 Не будем делать через цикл, чтобы не усложнять. Полный скрипт Результат Ну и на закуску. Допустим мы знаем что по адресу X будет всегда тип float (как X,Y,Z координаты). Но расструктуризация будет показывать другой тип, дизассемблер будет показывать другой тип — 4 байта. Что делать? И сразу еще допустим double тип всегда хотим как float тип (в виде комментов в дизассемблере или в расструктуризации) Воспользоваться следующей функцией -- Может менять тип адреса x в окне дизассемблере в комментариях, когда в инструкции существует адрес -- Может менять тип адреса в окне расструктуризации -- Изменив тип, будет ображаться значение другого типа onAutoGuess(function) : Registers an function to be called whenever autoguess is used to predict a variable type function override (address, ceguess): Return the variable type you want it to be. If no change, just return ceguess Ну и вот два примера upd: спрятал код под спойлеры
    1 балл
  3. С той которая тебе нравится, прям с любимой игры, которая бы не надоела за все время исследований, легких игр нет, каждая по своему устроена в этом и смысл, разбери её на исходный код, вот тебе и цель, а походу дела будешь разбираться и с асмом и опыта наберешься, после этого сможешь любую игру взломать, так же просто как регистр обнулить.. я ни одной по асму не прочитал
    1 балл
  4. Я раньше учил языки программирование, просто и мне легко как то, память хорошая
    0 баллов
×
×
  • Создать...

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

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