Перейти к содержанию

Sergey99

Пользователи
  • Постов

    97
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

Весь контент Sergey99

  1. Я сомневаюсь что координаты представлены как тип Double Но попробую поискать видовую матрицу как Double между -1.0 и 1.0
  2. Да уж спустя столько времени я так и не нашёл матрицу, проверял даже банально подстановкой в код для преобразования, чтобы сразу проверять правильные ли байты или нет. Интересно почему так, может я не там ищу?
  3. В Phasmophobia смещение между адресами с координатами игрока = 8 байт, всё из-за того что между каждыми этими адресами есть ещё один, где хранится коке-то значение, которое мне не интересно и оно тоже занимает 4 байта памяти. Может ли в таком случае структура видовой матрицы изменится как-нибудь или же она всегда 4x4 = 16 байт и каждый столбец - это X, Y, Z для определённого вектора?
  4. Нашёл видовую матрицу для Amnesia, в конце можно увидеть куда деваются все объекты после "неожиданного исчезновения": Как выясняется расположение координат в адресном пространстве не влияет на обработку видовой матрицы: - Amnesia, адрес со значением Roll (выделен красным), находится во втором столбце - CoD:MW2, адрес со значением Roll (выделен красным), находится в третьем столбце, подобно адресу, хранящим координату Z в структуре объекта. Что же, раз положение Roll, зависит от порядка следования координат, сейчас пойду искать в игре Phasmophobia, сообщу как результат.
  5. Это для CoD:MW2 я уже nop'ы поставил и проверил, изображение становится плоским + на видео я показывал, что там работает всё. Сейчас буду тоже самое пробовать для Amnesia и Phasmophobia. Так как там координаты немного местами поменяли разработчики
  6. Есть вероятность того, что игра обидится и закроется, если наткнусь на не те адреса и установлю инструкцию nop. Но попробовать стоит.
  7. Тут просто обычная функция, или метод (если ты в классе реализуешь это), вот пример где всё хранится в массивах: private int WorldToScreen() { screenCoords[0] = objCoord[0] * view_matrix[0] + objCoord[1] * view_matrix[1] + objCoord[2] * view_matrix[2] + view_matrix[3]; screenCoords[1] = objCoord[0] * view_matrix[4] + objCoord[1] * view_matrix[5] + objCoord[2] * view_matrix[6] + view_matrix[7]; screenCoords[2] = objCoord[0] * view_matrix[8] + objCoord[1] * view_matrix[9] + objCoord[2] * view_matrix[10] + view_matrix[11]; screenCoords[3] = objCoord[0] * view_matrix[12] + objCoord[1] * view_matrix[13] + objCoord[2] * view_matrix[14] + view_matrix[15]; if (screenCoords[3] < 0.1f) { return 0; } ndc[0] = screenCoords[0] / screenCoords[3]; ndc[1] = screenCoords[1] / screenCoords[3]; ndc[2] = screenCoords[2] / screenCoords[3]; strucPoint.X = Convert.ToInt32((this.Width / 2 * ndc[0]) + (ndc[0] + this.Width / 2)); strucPoint.Y = Convert.ToInt32(-(this.Height / 2 * ndc[1]) + (ndc[1] + this.Height / 2)); return 1; } А вот источник где также описаны функции WorldToScreen, только для хранения они используют поля структур или классов: https://guidedhacking.com/threads/world2screen-direct3d-and-opengl-worldtoscreen-functions.8044/ Как найти видовую матрицу от туда же: https://guidedhacking.com/threads/how-to-get-started-with-learning-viewmatrix.13663/ Но я использовал метод поиска между -1.0 и 1.0
  8. Сейчас ещё параллельно пытаюсь найти видовую матрицу в Amnesia - The Dark Descent. Тут также как в Phasmophobia координата Z вторая по счёту, а не третья. Ищу видовую матрицу, описание с рисунком есть здесь: https://www.3dgep.com/understanding-the-view-matrix/ Поэтому я сравниваю, вот нахожу нечто похожее (самая нижняя строка также представлена как 0, 0, 0, 1), но один из элементов в матрице не меняется, а точнее Y для right вектора, соответственно преобразование не работает, хотя в CoD:MW2 точно также ведёт себя X для forward вектора (выделен красным)
  9. Конечно видео есть, вот: Всё довольно просто, использую конвертированные в 2D координаты из 3D для рисования зелёного текста с чёрным фоном. То же самое и для Phasmophobia хочется реализовать, но как я описывал в теме, возникли некоторые трудности.
  10. Всем привет! Не давно тут решил поиграться с такой замечательной вещью как видовая матрица. В качестве подопытной игры выбрал Call of Duty: Modern Warfare 2. В качестве инструмента выбрал язык C# и сканер памяти Cheat Engine. Соответственно нашёл адрес игрового объекта к примеру вертолёт, хранящий ось X и далее по смещениям в 4 байта нашёл Y и Z. Использовал Win API функцию ReadProccessMemory, предварительно описав её: [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr OpenProcess(int processAccess, bool bInheritHandle, int processId); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr hObject); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool ReadProcessMemory(IntPtr pHandle, IntPtr Address, ref float Buffer, int Size, IntPtr NumberofBytesRead); Читаю байты из памяти: /// <summary> /// Reads bytes from the specified address in the proccess memory, saves bytes to the buffer /// </summary> private void ReadBytes() { ReadProcessMemory(handle, (IntPtr)BaseAddress, ref tempCoord, size, (IntPtr)bytesRead); objCoord[0] = tempCoord; //X coordinate ReadProcessMemory(handle, (IntPtr)(BaseAddress + 4), ref tempCoord, size, (IntPtr)bytesRead); objCoord[1] = tempCoord; //Y coordinate ReadProcessMemory(handle, (IntPtr)(BaseAddress + 4 + 4), ref tempCoord, size, (IntPtr)bytesRead); objCoord[2] = tempCoord; //Z coordinate } В общем по игрался с координатами всё замечательно работает, потом решил поискать видовую матрицу. Само собой искал неизвестное значение в диапазоне от -1.0 до 1.0 Нашёл, это матрица 4 на 4 = всего 16 байт для чтения, записал в массив: /// <summary> /// Reads bytes for the view matrix, saves it to the buffer /// </summary> private void GetViewMatrix() { for (int i = 0; i < 16; i++) { ReadProcessMemory(handle, (IntPtr)(VMBaseAddress + (i * 4)), ref tempCoord, size, (IntPtr)bytesRead); view_matrix[i] = tempCoord; } } А затем преобразовывал их в координаты на экране и писал результат (x, y координаты) в поля моей структуры, чтобы потом использовать их для рисования объекта, который как раз таки будет отображать игровой объект подобно ESP хакам: /// <summary> /// Converts coordinates from 3D world of the game to 2D coordinates for the Form, sets Indicator position using converted 2D coordinates, returns 1 - object is visible on form; 0 - otherwise /// </summary> /// <returns>integer value 1 - object is visible on form; 0 - otherwise</returns> private int WorldToScreen() { screenCoords[0] = objCoord[0] * view_matrix[0] + objCoord[1] * view_matrix[1] + objCoord[2] * view_matrix[2] + view_matrix[3]; screenCoords[1] = objCoord[0] * view_matrix[4] + objCoord[1] * view_matrix[5] + objCoord[2] * view_matrix[6] + view_matrix[7]; screenCoords[2] = objCoord[0] * view_matrix[8] + objCoord[1] * view_matrix[9] + objCoord[2] * view_matrix[10] + view_matrix[11]; screenCoords[3] = objCoord[0] * view_matrix[12] + objCoord[1] * view_matrix[13] + objCoord[2] * view_matrix[14] + view_matrix[15]; if (screenCoords[3] < 0.1f) { return 0; } ndc[0] = screenCoords[0] / screenCoords[3]; ndc[1] = screenCoords[1] / screenCoords[3]; ndc[2] = screenCoords[2] / screenCoords[3]; strucPoint.X = Convert.ToInt32((this.Width / 2 * ndc[0]) + (ndc[0] + this.Width / 2)); strucPoint.Y = Convert.ToInt32(-(this.Height / 2 * ndc[1]) + (ndc[1] + this.Height / 2)); return 1; } Всё прекрасно работало, но потом решил сделать тоже самое для игры Phasmophobia, и так, сперва нашёл адрес объекта, в данном случае баскетбольный мяч (его можно найти на карте главного меню), читаю значения из адреса с координатами. Координаты там представлены довольно "маленькими значениями" типа float (для сравнения: 324.5643 - Cod:MW2; 1.0344543533 - Phasmophobia). К тому же адреса довольно длинные (больше 8 символов в HEX формате) для этого мне пришлось использовать тип данных структуры System.Int64 (тип long) для хранения адресов, и запускать проект в x64 сборке чтобы преобразование (IntPtr)(VMBaseAddress) было рабочим при передаче аргумента в функцию ReadProccessMemory. Учитывая то что игра написана на движке Unity, координата по оси Z находится второй по счёту (после первого смещения в 4 байта), а не третьей (после второго смещения в 4 байта) как в остальных играх, ведь в Unity немного по другому расположены координатные прямые. И так нашёл адреса и значения всё также по смещениям в 4 байта, пришло время искать видовую матрицу. И вот тут собственно начались проблемы, я нашёл очень похожый массив байт в 16 элементов как в предыдущей игре и попытался преобразовать и нарисовать объект на экране, но годного ESP не получилось, вместо этого объект рисовался вокруг да около нужного места. Вот по этому прошу помощи в поиске и разъяснение касательно именно для Unity: Может ли быть такое, что подобное преобразование (описано в методе WorldToScreen() см. код выше) может являться некорректным, учитывая особенность координат в Unity, ведь я записывал координаты в том порядке в котором они представлены в игре, то есть Z во вторую ячейку, а Y в третью??
  11. Разобрался CE показывает мне 32 бита а не 64)
  12. Контейнер? То есть не тип данных как таковой
  13. Всем привет! Хочу узнать в чём разница между Exact Value 4 Bytes и Float. При чём я знаю, что Float тоже занимает 4 байта. Проблема в том, что при сканировании виртуального адресного пространства игры, например, при поиске числа 245 как Float или как Exact Value, CE выдаёт мне разные результаты. Объясните почему так и в чём собственно разница?
  14. Эх а я то думал, что true/flase Noclip'а это такая же часть структуры игрока как например жизнь или число патронов
  15. Опа, спасибо огромное!!! Хммм, а почему ты отсеиваешь значения в диапазоне от патронов и + n (это самому определить?) И я как то и не думал, что значения сперва на максимум грузятся, а потом уменьшаются, это для чего так сделано?
  16. Мультиплеер это одно, ведь как и в мультиплеере, в сингле мисси тоже протекают на сервере, только там он локальный)
  17. "консоль не доступна" нам игрокам, разработчики за блокировали тильду и тд, но сами команды есть и консоль соответственно тоже или как он тогда тестировали игру?
  18. Было бы не плохо. Мне известны способы создания всех функций, которые есть в том трейнере, но вот с noclip и тд командами из консоли проблемка есть. По этому собственно и тему создал)
  19. Чтобы отсеять значения, нужно вызывать команды, а в игре они есть, но консоль не доступна и прикол с конфигом в духе set thereisacow 1337 не пашет уже
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.