• 2. Как писать читы: Изменение параметров во время инициализации

    cheaton  - уроки читинга

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

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

    Для пущей наглядности, я буду рассматривать известную если не всем то большинству игру С.Т.А.Л.К.Е.Р. с которой многие знакомы, многие пользовались хаками с помощью так называемой подменой геймдаты поэтому будет проще понять.

    Итак. Когда вы начинаете игру, то главный герой появляется (рождается) у него есть определенные характеристики, предметы и т.д., с потолка это все не падает, при рождении например у него есть точная установка скорости при беге, высота прыжка, сопротивляемость падению ну и еще куча всего. Мы остановимся на последних двух.

    Все характеристики присваемые ГГ хранятся в конфигурации игры, в каком виде существует сама конфигурация в принципе не важно, но в данном случае (для СТАЛКЕРа) это набор .ltx файлов, в которых прописано название параметра и его значение, например jump_speed = 6; это коэфициент высоты прыжка. Потом эти данные считываются из файлов конфигурации программой, и прописываются в создаваемый в памяти процесса объект (структуру данных (характеристик) как хотите называйте) главного героя, а дальше он уже живет с присвоенными ему характеристиками. Так вот, хитрость в том, что эти данные можно подменить в момент либо считывания из конфигурации, либо присвоения в объект, пока для нас это не существенно.

    Чтобы это сделать, нам понадобится уже более серьзеный инструментарий - отладчик (его же называют дебаггер от англ. debugger) и конечно же нам нужно знать что искать, можно и не знать, но для этого нужно уже владеть определенным опытом работы с разными инструментами и хорошо понимать логику построения программ и их работы, я надеюсь все кому действительно интересно, смогут прийти к этому с помощью статей которые я напишу. Мы возьмем отладчик Olly, он не сложный в понимании и обладает достаточным набором функций которые могут потребоваться.

    Давайте рассмотрим его интерфейс.

    1. Слева вверху секция кода программы - это секция дизассемблированного исполняемого байт-кода, т.е. сама программа
    2. Слева внизу секция данных - это секция которая позволяет просматривать участок памяти с любым набором данных или кода, в нескольких предствлениях, обычно представление это шестнадцатиричный вьювер (просмотрщик) байт.
    3. Справа вверху секция регистров - это секция где представлены регистры процессора, математического сопроцессора, SSE, 3DNow и т.д.
    4. Справа внизу секция стека - стек, это вообщем-то не замудренная штука, но некоторым трудно понять что это такое, но несомненно очень важная, которую игнорировать нельзя. Это мы во всяком случае не будем включать в урок.

    Чтобы работать с игрой, запустите игру, затем запустите Olly. В Olly нам нужно подцепиться к процессу, для этого выбирите меню "File -> Attach", в списке процессов выбирите xrEngine.exe, это непосредственно процесс СТАЛКЕРА, когда выбрали и он загрузился и загрузил все библиотеки, нужно выбрать библиотеку которая с наибольшей вероятностью отвечает за игровой процесс. В случае со СТАЛКЕРом это xrGame.dll, для этого выбирите меню "View -> Executable Modules", в нем выбирите упомянутую DLLку.


    Если вы знакомы с программированием, то понять будет просто что я сейчас хочу объяснить, если не знакомы, то настоятельно рекомендую ознакомиться, иначе вы рискуете просто непонять что я хочу до вас донести.

    Для того чтобы из конфига считать какой-то параметр, и записать его в память программы, в большинстве случаев используются функции, которые упрощают хранение этих параметров и получение их из конфигов. Ну например, предствим себе кусочек программы такого вида:

    1. [перем]переменная_указывающая_на_файл = [функция]открыть_файл([текстовая_строка]"X:\somepath\somefile.ltx");
    2. [перем]переменная_параметр_jump_speed = [функция]получить_параметр([текстовая_строка]"jump_speed", [перем]переменная_указывающая_на_файл);
    3. [функция]закрыть_файл([перем]переменная_указывающая_на_файл);

    Вот примерно таким образом получается значение характеристики игрока из конфигурации игры. Это не конкретно взятый язык программирования, но в целом отражает примерно как это происходит в языках программирования высокого уровня, так сказать на экране программиста пищущего игру. Если бы у нас была возможность подправить этот участок кода, мы бы сделали в строке №2 просто что-то типа такого

    2. [перем]переменная_параметр_jump_speed = [число]нужное_нам_значение;

    Но такого счастья у нас нет. Исходники нам никто не даст. В нашем случае, мы можем себе только представлять как все это выглядит у него, поскольку исходников у нас нет! :-( Нам прийдется спуститься до начала начал, и смотреть на язык Ассемблера, который наверное большинство из вас испугает и навсегда заставит оставить эту дурацкую затею - писать читы.

    Ассемблер, не смотря на то что язык низкого уровня, все-же в нем соблюдается та же последовательность что и у программиста в исходниках, но здесь оно разбито на более мелкий и детальный код, такой, который сможет понимать процессор вашего компьютера. Здесь есть те же переменные, только они выступают не как удобоваримые глазу в языке высокого уровня, а в виде регистров процессора которых у нас ограниченное число и стека, той непонятной пока для вас штуки, к которой мы прийдем в других уроках. И конечно же никуда не деваются от нас текстовые строки. Давайте посмотрим строку №2 нашего блока, как примерно это выглядит на ассемблере

    PUSH [перем]переменная_указывающая_на_файл
    PUSH [текстовая_строка]"jump_speed"
    CALL [функция]получить_параметр

    Примерно вот так (понимать не буквально, а логически) это будет выглядеть под дизассемблером для большинства программ написанных на языке Си. Т.е. сначала в стек передаются параметры для функции, потом идет вызов самой функции, ну а дальше будет производится уже манипуляция с полученным значением из конфигурации, запись его куда-нибудь в память объекта или в промежуточную область памяти для последующей записи в объект, не важно.
    Из приведенного выше блока видно, что текстовая строка в ассемблерном коде тоеж есть, и она послужит нам отправной точкой! Мы найдем то место, где считывается параметр!
    Нажатием правой кнопки мыши где-нибудь на пустом месте в секции №1 отладчика, выбираем меню "Search for ... -> All referenced text strings", далее в появившемся окне снова на пустом месте жмем правую кнопку мыши и выбираем "Search for text", в открывшемся окне, набираем нужную нам строку "jump_speed", когда мы ее найдем, нажимаем на на клавиатуре клавишу F2, для того чтобы поставить точку останова программы на исполнение. Точка останова сработает в тот момент времени, когда программа дойдет до выполнения инструкции ассемблера находящейся в этой строке (по этому адресу). Когда мы поставили точку останова, мы можем нажать F9, для того чтобы продолжить выполнение программы. Когда произойдет остановка, нажимая клавишу F8 (но без фанатизма, не нужно жать 1000 раз, обычно то что нас интересует происходит рядом, в ближайших 10-15 инструкций, по крайней мере в большинстве случаев), просмотрите что происходит, будут меняться значеня в секции №3, будут меняться значения в секции №4, и обратите внимание на секцию которая находится слева по центру, между секциями №1 и №2, это информационная секция, которая упрощает жизнь, в ней часто видны цифры и не только, в удобоваримом виде. Так вот, как только вы в ней увидите ST0=6.0000000 (это значение высоты прыжка заданное конфигурацией, в данном случае интересует именно это), нажмите на этой строчке правой кнопкой мыши, и выбирите "Modify value", в открывшемся окошке введите например 50, нажмите "ok", и затем на клавиатуре F9, если же вы не увидели ST0=6.00000000, то скорее всего нужно поискать в другом месте. Если же увидели и исправили, попробуйте прыгнуть, скорее всего получится. Если не получилось, ищите следующую строку, возможно эта была для одиночной игры, а вы пробуете подправить для сетевой, или же наоборот, ниходитесь в сетевой, а подправить пробуете для одиночной. Параметры для сетевой игры и одиночной могут быть разными. Если не нашли нужную строку, пробуйте искать в других модулях и библиотеках и т.д.

    Ну пробуйте, удачи!!!

    P.S. Если есть вопросы, задавайте их здесь, так чтобы можно было понять что вам непонятно.
    Эта статья изначально была опубликована в теме форума: 2. Как писать читы: Изменение параметров во время инициализации автор темы ShadowAGT Посмотреть оригинальное сообщение
    Комментарии 8 Комментарии
    1. Аватар для STALKERDENIK
      Мда спасибо нашёл строку изменил параметры ,но после смети в игре МР параметры восстановились. как с этим бороться
    1. Аватар для ShadowAGT
      Цитата Сообщение от STALKERDENIK Посмотреть сообщение
      Мда спасибо нашёл строку изменил параметры ,но после смети в игре МР параметры восстановились. как с этим бороться
      А это уже надо дальше обучаться. Нужно изменить участок кода программы так, чтобы он не считывал значение, а записывал нужное. Об этом уже есть кое что написанное на форуме, в разделе "Школа" http://cheaton.ru/forumdisplay.php?3...F2%E0%F6%E8%FF , советую почитать. Если хватит терпения и умения понимать материал, дальше подскажу. Прочти уроки, там будет написано о том, как писать 0 вместо заданного конфигурацией числа, какого вида числа в памяти процесса и т.д., если поймешь, то смогу тогда тебе объяснить как изменить так, чтоб писалось нужное число. Без прочтения не поймешь просто... Давай в форум и обучайся. буду рад помочь.
    1. Аватар для Vanhik
      у меня все получилось и прыжок сделал и ещё максимальную скорость падения увеличил так что не разбивался надо будет ещё попробовать какие нибудь функции

      Как нажали F9 и игра продолжилась для следующего останова нужно что бы ГГ погиб и только потом жать F8
    1. Аватар для Ayan
      а на онлайн ирг это прог пойдет???
    1. Аватар для ShadowAGT
      Цитата Сообщение от Ayan Посмотреть сообщение
      а на онлайн ирг это прог пойдет???
      В принципе да, но там все сложнее в том плане, что большинство действий контролируется сервером. Т.е. у себя ты игру надуришь, а вот сервер в это не поверит. При удачном раскладе ничего не произойдет, а в случае неудачи может закончиться твоим баном. Здесь нужно быть внимательным и осторожным.
    1. Аватар для Badim
      И всё всего 5 уроков когда будут следующие?
    1. Аватар для IPX
      поддерживаю когда будут следующие?
    1. Аватар для ShadowAGT
      Почитай форум. Там уже все давно есть.;-)
  • Архив

    Сентябрь   2019
    Вс Пн Вт Ср Чт Пт Сб
    1 2 3 4 5 6 7
    8 9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30