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

Гайд Reversing cs2: Как найти новый индекс, паттерн, или же оффсет для структуры.

Пользователь
Пользователь
Статус
Оффлайн
Регистрация
2 Ноя 2024
Сообщения
298
Реакции
33
Как всегда всем ку, новый гайд для новичков, советую вам обязательно посмотреть мой прошлый гайд, чтобы понять о чем пойдет речь.
обязательно:
Expand Collapse Copy
нужна будет старая длл, где вы хотите найти старый паттерн или индекс ну короче где этот паттерн был рабочий.
Сначала хочется рассказать о том, что такое индексы, vfunc и многое другое.

Глава 1: Индексы или же VFUNC(Virtual Function).
Индекс или же vfunc - не функция чита, а встроенная функция игры для упрощения ее кода.
Разберем VTable:
Код:
Expand Collapse Copy
.rdata:00000001805D5CF0 ; class CAnimatableSceneObjectDesc: CBaseSceneObjectDesc, ISceneObjectDesc;   (#classinformer)
.rdata:00000001805D5CF0                 dq offset ??_R4CAnimatableSceneObjectDesc@@6B@ ; const CAnimatableSceneObjectDesc::`RTTI Complete Object Locator'
.rdata:00000001805D5CF8 ; const CAnimatableSceneObjectDesc::`vftable'
.rdata:00000001805D5CF8 ??_7CAnimatableSceneObjectDesc@@6B@ dq offset sub_180053BE0
.rdata:00000001805D5CF8                                         ; DATA XREF: .data:off_180663840↓o
.rdata:00000001805D5D00                 dq offset sub_180055BC0
Мы видим тут 1 индекс (я его оставил для укорочения), это наш Draw_Object хук для чамсов, многие из вас задумываются мб почему кс2 сделали такие странные методы для хранения индексов, но это просто дело в компиляторе, у разработчиков игры, вместо такого, к примеру такое:
Код:
Expand Collapse Copy
class CAnimatableSceneObjectDesc {
public:
    virtual void RenderObject(__int64 a1, __int64 a2, __int64 *a3, int a4, __int64 a5, __int64 a6, __int64 a7)
};
И они используют это уже в других функциях вызовом, то что мы видим - просто дело компиляции и дизассемблера в ида про, не более.

Индексы начинаются с первого голого dq offset.

Например:
Код:
Expand Collapse Copy
.rdata:00000001805D5CF0 ; class CAnimatableSceneObjectDesc: CBaseSceneObjectDesc, ISceneObjectDesc;   (#classinformer)
.rdata:00000001805D5CF0                 dq offset ??_R4CAnimatableSceneObjectDesc@@6B@ ; const CAnimatableSceneObjectDesc::`RTTI Complete Object Locator'
.rdata:00000001805D5CF8 ; const CAnimatableSceneObjectDesc::`vftable'
.rdata:00000001805D5CF8 ??_7CAnimatableSceneObjectDesc@@6B@ dq offset sub_180053BE0
.rdata:00000001805D5CF8                                         ; DATA XREF: .data:off_180663840↓o
.rdata:00000001805D5D00                 dq offset sub_180055BC0 -- 1 индекс
.rdata:00000001805D5D08                 dq offset _guard_check_icall_nop -- 2 индекс
.rdata:00000001805D5D10                 dq offset sub_180056AC0 -- 3 индекс
.rdata:00000001805D5D18                 dq offset sub_180073520 -- 4 индекс
.rdata:00000001805D5D20                 dq offset sub_180035D80 -- 5 индекс
.rdata:00000001805D5D28                 dq offset sub_180056960 -- 6 индекс
.rdata:00000001805D5D30                 dq offset sub_180056970 -- 7 индекс

Рабочие индексы только те, которые указывают на sub_..., а если индекс на _guard_check_icall_nop, или другую не понятную функцию, но точно не на функцию саба, то это пустой индекс.

Глава 1.1: Как найти новый индекс.
Я отвечаю, тут нужна будет логика мозга, и извилины, если вы это не имеете - советую быстро прекращать реверсить.
Эта глава - как найти новый индекс, а не как найти самому.

Для начала нужна старая и новая дллка, я буду юзать scenesystem.dll + CSceneView втабл, тк мои датабазы клиента сломались ну логика будет понятная.
Вам нужно открыть сразу 2 ида про, 1 - старая где был рабочий индекс, 2 - новая.
Затем ищите класс в котором у вас индекс, сразу говорю - классов типо "c_base_player_weapon" как в читах нету, если вы попробовали поискать по этому имени, стоит задуматься зачем вам нужно реверсить.

Например у нас индекс 73 в CSceneView, и в нем такой код или же графа:
1779248261505.png
Но в новой версии этот индекс изменился из за добавления новых методов в класс, и текущий код 73 индекса:
1779248210132.png

Как мы видим, большое различие, ваша задача - просто походить по ближним индексам к 73, и найти такой же код, который был в старой.
Когда нашли - поздравляю, просто найдите номер этого индекса.

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

1. По хрефам.
2. По рандом паттернам.


По хрефам:
В нашем коде была строка "lea rdx, aCBuildworkerCs_22 ; "C:\\buildworker\\csgo_rel_win64\\build"...", aCBuildworkerCs_22 - можно считать что адрес.
В новой длл жмякаем "X", и переходим по "aCBuildworkerCs_22" как по адресу, и ищем похожую графу, далее жмякаем по началу функции (Пример - sub_18010FC40 proc near), и переходим как по хрефу в втабл, и все.

По рандом паттернам:

Нам нужно найти участок, который не должен обновится, это трудно и требует мозгов, к примеру:
Код:
Expand Collapse Copy
loc_18010FCD9:
inc     dword ptr [r14]
mov     rax, [r14+8]
mov     [rax+rbp*8], r15
mov     eax, [rbx+4]
dec     eax
mov     [rbx+4], eax
mov     eax, [rbx+4]
test    eax, eax
jnz     short loc_18010FCF6
Почему он не должен обновится? он может, но шанс маленький, тут производится обычное вычисление, не более.
После создания паттерна, ищем в новой дллке, и находим, ура.

Глава 2: Как найти новый паттерн, имея старый.
За пример возьмем DrawObject.

У нас есть паттерн старого драв обжект, но увы, нету нового.
Нам надо найти функцию на которую указывает паттерну к примеру "48 8B C4 48 89 50 ? 53".
И далее действуем по старой тактике:
1. Через втабл
2. По хрефу.
3. По не обнов паттерну.

Заходим в старую дллку, и кликаем по началу функции (sub_1800430D0 proc near), как по хрефу.
Нас интересует только строка "dq offset" - это обьявление этой функции.
Ищем и находим индекс: 2.
1779248648784.png

1779248315460.png

1779248321304.png

Мы видим 2 индекс.
Переходим в новую дллку.

видим тут:
1779248359721.png

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

1779248384628.png
2. через хреф
У нас есть (48 89 4C 24 ? 53 55 56 57 41 54 41 55 41 56 41 57 48 81 EC) странная функция (взял на рандом), которая обновилась.
Ее код в старой дллке:

1779248408042.png

мы видим тут хреф - aCBuildworkerCs_0 который первый попадается в глаза.
Надо найти стринг который там, переходим в регистрацию хрефа:
.rdata:0000000180559510 aCBuildworkerCs_0 db 'C:\buildworker\csgo_rel_win64\build\src\scenesystem\scenesystem.c'

Видим строку "C:\buildworker\csgo_rel_win64\build\src\scenesystem\scenesystem.c", но такой нету, потому что стринги в ида про путаются так же как и пути, ищем в strings методом ума и находим: ".rdata:0000000180559510 00000044 C C:\\buildworker\\csgo_rel_win64\\build\\src\\scenesystem\\scenesystem.cpp" который и подходит нашему хрефу.
Можете по стрингу или хрефу искать.
Переходим в новую дллку и по нему же ищем ту самую функцию, и находим.

уроо.
Теперь 3 - рандом паттерн.
Задействуем навык со индексов - ищем место которое не обновилось и юзается в вычислениях и тд, ну где короче нету оффсетов, и онли инструкции.
За пример драв обжект.
Я нашел:
1779248376057.png

1779248384628.png
Сделав паттерн "BA ? ? ? ? 4C 8B ? 24 ? ? ? ? 49 8D ?", мы находим его в новой дллке:
И далее листаем выше и прост делаем хук.

Глава 3 последняя - структуры.
Теперь другой уровень - структуры.
Давайте за пример возьмем SkyboxDrawArray.
Структуры сами по себе не хранятся в открытом виде в игре, потому что компилятор вместо обращения к структуре, хардкодит смещение и все.
Но по смещению можно самому сделать структуру с pad.

Возьмем старую структуру:
Код:
Expand Collapse Copy
struct c_skybox_object_desc {
    uint8_t pad_0[0x128];
    float   r, g, b;
};

Значит наш цвет в старой дллке по +0x128.
Надо получить из 16-ричной системы считывания, в десятичную:
С этим поможет любая ии
1779248575236.png
И мы получаем 296, ищем в псевдо упоминание 296:
И находим:
1779248769213.png

Как видим это наш цвет скайбабакса. ну так поняли да.
Переходим в новую клиент длл найдя новый драваррайскайбокс.

Тут мы видим:
Код:
Expand Collapse Copy
if ( v12 )
              {
                v68 = *(_QWORD *)(v8 + 168);
                v59 = v12 + 176;
                v61 = v12 + 272;
                v63 = v12 + 384;
                v64 = v12 + 560;
                v65 = v12 + 656;
                v66 = v12 + 784;
                v67 = v12 + 848;
                v57 = v12;
              }
              v55[0] = v54[0];
              v55[1] = v54[1];
              v55[2] = v54[2];
              v55[3] = (__int128)_mm_load_si128((const __m128i *)&xmmword_1805F0AB0);
              sub_1800ACBD0(v58, 4222080039i64, v55);
              v13 = *(float *)(v8 + 240);
              v53.m128_u64[0] = *(_QWORD *)(v8 + 232); -- ВОТ ЦВЕТ АЛО
              v53.m128_i32[3] = 0;
              v14 = v53;
              v14.m128_f32[0] = v53.m128_f32[0];
              v15 = _mm_shuffle_ps(v14, v14, 225);
              v15.m128_f32[0] = _mm_shuffle_ps((__m128)v53.m128_u64[0], (__m128)v53.m128_u64[0], 85).m128_f32[0];
              v16 = _mm_shuffle_ps(v15, v15, 198);
(фото не смог сделать тк много фоток уже).
И 240 в 16-ричной системе (Для использования можете юзать
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Будет 0xE8.
И у нас все воркает.
 
Последнее редактирование:
Назад
Сверху Снизу