Пользователь
- Статус
- Оффлайн
- Регистрация
- 2 Ноя 2024
- Сообщения
- 298
- Реакции
- 33
Как всегда всем ку, новый гайд для новичков, советую вам обязательно посмотреть мой прошлый гайд, чтобы понять о чем пойдет речь.
Сначала хочется рассказать о том, что такое индексы, vfunc и многое другое.
Глава 1: Индексы или же VFUNC(Virtual Function).
Глава 1.1: Как найти новый индекс.
Глава 2: Как найти новый паттерн, имея старый.
Глава 3 последняя - структуры.
обязательно:
нужна будет старая длл, где вы хотите найти старый паттерн или индекс ну короче где этот паттерн был рабочий.
Глава 1: Индексы или же VFUNC(Virtual Function).
Индекс или же vfunc - не функция чита, а встроенная функция игры для упрощения ее кода.
Разберем VTable:
Мы видим тут 1 индекс (я его оставил для укорочения), это наш Draw_Object хук для чамсов, многие из вас задумываются мб почему кс2 сделали такие странные методы для хранения индексов, но это просто дело в компиляторе, у разработчиков игры, вместо такого, к примеру такое:
И они используют это уже в других функциях вызовом, то что мы видим - просто дело компиляции и дизассемблера в ида про, не более.
Индексы начинаются с первого голого dq offset.
Например:
Рабочие индексы только те, которые указывают на sub_..., а если индекс на _guard_check_icall_nop, или другую не понятную функцию, но точно не на функцию саба, то это пустой индекс.
Разберем VTable:
Код:
.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
Код:
class CAnimatableSceneObjectDesc {
public:
virtual void RenderObject(__int64 a1, __int64 a2, __int64 *a3, int a4, __int64 a5, __int64 a6, __int64 a7)
};
Индексы начинаются с первого голого dq offset.
Например:
Код:
.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, и в нем такой код или же графа:
Но в новой версии этот индекс изменился из за добавления новых методов в класс, и текущий код 73 индекса:
Как мы видим, большое различие, ваша задача - просто походить по ближним индексам к 73, и найти такой же код, который был в старой.
Когда нашли - поздравляю, просто найдите номер этого индекса.
Если же не получилось, то могло произойти в обратную сторону, я покажу вам как быстро найти.
1. По хрефам.
2. По рандом паттернам.
По хрефам:
В нашем коде была строка "lea rdx, aCBuildworkerCs_22 ; "C:\\buildworker\\csgo_rel_win64\\build"...", aCBuildworkerCs_22 - можно считать что адрес.
В новой длл жмякаем "X", и переходим по "aCBuildworkerCs_22" как по адресу, и ищем похожую графу, далее жмякаем по началу функции (Пример - sub_18010FC40 proc near), и переходим как по хрефу в втабл, и все.
По рандом паттернам:
Нам нужно найти участок, который не должен обновится, это трудно и требует мозгов, к примеру:
Почему он не должен обновится? он может, но шанс маленький, тут производится обычное вычисление, не более.
После создания паттерна, ищем в новой дллке, и находим, ура.
Эта глава - как найти новый индекс, а не как найти самому.
Для начала нужна старая и новая дллка, я буду юзать scenesystem.dll + CSceneView втабл, тк мои датабазы клиента сломались ну логика будет понятная.
Вам нужно открыть сразу 2 ида про, 1 - старая где был рабочий индекс, 2 - новая.
Затем ищите класс в котором у вас индекс, сразу говорю - классов типо "c_base_player_weapon" как в читах нету, если вы попробовали поискать по этому имени, стоит задуматься зачем вам нужно реверсить.
Например у нас индекс 73 в CSceneView, и в нем такой код или же графа:
Как мы видим, большое различие, ваша задача - просто походить по ближним индексам к 73, и найти такой же код, который был в старой.
Когда нашли - поздравляю, просто найдите номер этого индекса.
Если же не получилось, то могло произойти в обратную сторону, я покажу вам как быстро найти.
1. По хрефам.
2. По рандом паттернам.
По хрефам:
В нашем коде была строка "lea rdx, aCBuildworkerCs_22 ; "C:\\buildworker\\csgo_rel_win64\\build"...", aCBuildworkerCs_22 - можно считать что адрес.
В новой длл жмякаем "X", и переходим по "aCBuildworkerCs_22" как по адресу, и ищем похожую графу, далее жмякаем по началу функции (Пример - sub_18010FC40 proc near), и переходим как по хрефу в втабл, и все.
По рандом паттернам:
Нам нужно найти участок, который не должен обновится, это трудно и требует мозгов, к примеру:
Код:
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.
Мы видим 2 индекс.
Переходим в новую дллку.
видим тут:
Тут уже задействуем 1 главу по поиску нового индексы, и находим чотко - 1.
Как понять что это та же фунция - по ассемблеру, думаю такой одинаковый код не будет в каждой функции:
2. через хреф
У нас есть (48 89 4C 24 ? 53 55 56 57 41 54 41 55 41 56 41 57 48 81 EC) странная функция (взял на рандом), которая обновилась.
Ее код в старой дллке:
мы видим тут хреф - 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 - рандом паттерн.
Задействуем навык со индексов - ищем место которое не обновилось и юзается в вычислениях и тд, ну где короче нету оффсетов, и онли инструкции.
За пример драв обжект.
Я нашел:
Сделав паттерн "BA ? ? ? ? 4C 8B ? 24 ? ? ? ? 49 8D ?", мы находим его в новой дллке:
И далее листаем выше и прост делаем хук.
У нас есть паттерн старого драв обжект, но увы, нету нового.
Нам надо найти функцию на которую указывает паттерну к примеру "48 8B C4 48 89 50 ? 53".
И далее действуем по старой тактике:
1. Через втабл
2. По хрефу.
3. По не обнов паттерну.
Заходим в старую дллку, и кликаем по началу функции (sub_1800430D0 proc near), как по хрефу.
Нас интересует только строка "dq offset" - это обьявление этой функции.
Ищем и находим индекс: 2.
Мы видим 2 индекс.
Переходим в новую дллку.
видим тут:
Тут уже задействуем 1 главу по поиску нового индексы, и находим чотко - 1.
Как понять что это та же фунция - по ассемблеру, думаю такой одинаковый код не будет в каждой функции:
У нас есть (48 89 4C 24 ? 53 55 56 57 41 54 41 55 41 56 41 57 48 81 EC) странная функция (взял на рандом), которая обновилась.
Ее код в старой дллке:
мы видим тут хреф - 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 - рандом паттерн.
Задействуем навык со индексов - ищем место которое не обновилось и юзается в вычислениях и тд, ну где короче нету оффсетов, и онли инструкции.
За пример драв обжект.
Я нашел:
И далее листаем выше и прост делаем хук.
Глава 3 последняя - структуры.
Теперь другой уровень - структуры.
Давайте за пример возьмем SkyboxDrawArray.
Структуры сами по себе не хранятся в открытом виде в игре, потому что компилятор вместо обращения к структуре, хардкодит смещение и все.
Но по смещению можно самому сделать структуру с pad.
Возьмем старую структуру:
Значит наш цвет в старой дллке по +0x128.
Надо получить из 16-ричной системы считывания, в десятичную:
С этим поможет любая ии
И мы получаем 296, ищем в псевдо упоминание 296:
И находим:
Как видим это наш цвет скайбабакса. ну так поняли да.
Переходим в новую клиент длл найдя новый драваррайскайбокс.
Тут мы видим:
(фото не смог сделать тк много фоток уже).
И 240 в 16-ричной системе (Для использования можете юзать
Будет 0xE8.
И у нас все воркает.
Давайте за пример возьмем SkyboxDrawArray.
Структуры сами по себе не хранятся в открытом виде в игре, потому что компилятор вместо обращения к структуре, хардкодит смещение и все.
Но по смещению можно самому сделать структуру с pad.
Возьмем старую структуру:
Код:
struct c_skybox_object_desc {
uint8_t pad_0[0x128];
float r, g, b;
};
Значит наш цвет в старой дллке по +0x128.
Надо получить из 16-ричной системы считывания, в десятичную:
С этим поможет любая ии
И находим:
Как видим это наш цвет скайбабакса. ну так поняли да.
Переходим в новую клиент длл найдя новый драваррайскайбокс.
Тут мы видим:
Код:
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.
И у нас все воркает.
Последнее редактирование: