Перейти к содержанию
Авторизация  
Bo0m21

Left 4 Dead 2 External - Чтение всех игроков

Рекомендуемые сообщения

Всем привет! Ребят занимаюсь написанием экстелнал чита для игры и наблюдаю проблему, она заключается в том что некоторые  игроки или монстры просто не читаются.

Хотя большая асть читается и работает правильно. Кто с таким сталкивался? И как быть в подобной ситуации?

 

Спойлер

    public static class Offsets
    {
        // Client dll
        public static readonly int PlayerLocal = 0x007094D8;
        public static readonly int PlayersList = 0x0071A044;
        public static readonly int PlayersListCount = 0x00824D14;
 
        public static readonly int PlayerNext = 0x10;
 
        public static readonly int PlayerHealth = 0xEC;
        public static readonly int PlayerCommand = 0xE4;
        public static readonly int PlayerСoordinates = 0x94;
        public static readonly int PlayerCoordinatesView = 0xF4;
 
        // Engine dll
        public static readonly int ViewMatrixBase = 0x00605EEC;
        public static readonly int ViewMatrix = 0x2E4;
    }
 
    public static class Players
    {
        public static PlayerModel LocalPlayer;
        public static List<PlayerModel> AllPlayers;
 
        private static byte[] buffer;
 
        /// <summary>
        ///     Update local player
        /// </summary>
        public static void UpdatePlayerLocal()
        {
            PlayerModel newLocalPlayer = new PlayerModel();
 
            MemoryHelpers.ReadMemory(Game.ClientdllAdress + Offsets.PlayerLocal, 4, out buffer);
            newLocalPlayer.Adress = BitConverter.ToInt32(buffer, 0);
 
            MemoryHelpers.ReadMemory(newLocalPlayer.Adress + Offsets.PlayerHealth, 4, out buffer);
            newLocalPlayer.Health = BitConverter.ToInt32(buffer, 0);
 
            MemoryHelpers.ReadMemory(newLocalPlayer.Adress + Offsets.PlayerCommand, 4, out buffer);
            newLocalPlayer.Command = BitConverter.ToInt32(buffer, 0);
 
            newLocalPlayer.Coordinates = new float[3];
            for (int i = 0; i < 3; i++)
            {
                MemoryHelpers.ReadMemory(newLocalPlayer.Adress + Offsets.PlayerСoordinates + i * 4, 4, out buffer);
                newLocalPlayer.Coordinates[i] = BitConverter.ToSingle(buffer, 0);
            }
 
            newLocalPlayer.CoordinatesView = new float[3];
            for (int i = 0; i < 3; i++)
            {
                MemoryHelpers.ReadMemory(newLocalPlayer.Adress + Offsets.PlayerCoordinatesView + i * 4, 4, out buffer);
                newLocalPlayer.CoordinatesView[i] = BitConverter.ToSingle(buffer, 0);
            }
 
            newLocalPlayer.ViewMatrix = new float[4, 4];
            MemoryHelpers.ReadMemory(Game.EnginedllAdress + Offsets.ViewMatrixBase, 4, out buffer);
            int viewMatrixAdress = BitConverter.ToInt32(buffer, 0);
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    MemoryHelpers.ReadMemory(viewMatrixAdress + Offsets.ViewMatrix + (i * 16) + (j * 4), 4, out buffer);
                    newLocalPlayer.ViewMatrix[i, j] = BitConverter.ToSingle(buffer, 0);
                }
            }
 
            LocalPlayer = newLocalPlayer;
        }
 
        /// <summary>
        ///     Update all players
        /// </summary>
        public static void UpdateAllPlayer()
        {
            int playersCount = 4096;  // TODO: Rewrite get count players
            List<PlayerModel> newPlayers = new List<PlayerModel>();
 
            for (int i = 0; i < playersCount; i++)
            {
                PlayerModel player = new PlayerModel();
 
                MemoryHelpers.ReadMemory(Game.ClientdllAdress + Offsets.PlayersList + i * Offsets.PlayerNext, 4, out buffer);
                player.Adress = BitConverter.ToInt32(buffer, 0);
 
                MemoryHelpers.ReadMemory(player.Adress + Offsets.PlayerHealth, 4, out buffer);
                player.Health = BitConverter.ToInt32(buffer, 0);
 
                MemoryHelpers.ReadMemory(player.Adress + Offsets.PlayerCommand, 4, out buffer);
                player.Command = BitConverter.ToInt32(buffer, 0);
 
                // Check Health and Command player
                if (player.Health == 0 || player.Command == 0)
                {
                    continue;
                }
 
                player.Coordinates = new float[3];
                for (int j = 0; j < 3; j++)
                {
                    MemoryHelpers.ReadMemory(player.Adress + Offsets.PlayerСoordinates + j * 4, 4, out buffer);
                    player.Coordinates[j] = BitConverter.ToSingle(buffer, 0);
                }
 
                player.CoordinatesView = new float[3];
                for (int j = 0; j < 3; j++)
                {
                    MemoryHelpers.ReadMemory(player.Adress + Offsets.PlayerCoordinatesView + j * 4, 4, out buffer);
                    player.CoordinatesView[j] = BitConverter.ToSingle(buffer, 0);
                }
 
                newPlayers.Add(player);
            }
 
            AllPlayers = newPlayers;
        }
    }

 

 

 

image.png

Изменено пользователем Xipho
В следующий раз будет пред за незнание правил форума.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не уверен, но у тебя цикл ограничен тремя проходами, а игроки могут быть по другому смещению, насколько я знаю, в сурсе так и есть, поэтому имеет смысл сделать больше проходов и просто сделать валидацию.

UPD: А, я немного неверно прочитал исходный код, вроде бы по коду всё правильно, попробуй другое смещение до PlayerList'a или увеличь/уменьши playersCount, не уверен, что поможет, но попробуй

Изменено пользователем KRYPTOPUNK
нормально перечитал исходный код

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего дело в списке игроков, соурс движок славиться своим "отзеркаливанием" структур, которые разделены на кешированые и постоянные, в первых хранятся данные об игроках с которыми было какое-то взаимодействие ранее, в постоянных все остальные. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я уже испробовал много способов по смещению и всему остальному и это работает не правильно, и пока не могу понять в чем дело.

 

Тут вопрос такой, как найти всех отзеркаленных игроков или наоборот постоянных?

 

Возможно на форуме есть кто нибудь кто делал эксиклнал чит и может что то подсказать. Листок я хочу сделать все через экстернат и дописать аим и разброс. Так как лично я не видел таких витков на эту игру и поэтому есть интерес сделать подобне. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

сигнатура на функцию-активатор подсветки: 
E8 ?? ?? ?? ?? 8B 45 F8 8B 55 F4 40 89 45 F8 3B 42 18 0F 8C ?? ?? ?? ?? 5F 5E 8B E5 5D 8B E3 5B C3

и сигнатура на функцию, которая перебирает списки npc для дальнейшей подсветки: 
53 8B DC 83 EC 08 83 E4 F0 83 C4 04 55 8B 6B 04 89 6C 24 04 8B EC 83 EC 28 56 8B F1 83 7E 18 00 57 89 75 F4 0F 84 ?? ?? ?? ?? 6A FF E8 ?? ?? ?? ?? 83 C4 04 89 45 FC 85 C0 0F 84 ?? ?? ?? ?? 83 7E 18 00 C7 45 ?? ?? ?? ?? ?? 0F 8E ?? ?? ?? ?? EB 02


 

Спойлер

unknown.png?width=565&height=438

 

и немного восстановленная функция на которую указывает сигнатура, надеюсь это как-то поможет

Спойлер

unknown.png

 

И смещения на свойства подсветки, хотя похоже они у тебя и так есть

 

Спойлер

HoEfVzUnzkQ.jpg

 

Изменено пользователем ChestGlaring

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слушай а можно как нибудь разобраться в том почему проблемы у меня? Хотелось бы сделать экстернал и не использовать готовую подсветку а рисовода самому, только вот проблема со считыванием игроков.

 

Можно твои контакты? Скайп телегу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

  • Предпросмотр
Авторизация  

×
×
  • Создать...

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

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