Что такое оффсеты в читах

Guide Чтож вы такое, Оффсеты?

    Thread starter bot Start date Dec 18, 2020

Очень часто на форуме встречаются посты, из которых видно, что многие не могут понять, что такое офсеты.
И я подумал, если попробовать «разжевать» данную тему, вопросов будет меньше.
Я не профессионал в программировании(просто хобби), потому, если будут недочёты, прошу извинить и поправить.

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

Для работы с динамически созданными экземплярами данных и нужны указатели.

Предлагаю написать простенькую программу, и на примере её разобрать что к чему.
Я буду использовать C++Builder6.

Создадим новый проект и сохраним в отдельную папку. Так же для удобства создадим два файла в папке проекта с названиями structs.h и structs.cpp. В них напишем наши тестовые структуры, которые и будем рассматривать.

Тут тестовая структура Party, содержащая указатель на цепочку добавляемых элементов, описывающих параметры членов пати PartyMember.

Тут же в главном модуле объявим глобальную переменную paty.

В событии создания формы мы должны добавить туда к примеру 3 члена, и вывести инфо о них.

Тестовая программка будет представлять собой примерно такое.
Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах
Теперь давайте запустим её, подцепимся к ней с помощью Cheat Engine и попытаемся найти базовый адрес (и не только).
Сначала найдём ХП последнего члена в списке(если не с первого раза нашли, кнопкой уменьшаем ХП и отсеиваем, пока не останется одно значение).

В поле Description лучше сразу писать те значения, которые прибавляются к значениям регистров в окошке MoreInformation
Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах
И далее как в вышеуказаной теме ищем адреса, пока не доберёмся до базового адреса(в данном случае базового адреса модуля Project1.exe, который кстати меняется после перезапуска).

Получится примерно такая картина.
Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах
В итоге мы добравшись до базового адреса нашли эту самую цепочку офсетов(смещений), которая ведёт до значения ХП третьего члена пати.
BA + 48C4 + 8 + 8 + 4 = HP
Но что это за значения, и откуда они взялись? Давайте разбираться.

Чтоб было нагладнее, можно проилюстрировать наш примёр.

Источник

Гайд Понимании концепта сканирования паттернов ( Understanding the pattern scanning concept)

Что такое сканирование паттернов?:
Когда вы пишете вашу программу на C++,код компилируется в машинный код.
Компилятор Visual C++ непосредственно компилирует ваш код в бинарный,но вы можете использовать OllyDbg,x64dbg или любой другой отладчик,что-бы показать его в ассемблере. В создании читов мы используем так называемые оффсеты для доступа к переменным / адресам. Эти оффсеты в большинстве случаев используются в памяти для доступа к определенным данным, как описано ниже.
Чтобы избежать трудностей с обновлением вашего чита при каждом обновлении,либо захватывая оффсеты вручную или используя дампер оффсетов,вы можете реализовать сканирование паттернов
В зависимости от вашей реализации функции сканирования,вы можете предоставить конкретный паттерн,который должен находить внутри диапазона байтов.
Он просканирует байты и найдет адрес,по которому используется желаемый оффсет,что упростит его копирование.
Таким образом,вам не нужно обновлять свой чит всякий раз,когда изменяются оффсеты,вам нужно изменить только паттерн,если меняется код в котором он используется,что происходит не так часто.

Что такое оффсеты,и как они генерируются :
Оффсеты это адреса, часто используемые с другими адресами, например с адресом игрока.
Чтобы понять оффсеты,вам нужно знать размер типов данных. На 32-битной системе целое число,если не указано иное,имеет длину в 4 байта.
Тип bool имеет длину в 1 байт. Эти переменные позже будут размещены в памяти по определенным адресам. Я покажу вам пример написав небольшой класс игрока.

Если мы создадим экземпляр объекта игрока, и дадим ему дурацкие значения,и посмотрим область памяти в Cheat Engine,мы сможем перестроить структуру данных.

Здесь мы можем увидеть наш класс расположенный в памяти, вместе с его адресами. Адрес 18FDAC это наш базовый адрес, адрес нашего класса игрока. Если игра хочет проверить,действителен ли игрок,она может проверить bool m_bIsValid внутри этого класса. В большинстве случаев адрес игрока сохраняется в один из регистров.
В игре, скорее всего, будет такая инструкция,как

Как я смогу реализовать сканирование паттернов?:

В этом примере я буду использовать оффсет здоровья для нашего локального игрока(LocalPlayer). Я сначала добавлю указатель на LocalPlayer,чтобы мы знали адрес нашего LocalPlayer.

Вы так-же можете использовать checkbox «Pointer»,однако я его использую только для многоуровневых указателей.
Сейчас щелкаем на правую кнопку мыши,и нажимаем на «Find out what accesses this address». Он присоединит отладчик к процессу,и покажет все инструкции обращающиеся к адресу.

Закрываем Cheat Engine и открываем OllyDbg. Убедитесь,что у вас плагин SigMaker установлен. Подключаем OllyDbg к игре,и ждем пока загрузится.

После завершения загрузки щелкните правой кнопкой мыши, и нажмите «Go to» и кликнете на выражение.

Теперь вам нужно скопировать адрес,который содержит адрес инструкции,и вставить его в диалог «Go to expression».
Важно,чтобы вы не закрывали игру между копированием адресов с Cheat Engine и переходом по адресу в OllyDbg,иначе он будет иметь другой адрес.

После этого вы можете немного прокрутить вверх, чтобы увидеть окружающие байты инструкции в этой инструкции.
Инструкции можно найти по середине,а hexadecimal представление слева от инструкций.

Поскольку hexadecimal имеет основание 16,каждый байт должен иметь 2 символа, представляющих их.
imgur.com

Возможно, вы уже заметили, что в hexadecimal хранится наш оффсет. Он хранится в обратном порядке, хотя, если мы прочитаем его позже, мы получим правильный адрес.

Опять же, функция сканирования паттерна выполняет итерацию по байтам, пока не найдет сигнатуру, соответствующую паттерну.

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

Но подождите, допустим, оффсет изменился. Теперь это 0x100, паттерн на правой стороне не будет совпадать с байтами на левой стороне, так как FC000000 теперь будет 00010000.
Вот для чего нужны так называемые «подстановочные знаки». Подстановочные знаки будут пропускать байты, которые могут отличаться, например оффсет, но также и другие адреса, которые могут меняться каждый раз.
Обычно плагин SigMaker перехватывает эти адреса и заменяет их знаками подстановки во всплывающем окне, однако он не делал этого для этого оффсет, вероятно, потому что это очень маленький адрес.
Обычно он заменяет те, которые могут изменить адреса на \x00 в паттерн(также называемом сигнатурой), и заменяет соответствующий ‘x’ в маске на ‘?’.
На этот раз нам придется сделать это вручную. Поскольку длина адреса четыре байта, мы хотим обнулить четыре байта, в которых хранится адрес.
В зависимости от вашей реализации вам может также понадобиться маска, поэтому не забудьте также изменить ее.
Убедитесь, что вы получите только один результат, щелкнув «Scan», прежде чем использовать паттерн. Он нашел паттерн только один раз, что означает, что мы можем использовать этот паттерн.
Поскольку я не использую маску для своей реализации, мне нужно только заменить \xFC на \x00.

Теперь мы можем написать функцию сканирование паттернов. Я буду использовать свой класс CPatternScan,который грузит байты модуля в кучу и их там хранит,пока объект не будет уничтожен.
К концу этого туториала вы были должны полностью понять концепцию сканирование паттернов,и немного помудав,вы сможете создать свой класс сканирование паттернов под свои нужды.

Но подождите,мы что-то пропустили? Почему это не дает нам правильного оффсета? Что-ж давай еще раз взглянем.
Функция возращает адрес,по котрому найдет паттерн,это означает,что она вернет нам эту позицию(
оносительно индекса в моем случае, она также может вернуть вам адрес, который вы можете прочитать через ReadProcessMemory)

Если вы прочитаете следующие четыре байта по адресу, возвращенному функцией сканирования паттернов, вы, по сути, прочитаете следующее:

Очевидно, это не тот результат, который вам нужен, так как это не тот оффсет, которой вам нужен.
При этом вам нужно добавить собственный оффсет поверх возвращенного адреса / индекса. Поскольку мы знаем,что hexadecimal имеет основание 16,и следовательно для отображение одного байта нужно 2 символа,выделенное поле имеет длину в 4 байта.
Сразу после этих четырех байтов находится желаемый оффсет. Это означает, что вам нужно прочитать / скопировать адрес, который вернула функция + 4 байта. Это будет адрес / индекс, где хранится оффсет.
Предположим вы хотите прочитать байты 00 00 7F 2D.Что-бы получить правильный адрес,вам нужно посчитать байты перед байтами,которые вы хотите прочитать.

В привиденом выше случае будет 7 байтов. Возьмем адрес/индекс возращаемый функцией сканирование паттернов,и добавем к нему 7 байтов,и мы должны получить правильный оффсет.

Давайте возьмем другой пример,на этот раз со статическим указателем на LocalPlayer.
Если мы выполним сканирование указателя в Cheat Engine,желательно несколько раз,чтобы убедить что наш результат всегда указывает на LocalPlayer, мы можем увидеть несколько указателей которые указывают на LocalPlayer.
Давайте попробуем создать паттерн для указателя LocalPlayer, который мы использовали ранее, чтобы сделать себя паттерном оффсета здововья.

Мы сканируем несколько раз, повторно просматривая предыдущие результаты после перезапуска игры. Это устранит временные указатели и покажет нам указатели которые, кажется, всегда указывают на LocalPlayer.

Но подождите, есть только одна инструкция, которая обращается к этому указателю в данный момент времени, и она не содержит фактического оффсета в своей инструкции. Как нам его взять?

Итак, возьмем следующий, client.dll + 4A98144.Дважды нажмите по нему, чтобы добавить его в наш список адресов и узнать, что обращается к этому указателю.
Мы можем видеть множество инструкций, которые перемещают регистры, поэтому мы не можем считывать регистры, не подключив функцию и не прочитав регистры в этот момент.
Но у нас также есть инструкции, содержащие абсолютный адрес. Нажав по нему один раз, мы увидим, что этот абсолютный адрес состоит из client.dll + 4A98164, что означает, что это статический глобальный указатель, который всегда будет по базовому адресу модуля client.dll module + 4A98164.
Но если мы сравним этот оффсет с нашим оффсетмо в списке указателей, мы увидим, что оно отличается на 10 байт. Почему?
Давайте добавим указатель в наш список и просмотрим область памяти, на которую он указывает. Текущий указатель в списке указывает на адрес, на который указывает первая запись в классе игрока, поэтому мы не можем просматривать эту область памяти.

Мы можем видеть множество адресов в этой области памяти, и при более внимательном рассмотрении мы можем обнаружить там наш адрес LocalPlayer, снова сохраненный в обратном порядке.

Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах

Идем на следующий указатель. На этот раз мы видим намного больше инструкций, обращающихся к этому указателю, вместе с тем же оффсетом каждый раз.
Это может означать, что это снова статический глобальный указатель, находящийся в одном и том же адресе при каждом запуске игры относительно базового адреса модуля.
Если мы нажмем по первой инструкции и посмотрим на окно внизу, мы увидим, что абсолютный адрес в инструкции сформирован из client.dll + 4F2B50C, именно то, что мы можем использовать, поэтому давайте дважды щелкнем на эту инструкцию и скопируем информацию.
Но эй, у нас есть инструкция, которая не содержит вокруг себя большого количества полезных инструкций, а это означает, что ее снова можно найти в нескольких местах, поэтому мы ищем другую инструкцию, которая могла бы иметь лучшие окружающие инструкции.
Двойное нажатие мыши по следующей дает нам более точные инструкции, поэтому давайте скопируем информацию и снова вставим ее в текстовый редактор.

Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах

Закройте Cheat Engine, откройте OllyDbg, подключитесь к нашему процессу и перейдите к скопированному выражению. После маркировки разных частей байтов я придумал следующее, которое даст вам один результат при сканировании.

Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах

На этот раз плагин SigMaker сформировал правильную сигнатуру и маску из байтов в hexadecimal представлении, поэтому нам не нужно исправлять паттерн.

Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах

Теперь нам нужно добавить наш оффсет,к возвращаемому адресу, иначе мы считали бы E8FC4D89, которые являются первыми 4 байтами по возвращаемому адресу, в обратном порядке.

Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах

Когда мы сканируем этот адрес, мы получаем абсолютный адрес, который является текущим адресом указателя на наш LocalPlayer, который мы можем dereference / ReadProcessMemory.

В большинстве случаев это будет другой адрес, если вы перезапустите игру. Если вы хотите внедрить сканирование паттернов в свой чит, вы можете dereference / ReadProcessMemory этот адрес напрямую, чтобы получить адрес вашего LocalPlayer, но если вы хотите сделать дампер оффсетов, вы можете вычесть его на базовый адрес модуля, который в данном случае это client.dll.
Это даст вам raw оффсет.

Источник

Гайд Как сделать свой чит(Ренейм)! Как обновить оффсеты и индексы чтоб не крашило!

Модератор

Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах

Модератор
Модератор

пол года, я научился многому, улучшил свои знания, и теперь во все оружии решил завоевать сердца каждого юзера данного форума и добиться упущенного, ждите вкусняшек от МубиКрази, начиная от большого обновления данной темы)
Решил сделать гайд, буду объяснять внятно на человеческом языке для людей) Что такое оффсеты в читах. Смотреть фото Что такое оффсеты в читах. Смотреть картинку Что такое оффсеты в читах. Картинка про Что такое оффсеты в читах. Фото Что такое оффсеты в читах
Если кто-то что-то не понял, обращаться тут или же в дс(MubiCrazy#7141)|

И так, погнали значится:

5) Как сделать чтоб не крашило, чтоб обновить индексы вам нужно понять как они выглядят. Выглядят они так: 157 или 452.

5.1) Теперь узнать новые индексы, благо раздобыл из UC (no ad) таблицу индексов:

5.2) Ищем (Ctrl+f) названия из таблицы: IsPlayer, IsWeapon и т.д., если они отличаются от последних указанных в таблице, меняем.

5.3) Индексы обновляются не очень часто, и если и случается такое, то 3-4 штуки за раз.

6) Почему крашит, для начала нужно скомпилировать софт в Debug | x86.

6.2) Инжектим собранную длл-ку в игру через любой инжектор (я рекомендую Proccess Hacker 2)-

6.3) Если произойдёт краш игры, то вас перебросит в Visual Studio (проще VS или визуалка) и укажет на причину краша.

Источник

Оффсет

Смотреть что такое «Оффсет» в других словарях:

оффсет — сущ., кол во синонимов: 1 • печать (57) Словарь синонимов ASIS. В.Н. Тришин. 2013 … Словарь синонимов

ОФФСЕТ — сделка, предполагающая как обмен товарами и услугами, так и предоставление возможности вкладывать капитал взамен различного рода услуг и льгот (например, поставки узлов и деталей в рамках соглашений о промышленной кооперации) … Юридическая энциклопедия

ОФФСЕТ-СДЕЛКА — [ Словарь иностранных слов русского языка

оффсет-сделка — ж.; = офсет сделка Толковый словарь Ефремовой. Т. Ф. Ефремова. 2000 … Современный толковый словарь русского языка Ефремовой

СДЕЛКА «ОФФСЕТ» — одна из форм встречной торговли, которая предполага ет как обмен товарами и услугами, так и предоставление возможности вкла дывать капитал взамен различного рода услуг и льгот. Чаще всего областью заключения СДЕЛКИ ОФФСЕТ становятся торговля… … Финансовый словарь

СДЕЛКА ОФФСЕТ — (англ. offset deal) одна из форм встречной торговли, которая предполагает наряду с обменом товарами и услугами предоставление возможности вкладывать капитал в обмен на различного рода услуги и льготы … Юридическая энциклопедия

СДЕЛКА ОФФСЕТ — одна из форм встречной торговли, которая предполагает наряду с обменом товарами и услугами предоставление возможности вкладывать капитал в обмен на различного рода услуги и льготы … Энциклопедический словарь экономики и права

СДЕЛКИ ОФФСЕТ — (off et) применяются преимущественно в сфере межгосударственных поставок вооружений. В таких сделках страна, закупающая вооружения и военное имущество за рубежом, выставляет встречные требования компенсационного характера к экспортеру вооружений … Внешнеэкономический толковый словарь

ВСТРЕЧНАЯ ТОРГОВЛЯ — совокупность сделок, при заключении которых за купка продукции по разным причинам сопровождается ответными поставкамитоваров в целях достижения баланса экспортно импортных операций. ВСТРЕЧНАЯ ТОРГОВЛЯ подразделяются на бартерные сделки, встречные … Финансовый словарь

ВСТРЕЧНАЯ ТОРГОВЛЯ — форма внешней торговли; внешнеторговые операции, контракты, сделки, предусматривающие встречные обязательства экспортеров закупить у импортеров товары на полную стоимость или часть стоимости экспорта (бартерные сделки, встречные закупки);… … Энциклопедический словарь экономики и права

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *