- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 658
- Реакции
- 18
Разбор полетов: почему внешний ESP в Rust перестал работать и шлет мусор в консоль.
После очередного патча структуры и оффсеты в Rust поплыли, что для внешнего софта через RPM — классическая головная боль. Если у вас EntityList выдает фантомных игроков, а W2S рисует «в молоко», значит вы юзаете старую базу или криво резолвите GC хендлы.
Issue 1: Фантомные игроки и проверка имен классов
Проверка clsName[0] == '\0' — это технический приговор. Именно так вы ловите «призраков» там, где на сервере вы один. При неудачном чтении памяти или попадании на мусорную область вы не скипаете итерацию, а считаете ее валидной.
Совет: Выбрасывайте логику с проверкой на пустую строку. Если не удалось прочитать имя класса или оно не соответствует BasePlayer / Scientist — скипайте объект сразу. Идеальный вариант — чекать type_info и сравнивать указатели на классификаторы, а не парсить строки в каждом цикле, это в разы быстрее и надежнее.
Issue 2: GC Handle и EntityRealm
Если RAW ClntEnts возвращает ноль, дело не в функции декрипта, а в том, что ваш входной поинтер уже битый. Оффсет static_fields + 0x08 часто прыгает на 0x28 или 0x10 в зависимости от билда.
Формула rcx = (handle & 7) - 1 фундаментальна для IL2CPP, но проверьте актуальность HANDLE_TABLE_RVA. Его проще всего найти через поиск ссылок на il2cpp_gchandle_get_target в GameAssembly.dll.
Issue 3: ViewMatrix и камера
Когда координаты улетают за экран (Drawn = 0), проблема либо в неверном смещении ViewMatrix, либо CameraInstance указывает на неактивную камеру (например, камеру меню).
Внешние читы на Rust сейчас выживают только за счет качественного обхода EAC и актуальной архитектуры. Если база «сыпется», копайте в сторону GameAssembly и смотрите, куда реально ссылается get_handle.
Кто-нибудь уже пробовал переходить на резолв через цепочки в обход дефолтных GC таблиц?
После очередного патча структуры и оффсеты в Rust поплыли, что для внешнего софта через RPM — классическая головная боль. Если у вас EntityList выдает фантомных игроков, а W2S рисует «в молоко», значит вы юзаете старую базу или криво резолвите GC хендлы.
Issue 1: Фантомные игроки и проверка имен классов
Проверка clsName[0] == '\0' — это технический приговор. Именно так вы ловите «призраков» там, где на сервере вы один. При неудачном чтении памяти или попадании на мусорную область вы не скипаете итерацию, а считаете ее валидной.
Совет: Выбрасывайте логику с проверкой на пустую строку. Если не удалось прочитать имя класса или оно не соответствует BasePlayer / Scientist — скипайте объект сразу. Идеальный вариант — чекать type_info и сравнивать указатели на классификаторы, а не парсить строки в каждом цикле, это в разы быстрее и надежнее.
Issue 2: GC Handle и EntityRealm
Если RAW ClntEnts возвращает ноль, дело не в функции декрипта, а в том, что ваш входной поинтер уже битый. Оффсет static_fields + 0x08 часто прыгает на 0x28 или 0x10 в зависимости от билда.
Код:
inline constexpr std::uintptr_t handle_table = 0xDA935B0; // Проверяйте этот RVA через IDA
inline constexpr std::uint32_t static_fields = 0xB8;
inline constexpr std::uint32_t client_entities = 0x28; // Попробуйте сменить 0x08 на это значение
Issue 3: ViewMatrix и камера
Когда координаты улетают за экран (Drawn = 0), проблема либо в неверном смещении ViewMatrix, либо CameraInstance указывает на неактивную камеру (например, камеру меню).
- Проверьте оффсет матрицы в MainCamera. В свежих билдах матрица может быть смещена или находиться в другом подобъекте.
- Убедитесь, что вы не читаете старую матрицу до захода на сервер.
- Для внешней отрисовки лучше дампить матрицу целиком (4x4 float) одним RPM вызовом, чтобы избежать десинхрона между осями.
Код:
namespace base_networkable {
inline constexpr std::uintptr_t typeinfo = 0xE43C280;
inline constexpr std::uint32_t static_fields = 0xB8;
inline constexpr std::uint32_t entity_list = 0x10;
inline constexpr std::uint32_t buffer = 0x18;
}
Внешние читы на Rust сейчас выживают только за счет качественного обхода EAC и актуальной архитектуры. Если база «сыпется», копайте в сторону GameAssembly и смотрите, куда реально ссылается get_handle.
Кто-нибудь уже пробовал переходить на резолв через цепочки в обход дефолтных GC таблиц?