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

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
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

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

 

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

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

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

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

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