Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд How to change world color after game update

C++:
Expand Collapse Copy
ida: @scenesystem.dll; "48 8B C4 48 89 50 ? 48 89 48 ? 55 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 89 58 ? 48 89 70"
void __fastcall draw_aggregate_scene_object_array(void* a1, void* a2, c_aggregate_object_array* a3)
{
  static auto original = find_original(&draw_aggregate_scene_object_array);
  original(a1, a2, a3);

  if (!a3->data || !sdk::scene_system || !sdk::scene_system->light_data_queue || !sdk::scene_system->light_data_queue->light_data)
    return;

  c_color clr = config.visuals.world.nightmode.world.color.get();

  if (config.visuals.world.nightmode.enabled && config.visuals.world.nightmode.world.enable)
  {
    for (int i = 0; i < a3->data->count; i++)
    {
      int index = (a3->data->index + i) << 5;
      // c_color its a color from 0 to 255
      *reinterpret_cast<c_color*>(reinterpret_cast<uintptr_t>(sdk::scene_system->light_data_queue->light_data) + index) = clr;
    }
  }
}

C++:
Expand Collapse Copy
class c_aggregate_object_data
{
public:
    char pad_0000[4]; //0x0000
    int count; //0x0004
    char pad_0008[40]; //0x0008
    int index; //0x0030
}; //Size: 0x0034

class c_aggregate_object_array
{
public:
    void* object; //0x0000
    c_aggregate_object_data* data; //0x0008
};

C++:
Expand Collapse Copy
class c_light_data_queue
{
public:
    char pad_0000[24]; // 0x0000
    void* light_data; // 0x0018
};

// interface: SceneSystem_002 @scenesystem.dll
class c_scene_system
{
public:
    char pad_0000[12568]; // 0x0000
    c_light_data_queue* light_data_queue; // 0x3118
};

Посмотреть вложение 316490
можешь пожалуйста подсказать как искать этот оффсет?
c_light_data_queue* light_data_queue; // 0x2A08
или есть у вас обновленный? просто я везде просмотрел по форумах, нет упоминаний о том как искать этот оффсет
 
можешь пожалуйста подсказать как искать этот оффсет?
c_light_data_queue* light_data_queue; // 0x2A08
или есть у вас обновленный? просто я везде просмотрел по форумах, нет упоминаний о том как искать этот оффсет
я уже кидал выше

C++:
Expand Collapse Copy
ida: @scenesystem.dll; "48 8B C4 48 89 50 ? 48 89 48 ? 55 53 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70"

class c_light_data_queue
{
public:
    char pad_0000[24]; //0x0000
    void* light_data; //0x0018
    char pad_0020[4]; //0x0020
};

class c_scene_system
{
public:
    char pad_0000[10760]; //0x0000
    c_light_data_queue* light_data_queue; //0x2A08
};

если хочешь оффсет найти то вот сигнатура

C++:
Expand Collapse Copy
ida: @scenesystem.dll; "4D 8B 81 ? ? ? ? 4D 8B 50 ? 49 8B 48 ? 49 2B CA 4C 85 EA"
1773845894259.png
 
для тех кто не смог обновить для беты с анимграфом

C++:
Expand Collapse Copy
class c_scene_system
{
public:
    char pad_0000[10792]; //0x0000
    c_light_data_queue* light_data_queue; //0x2A28
};
 
А как моделировать пропы, солнце, облака можно?

через этот же хук? если да то как?
пропы можно и через этот (чувак какой-то тему делал как вместо ворлда сделал модуляцию пропов) и всё остальное отдельно
 
пропы можно и через этот (чувак какой-то тему делал как вместо ворлда сделал модуляцию пропов) и всё остальное отдельно
Но как изменить цвет миру через рендер батя лист? Там нету ни индекса ни Каунт которые нужны в способе с лайт датой
 
C++:
Expand Collapse Copy
void __fastcall hkLight(void* a1, void *a2, c_aggregate_object_array* a3)
{
    std::cout << "Called " << std::endl;

    lh(a1, a2, a3);
}


C++:
Expand Collapse Copy
bool Hook::Init()
{
    Hook(SKYBOX, hkSkyBoxObjectDrawArray, (void**)&oSkyboxDraw, "scenesystem.dll");
    Hook(LightPattern, hkLight, (void**)&lh, "scenesystem.dll");
    MH_EnableHook(MH_ALL_HOOKS);
    __log("Hooks initialized!\n", false);

    return true;
}
Извините пожалуйста за глупый вопрос, у меня почему то функция не вызывается. Хук успешный, я более чем уверен проблема не в функции хука, потому что скай бокс работает.
[23:08:40] [hooks.cpp:56] Func: Hook::Hook -> Pattern -> 45 85 C9 0F 8E ? ? ? ? 4C 8B DC hooked!
[23:08:40] [hooks.cpp:56] Func: Hook::Hook -> Pattern -> 48 89 5C 24 ? 48 89 6C 24 ? 48 89 54 24 hooked!

И после обновления эта функция с типом int и возвращает result.
#define LightPattern "48 89 5C 24 ? 48 89 6C 24 ? 48 89 54 24"
 
48 8B C4 48 89 50 ? 48 89 48 ? 55 53 56 57 41 54 41 55 41 56 41 57 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 0F 29 70
Спасибо большое!

у меня теперь появилась другая проблема, у меня count всегда 0 равен, то есть цикл даже не начинается.

