- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 567
- Реакции
- 15
Здорова, реверсеры. Сегодня разберем, как перестать гадать на кофейной гуще и начать нормально препарировать рендеринг в играх на примере старого доброго Майна (версии 1.15 — 1.16.5). Работать будем через NVIDIA Nsight Graphics — это ультимативный тул для тех, кто хочет видеть каждый вызов OpenGL байтик к байтику.
Что нам это дает?
Мы сможем сделать полный фингерпринт функций OpenGL, вытащить данные буферов, шейдеры и понять, как игра рисует объекты, чтобы наш ESP не превратился в кашу из мусора.
Настройка проекта
Для начала цепляемся к процессу. В Nsight создаем новый проект, указываем путь к java.exe/javaw.exe.
Важный нюанс: аргументы командной строки берите из Process Hacker, но копируйте только сами аргументы, без пути к экзешнику, иначе дебаггер не заведется. Жмем Launch Frame Debugger, залетаем в мир и по F11 делаем захват кадра.
Анализ объектов
В Render Timeline ищем моменты отрисовки игрока и сундуков. К примеру, Event 181 и 296 — рендеринг выглядит почти идентично. Майн использует
и
.
Препарируем вертексы
Чтобы понять, что именно мы рисуем, смотрим на glVertexPointer, glColorPointer и прочие. Везде страйд (stride) равен 36. Значит, структура нашего вертекса весит ровно 36 байт.
Фильтрация моделей (Самый сок)
Просто ловить
с 288 вертексами — плохая идея. Такое же количество вертексов может быть у кровати или лошади. Чтобы не рисовать боксы на мебели, используем фильтрацию по текстурным координатам (TexCoord).
У игроков, кроватей и лошадей текстурные координаты разные. Я подобрал предикаты для игрока, основываясь на данных из Nsight. Если координаты в буфере соответствуют нашей «карте», значит перед нами именно игрок.
Итог
Через Nsight Graphics можно вытащить предикаты под любой объект: сундуки, элитры, мобов. Этот метод стабильнее, чем просто проверка количества вертексов, и позволяет писать легитные читы, которые не лагают и не мусорят на экране. Сурсы базы можно поискать на гитхабе, там есть примеры и под сундуки.
Кто пробовал юзать Nsight под новые версии с шейдерами (1.17+), как там обстоят дела с захватом кадров на новых драйверах?
Что нам это дает?
Мы сможем сделать полный фингерпринт функций OpenGL, вытащить данные буферов, шейдеры и понять, как игра рисует объекты, чтобы наш ESP не превратился в кашу из мусора.
Настройка проекта
Для начала цепляемся к процессу. В Nsight создаем новый проект, указываем путь к java.exe/javaw.exe.
Важный нюанс: аргументы командной строки берите из Process Hacker, но копируйте только сами аргументы, без пути к экзешнику, иначе дебаггер не заведется. Жмем Launch Frame Debugger, залетаем в мир и по F11 делаем захват кадра.
Анализ объектов
В Render Timeline ищем моменты отрисовки игрока и сундуков. К примеру, Event 181 и 296 — рендеринг выглядит почти идентично. Майн использует
Код:
glScalef(1/15, 1/15, 1/15)
Код:
glDrawArrays(Mode.Quads)
Препарируем вертексы
Чтобы понять, что именно мы рисуем, смотрим на glVertexPointer, glColorPointer и прочие. Везде страйд (stride) равен 36. Значит, структура нашего вертекса весит ровно 36 байт.
Код:
unsafe struct Vertex
{
public fixed float Position[3];
public fixed byte Color[4];
public fixed float TexCoord1[2];
public fixed short TexCoord2[2];
public fixed short TexCoord3[2];
public fixed byte Normal[4];
}
Фильтрация моделей (Самый сок)
Просто ловить
Код:
glDrawArrays
- Хукаем glVertexPointer, чтобы сохранить указатель на текущий буфер.
- В хуке glDrawArrays проверяем не только количество вертексов, но и масштаб (scale).
- Если масштаб совпадает, лезем в буфер и проверяем конкретные TexCoord определенных полигонов.
У игроков, кроватей и лошадей текстурные координаты разные. Я подобрал предикаты для игрока, основываясь на данных из Nsight. Если координаты в буфере соответствуют нашей «карте», значит перед нами именно игрок.
Код:
void DrawArrays(Mode mode, int first, int count)
{
if (lastScaleF is not (1f / 15, 1f / 15, 1f / 15))
return;
if ((mode, first, count) is not (Mode.Quads, 0, 288))
return;
var quads = (Quad*)lastBuffer;
var quadsCount = count / 4;
if (!TexPredicates.Player.IsSuitable(quads, quadsCount))
return;
// Тут рисуем свой ESP (через LineLoop или новый буфер)
}
Итог
Через Nsight Graphics можно вытащить предикаты под любой объект: сундуки, элитры, мобов. Этот метод стабильнее, чем просто проверка количества вертексов, и позволяет писать легитные читы, которые не лагают и не мусорят на экране. Сурсы базы можно поискать на гитхабе, там есть примеры и под сундуки.
Кто пробовал юзать Nsight под новые версии с шейдерами (1.17+), как там обстоят дела с захватом кадров на новых драйверах?