Оффсеты
-
Достаточно часто я вижу, что люди на разных форумах под словом оффсет подразумевают одиночное смещение.
Пример:namespace offset { constexpr auto uWorld = 0x8924E28; constexpr auto gNames = 0x8717A00; constexpr auto gObjects = 0x87B7100; namespace World { constexpr auto persistentLevel = 0x30; constexpr auto owningGamingInstance = 0x1B8; constexpr auto gameState = 0x158; } namespace PersistentLevel { constexpr auto ActorArray = 0x098; constexpr auto ActorCount = 0x0A0; } namespace Actor { constexpr auto GetPawn = 0x180; constexpr auto GetRootComponent = 0x198; } namespace GetRootComponent { constexpr auto RelativeLocation = 0x128; constexpr auto RelativeRotation = 0x140; } namespace OwningGamingInstance { constexpr auto localPlayers = 0x038; } namespace LocalPlayer { constexpr auto PlayerController = 0x30; } namespace PlayerController { constexpr auto PlayerState = 0x298; constexpr auto AcknowledgedPawn = 0x338; constexpr auto PlayerCameraManager = 0x348; } namespace PlayerState { constexpr auto PlayerId = 0x294; constexpr auto PlayerName = 0x338; } }
Тут явно видно, что, например, по смещению
338
находится начало данных, в которых содержится имя игрока, это ясно.
Но когда я, например, сам ищу некоторые данные, (допустим ХП) в cheat engine, то я получаю что то вроде"GameTitle.exe" + 0x08923568
со смещениями (в абсолютном большинстве случаев - несколькими) по типу
2E8
-->30
-->C8
-->410
Но это явно больше, чем 1 смещение относительно базового.exe
адреса.
В коде для получения доступа к переменной я использую вектор с оффсетами:
std::vector<DWORD> offsets { 0x2E8, 0x30, 0xC8, 0x410 };
Но меня всё же интересует, как получить то самое одиночное смещение относительно.exe
, чтобы не прыгать по этим смещениям. -
@FoxEdit а с чего ты взял, что коде, использующем вышеуказанный пример, они не "прыгают" по этим оффсетам?
-
@StoneWeaver В течении этих пары дней я всё таки обнаружил в нескольких гайдах и примерах, что люди также используют вектора с оффсетами, это привнесло некоторую ясность того, что я не один так делаю, это допустимый (и, возможно, правильный) вариант достучаться до нужных мне данных, но всё же остаются вопросы.
Давай возьмём в пример тот же самый репозиторий hazedumper. Тут снова оффсеты в единичных количествах, то есть от базового адреса до условных "хп" всего лишь 1 прыжок. Неужели это просто исключение из правил и в ныне несуществующей cs:go от базового адреса до ХП было всего 1 смещение?
У меня не так много опыта и во всех моих случаях, я имел от 2 до 4 оффсетов до нужного мне поля с данными, поэтому я и задал этот вопрос.
Если говорить о твоём вопросе, то у меня нет точного ответа, так как это код какой то первой страницы по запросу "x_game offset dumps"
-
@FoxEdit, Возможно ты чего-то не понял, навряд ли значение хп можно получить через client.dll/engine.dll с 1 офсетом, если полазить в дампе офсетов, то можно найти:
constexpr ::std::ptrdiff_t dwLocalPlayer = 0xDEB99C;
Значит принцип таков, что тебе надо сначала получить адрес локального игрока через client.dll + dwLocalPlayer, а затем уже через dwLocalPlayer получить хп локального игрока: player addr + hp offset.
.
А, если брать твой вопрос про кол-во офсетов до хп, то вот видео, которое поможет разобраться: -
@__fastcall Спасибо! Твой ответ полностью ответил на мой вопрос. Я понял, что дело в том, что я неверно воспринимал эти списки оффсетов, которые люди выкладывают на форумах. Я думал, что эти списки будут содержать в себе подробную информацию, например, сразу до хп или патронов (Что-то вроде
2B8 -> 30 -> ...
). Но как ты и показал в примере (который, к слову, также объясняет и тот самый код, который я привёл в самом верху темы) hazedumper, мне дают по отдельности адреса к началам сущностей, например, игрока и отдельно оффсеты, которые я могу применять К этим сущностям. То есть в списке у меня может быть 2 разных оффсета, которые я просто должен скомбинировать, чтобы "прыгнуть" к начале структуры, допустим, игрока и потом "прыгнуть" к его хп.За видео спасибо, я его уже смотрел, но повторение мать учения как говорится.