Статья Как обновить оффсеты чита для Sea of Thieves

Darwin

Команда форума
Администратор
Сообщения
786
Реакции
354
Всем привет это Дарвин, сегодня я вам покажу как обновлять оффсеты читов для игры Sea Of Thieves, исходник вы можете найти как на нашем форуме так и на любом сайте
Сегодня я вам так же расскажу принципы как это все работает и устроенно и естественно мы будем использовать UnrealEngine Dumper потому что игра на этом движке

Вам понадобится обновленный SDK и проект для взлома.
(Вам понадобится Visual Studio C++ с инструментами сборки v142 для редактирования проекта и создания собственного дампа SDK, нам нужен UnrealDumper ссылка ниже, а затем запустите его, пока вы находитесь на сервере в игре) .

Смещения управляются вашим файлом SDK.h в вашем проекте.

Скажем, нам нужно обновить эту структуру:
C++:
struct AProjectileWeapon {                
    char pad[0x???];
    FProjectileWeaponParameters WeaponParameters;
    bool CanFire()
    {
        static auto fn = UObject::FindObject<UFunction>("Function Athena.ProjectileWeapon.CanFire");
        bool canfire;
        ProcessEvent(this, fn, &canfire);
        return canfire;
    }
};

Откройте файлы дампа SDK и найдите строку AProjectileWeapon или Athena.ProjectileWeapon.
(Большинство элементов, начинающихся с A, — это просто Athena.Something и наиболее часто используемые файлы .h
для SoT_Hook — это Engine_struct.h, Engine_classes.h, Athena_struct.h, Athena_classes.h)
Или просто найдите саму строку "FPProjectileWeaponParameters WeaponParameters;". Он находится в Athena_classes.h и выглядит так:
C++:
// Class Athena.ProjectileWeapon
// Size: 0xa60 (Inherited: 0x790)
struct AProjectileWeapon : ASkeletalMeshWieldableItem {          
    char UnknownData_790[0x28]; // 0x790(0x28)
    struct UInventoryItemComponent* InventoryItem; // 0x7b8(0x08)
    DelegateProperty ProjectileAimValidator; // 0x7c0(0x10)
    struct FProjectileWeaponParameters WeaponParameters; // 0x7d0(0x1e0)    <----(the offset we want to update)
    char State; // 0x9b0(0x01)
    char UnknownData_9B1[0x7]; // 0x9b1(0x07)
    struct UAimSensitivityComponent* AimSensitivityComponent; // 0x9b8(0x08)
    char UnknownData_9C0[0x10]; // 0x9c0(0x10)
    char ProjectileWeaponType; // 0x9d0(0x01)
    char UnknownData_9D1[0x3]; // 0x9d1(0x03)
    float MaxAcceptableAttackTimeStampDelta; // 0x9d4(0x04)
    char UnknownData_9D8[0x4]; // 0x9d8(0x04)
    int32_t AmmoLeft; // 0x9dc(0x04)
    float DistanceBeforeGravity; // 0x9e0(0x04)
    float NameplateVisibilityRangeExtensionFactorWhileAiming; // 0x9e4(0x04)
    char UnknownData_9E8[0x39]; // 0x9e8(0x39)
    bool ShouldShowAmmoUI; // 0xa21(0x01)
    char UnknownData_A22[0x3e]; // 0xa22(0x3e)

Все, что мы здесь делаем, это вводим число в блокнот,
Блокнот в основном говорит ему перейти к значению внутри квадратных скобок [], потому что он читается со строки 0 вниз. Так что:
C++:
struct AProjectileWeapon {                
    char pad[0x7d0];  <----- updated
    FProjectileWeaponParameters WeaponParameters;
    bool CanFire()
    {
        static auto fn = UObject::FindObject<UFunction>("Function Athena.ProjectileWeapon.CanFire");
        bool canfire;
        ProcessEvent(this, fn, &canfire);
        return canfire;
    }
};

Как рассчитать несколько колодок.
Возьмите это, например;
C++:
struct AController {

    char pad_1[0x???];
    class ACharacter* Character;
    char pad_2[0x???];
    APlayerCameraManager* PlayerCameraManager;
    char pad_3[0x???];
    bool IdleDisconnectEnabled;
};

Итак, для начала нам нужно найти 3 разных мероприятия. Просто найдите каждую строку в SDK
1. struct ACharacter* Персонаж; // 0x3e8(0x08)
2. struct APlayerCameraManager* PlayerCameraManager; // 0x460(0x08)
3. логическое значение IdleDisconnectEnabled; // 0x14b1(0x01)

1. Итак, что мы здесь делаем, так это берем смещение, с которого мы начинаем (0x3e8), и просто помещаем его прямо в стартовую площадку (не часть в скобках).

2. Для расчета pad_2 мы берем все первое смещение, включая часть в скобках, путем сложения их вместе с помощью HEX-калькулятора.
(который можно найти в Windows 10, найти калькулятор и при открытии переключиться на программатор> шестнадцатеричный)
Итак, 0x3e8 + 0x08 = 0x3f0.
Затем мы берем следующее смещение 0x460 (без добавления части 0x08) и вычитаем из него 0x3f0 (мы только что получили от 0x3e8 + 0x08).
В калькуляторе будет 460 - 3f0 = 70

3. наконец, мы берем 0x460 + 0x08 и вычитаем его из 0x14b1 так,
14б1 - 468 = 1049. Теперь просто подставляем их для каждой подушечки.
C++:
struct AController {

    char pad_1[0x3e8];
    class ACharacter* Character;
    char pad_2[0x70];
    APlayerCameraManager* PlayerCameraManager;
    char pad_3[0x1049];
    bool IdleDisconnectEnabled;
};
Возьмите этот незавершенный пример кода:
C++:
struct UWorldMapIslandDataAsset {
    char pad[0x30];
    struct FWorldMapIslandDataCaptureParams CaptureParams; // 0x30(0x40)
    FVector WorldSpaceCameraPosition; // 0x18(0x0c)
};
0x70 нельзя вычесть из 0x18, поэтому вместо этого мы должны учитывать это, используя что-то вроде этого
C++:
struct UWorldMapIslandDataAsset {
    char pad_UWorldMapIslandDataAsset[0x30];
    char pad_CaptureParams_struct[0x18];
    FVector WorldSpaceCameraPosition; // 0x18(0x0c)
};

char pad_CaptureParams_struct охватывает первые 0x18 в FWorldMapIslandDataCaptureParams.
который приведет вас к позиции смещения для FVector WorldSpaceCameraPosition.
(Вам не обязательно называть пэды таким образом, но это поможет вам вспомнить, почему они у вас есть).

Ссылка на UnrealEngine Dumper:
 
Последнее редактирование:

Anonym

Исследователь
Премиум
Сообщения
33
Реакции
19
Спасибо за статью про обновлению оффсетов, довольно интересный метод
 

Nowane

Следопыт
Сообщения
71
Реакции
24
Допустим в игре я хочу найти адрес на бесконечные патроны. Адрес динамический. Нужно найти Static Pointers или сам офсет. Офсеты можно найти и обновить через дампер, если он есть, а если дампер устарел и СДК уже неактуально, то придётся искать офсеты вручную через дебаггер или искать новый дампер? Всё правильно? И такой вопрос, а как люди вообще находят этот дампер?
 

Darwin

Команда форума
Администратор
Сообщения
786
Реакции
354
Допустим в игре я хочу найти адрес на бесконечные патроны. Адрес динамический. Нужно найти Static Pointers или сам офсет. Офсеты можно найти и обновить через дампер, если он есть, а если дампер устарел и СДК уже неактуально, то придётся искать офсеты вручную через дебаггер или искать новый дампер? Всё правильно? И такой вопрос, а как люди вообще находят этот дампер?
Если ищешь оффсеты через CheatEngine то надо находить статический Pointer иначе при перезапуске адрес просто не найдется
дампер и cheat engine совсем разные вещи, я создам в будущем отдельную тему по этому поводу что как и да почему, просто если я тебе скажу на словах врядли поймешь, тут только примером
 
Верх Низ