Я использовал такие структуры, они вроде верные
C++:
Expand Collapse Copy
class c_light_data_queue
{
public:
    char pad_0000[24]; //0x0000
    void* light_data; //0x0018
    char pad_0020[4]; //0x0020
};

class c_scene_system
{
public:
    char pad_0000[10760]; //0x0000
    c_light_data_queue* light_data_queue; //0x2A08
};

class c_aggregate_object_data
{
public:
    char pad_0000[4]; //0x0000
    int count; //0x0004
    char pad_0008[40]; //0x0008
    int index; //0x0030
}; //Size: 0x0034

class c_aggregate_object_array
{
public:
    void* object; //0x0000
    c_aggregate_object_data* data; //0x0008
};


C++:
Expand Collapse Copy
__int64 __fastcall hkLight(__int64 a1, __int64 a2, c_aggregate_object_array* a3)
{
    c_color clr{255, 0, 0};

    std::cout << std::hex << reinterpret_cast<void*>(hkLight) << std::endl;

    std::cout << a3 << std::endl;

    // data->cout всегда равен нулю
    for (int i = 0; i < a3->data->count; i++)
    {
        int index = (a3->data->index + i) << 5;   

        std::cout << "Called! " << std::endl;
        *reinterpret_cast<c_color*>(reinterpret_cast<uintptr_t>(sdk::scene_system->light_data_queue->light_data) + index) = clr;
    }

    return lh(a1, a2, a3);
}

Как вообще можно зареверсить такое? Что нужно в игре делать конкретно, чтобы искать изменения в памяти?
 
C++:
Expand Collapse Copy
ida: @scenesystem.dll; "48 8B C4 48 89 50 ? 48 89 48 ? 55 48 8D A8 ? ? ? ? 48 81 EC ? ? ? ? 48 89 58 ? 48 89 70"
void __fastcall draw_aggregate_scene_object_array(void* a1, void* a2, c_aggregate_object_array* a3)
{
  static auto original = find_original(&draw_aggregate_scene_object_array);
  original(a1, a2, a3);

  if (!a3->data || !sdk::scene_system || !sdk::scene_system->light_data_queue || !sdk::scene_system->light_data_queue->light_data)
    return;

  c_color clr = config.visuals.world.nightmode.world.color.get();

  if (config.visuals.world.nightmode.enabled && config.visuals.world.nightmode.world.enable)
  {
    for (int i = 0; i < a3->data->count; i++)
    {
      int index = (a3->data->index + i) << 5;
      // c_color its a color from 0 to 255
      *reinterpret_cast<c_color*>(reinterpret_cast<uintptr_t>(sdk::scene_system->light_data_queue->light_data) + index) = clr;
    }
  }
}

C++:
Expand Collapse Copy
class c_aggregate_object_data
{
public:
    char pad_0000[4]; //0x0000
    int count; //0x0004
    char pad_0008[40]; //0x0008
    int index; //0x0030
}; //Size: 0x0034

class c_aggregate_object_array
{
public:
    void* object; //0x0000
    c_aggregate_object_data* data; //0x0008
};

C++:
Expand Collapse Copy
class c_light_data_queue
{
public:
    char pad_0000[24]; // 0x0000
    void* light_data; // 0x0018
};

// interface: SceneSystem_002 @scenesystem.dll
class c_scene_system
{
public:
    char pad_0000[12568]; // 0x0000
    c_light_data_queue* light_data_queue; // 0x3118
};

Посмотреть вложение 316490
НЕ ПОДОШЛО. повисло игра при 3 минуте захода на нюк под кодом
 
Скрытое содержимое
C++:
Expand Collapse Copy
extern c_scene_system* scene_system = *(c_scene_system**)((uintptr_t)(GetModuleHandleA("scenesystem.dll")) + 0x8CFEE0);

__int64 __fastcall hkLight(__int64 a1, __int64 a2, c_aggregate_object_array* a3)
{
    int original =  lh(a1, a2, a3);
    c_color clr{255, 0, 0};

    for (int i = 0; i < a3->data->count; i++)
    {
        int index = (a3->data->index + i) << 5;   

        std::cout << "Called! " << std::endl;
        if (scene_system) {
            *reinterpret_cast<c_color*>(reinterpret_cast<uintptr_t>(sdk::scene_system->light_data_queue->light_data) + index) = clr;
        }
    }

    return original;
}

ДААААА! Спасибо огромное!. Но крашит почему то...
 
C++:
Expand Collapse Copy
extern c_scene_system* scene_system = *(c_scene_system**)((uintptr_t)(GetModuleHandleA("scenesystem.dll")) + 0x8CFEE0);

__int64 __fastcall hkLight(__int64 a1, __int64 a2, c_aggregate_object_array* a3)
{
    int original =  lh(a1, a2, a3);
    c_color clr{255, 0, 0};

    for (int i = 0; i < a3->data->count; i++)
    {
        int index = (a3->data->index + i) << 5; 

        std::cout << "Called! " << std::endl;
        if (scene_system) {
            *reinterpret_cast<c_color*>(reinterpret_cast<uintptr_t>(sdk::scene_system->light_data_queue->light_data) + index) = clr;
        }
    }

    return original;
}

ДААААА! Спасибо огромное!. Но крашит почему то...
photo_2026-04-11_17-15-02.jpg

Проблема оказалась в получении интерфейса SceneSystem_002. Спасибо за туториал! Не расскажите как вы реверсили все это, чтобы в будущем люди могли понимать как получить структуры. То есть как вы получили c_light_data_queue и c_scene_system
 
Назад
Сверху Снизу