Kreozotik
@Kreozotik
Новичок в программировании

C# Поиск сигнатуры в памяти процесса?

Прошу прощения у тех кого завлек сюда, не правильной формулировкой вопроса. А также за не корректные формулировки.

Основная задача, логирование чата игры.

Строка в памяти выглядит таким образом
2015-09-12 01:00:06 [CLIENT] [INFO] [CHAT] здесь произвольный текст сообщения заканчивающийся 0A
С помощью Cheat Engine(Далее CE) ищу строку [CLIENT] [INFO] [CHAT] в процессе есть всего 2 таких строки и обе они ведут к интересующей меня информации. То есть, после этой строки всегда идет последнее сообщение чата. Основывая на этом уроке https://youtu.be/lgdfwifDB8o перевожу эту строку в HEX и пытаюсь искать эту маску

hex - 5B 43 4C 49 45 4E 54 5D 20 5B 49 4E 46 4F 5D 20 5B 43 48 41 54 5D
dec - 91 64 76 73 69 78 84 93 32 91 73 78 70 79 93 32 91 67 72 65 84 93

Заминка в том, что CE не указывает на конкретный модуль, как описано в уроке, а только на базовый адрес и длину. Которые мы должны получать в коде. Также заметил что длина всегда разная, предполагаю что это динамически выделяемая память.

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

Все делаю в C# как описано в уроке и код тот же, за исключением маски.

Вопросы:
Как заставить это работать?
Что искать что бы поумнеть, для решения этой задачи?


Код функции для поиска сигнатуры.
public int FindSignature()
        {
            var moduleName = "Имя процесса";
            var startAddress = 0;
            var sizeToAllocate = 0;
            var pattern = new int[] { 91, 64, 76, 73, 69, 78, 84, 93, 32, 91, 73, 78, 70, 79, 93, 32, 91, 67, 72, 65, 84, 93 };

            if (pID != 0)
            {
                foreach (var p in Process.GetProcesses())
                {
                    if (p.Id == pID)
                    {
                        foreach (ProcessModule m in p.Modules)
                        {
                            if (m.ModuleName == moduleName)
                            {

                                //startAddress = (int)p.MainModule.BaseAddress;
                                startAddress = (int)m.BaseAddress;
                                //sizeToAllocate = p.MainModule.ModuleMemorySize;
                                sizeToAllocate = m.ModuleMemorySize;
                                break;
                            }
                        }
                        
                    }
                }
                var Handle = OpenProcess(0x001F0FFF, false, pID);
                if (Handle != IntPtr.Zero)
                {
                    byte[] buffer = new byte[sizeToAllocate];
                    IntPtr bytesread;
                    ReadProcessMemory(Handle, (IntPtr)startAddress, buffer, sizeToAllocate, out bytesread);
                    CloseHandle(Handle);
                    var counter = 0;
                    if (pattern.Length <= buffer.Length)
                    {
                        for (var i=0; i < buffer.Length; i++)
                        {
                            if (buffer[i] == pattern[0] | pattern[0] == -1)
                            {
                                for (var j = 0; j < pattern.Length; j++)
                                {
                                    if(buffer[i+j] == pattern[j] | pattern[j] == -1)
                                    {
                                        counter++;
                                        if (counter == pattern.Length)
                                        {
                                            var result = i + startAddress;
                                            return (int)result;
                                        }
                                    }
                                    else
                                    {
                                        counter = 0;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return (int)0;
        }
  • Вопрос задан
  • 1902 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы