Прошу прощения у тех кого завлек сюда, не правильной формулировкой вопроса. А также за не корректные формулировки.
Основная задача, логирование чата игры.
Строка в памяти выглядит таким образом
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;
}