Короче парни, если кто еще читает. Получилось то что хотел. Накопипастел со всего инета. Работает на x64 сканирует 32х приложения и находит мои данные в пределах выше 4 гб. И что самое приятное, он пожалуй самый быстрый.(хотя по модулю может чуть быстрее) И очень простой и маленький код Спасибо кенгу за его видо уроки и Laziz за вектор поиска вот готовый код using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using TradingAssisetent;using System.Diagnostics;using System.Runtime.InteropServices;namespace TradingAssisetent{ public class sigScan { [DllImport("kernel32.dll")] public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] buffer, uint size, int lpNumberOfBytesRead); [DllImport("kernel32.dll")] protected static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, int dwLength); [StructLayout(LayoutKind.Sequential)] protected struct MEMORY_BASIC_INFORMATION { public IntPtr BaseAddress; // Указатель на базовый адрес региона страниц. public IntPtr AllocationBase; // Указатель на базовый адрес диапазона страниц, выделенных VirtualAlloc функции. Страница, на которую указывает BaseAddress элемента, содержащаяся в данном диапазоне распределения. public uint AllocationProtect; // Опция Защита памяти, когда область была первоначально выделено. Этот элемент может быть одним из постоянных защиты памяти или 0, если абонент не имеет доступа. public uint RegionSize; // Размер области, начиная с базового адреса, в которой все страницы имеют идентичные атрибуты, в байтах. public uint State; public uint Protect; public uint Type; } List<MEMORY_BASIC_INFORMATION> MemReg { get; set; } // Структура карты памяти MemReg public void MemInfo(IntPtr pHandle) // В место того что бы каждый раз читать ReadProcessMemory, создадим свою карту памяти. // Свалим все, в одну кучу(MemReg) и будем в нем искать свою сигнатуру { // Функция VirtualQueryEx возвращает информацию о диапазоне страниц, виртуального адресного пространства указанного процесса. IntPtr Addy = new IntPtr(); // hProcess: THandle; //дескриптор процесса while (true) // lpAddress: Pointer; //адрес начала региона памяти { // var lpBuffer: TMemoryBasicInformation; //буфер для получения информации MEMORY_BASIC_INFORMATION MemInfo = new MEMORY_BASIC_INFORMATION(); // dwLength: DWORD //размер буфера int MemDump = VirtualQueryEx(pHandle, Addy, out MemInfo, Marshal.SizeOf(MemInfo)); // Вызовим VirtualQueryEx, получим базовый адрес процесса и размер региона в структуру MEMORY_BASIC_INFORMATION if (MemDump == 0) break; // Выход из цыкла if ((MemInfo.State & 0x1000) != 0 && (MemInfo.Protect & 0x100) == 0) // Если флаг региона 0x1000, 0x100 известные флаги (MEM_COMMIT, MEM_RESERVE, MEM_FREE, MEM_PRIVATE, MEM_MAPPED, or MEM_IMAGE). MemReg.Add(MemInfo); // Добавим в MemReg Addy = new IntPtr(MemInfo.BaseAddress.ToInt32() + (int)MemInfo.RegionSize); } } public IntPtr _Scan(byte[] sIn, byte[] sFor) { int[] sBytes = new int[256]; int Pool = 0; int End = sFor.Length - 1; for (int i = 0; i < 256; i++) sBytes[i] = sFor.Length; for (int i = 0; i < End; i++) sBytes[sFor[i]] = End - i; while (Pool <= sIn.Length - sFor.Length) { for (int i = End; sIn[Pool + i] == sFor[i]; i--) if (i == 0) return new IntPtr(Pool); Pool += sBytes[sIn[Pool + End]]; } return IntPtr.Zero; } public IntPtr AobScan(string ProcessName, byte[] Pattern) { Process[] P = Process.GetProcessesByName(ProcessName); // Получим в p процес; if (P.Length == 0) return IntPtr.Zero; // Если процесс не найден, вернем 0; MemReg = new List<MEMORY_BASIC_INFORMATION>(); // Создадим маcсив структуры -> MEMORY_BASIC_INFORMATION; MemInfo(P[0].Handle); // Получим хендл; for (int i = 0; i < MemReg.Count; i++) // Перечисляем пока есть страницы { byte[] buff = new byte[MemReg[i].RegionSize ]; // Буфер ReadProcessMemory(P[0].Handle, MemReg[i].BaseAddress, buff, MemReg[i].RegionSize, 0); IntPtr Result = _Scan(buff, Pattern); if (Result != IntPtr.Zero) return new IntPtr(MemReg[i].BaseAddress.ToInt32() + Result.ToInt32()); } return IntPtr.Zero; } } } private void button3_Click(object sender, EventArgs e) { sigScan sigScan = new sigScan(); textBox1.Text = ""; string hexValues = textBox2.Text; //берем значение с поисковой строки byte[] toFind = System.Text.Encoding.UTF8.GetBytes(hexValues); //перводим стринг в байт IntPtr MyAddress = sigScan.AobScan("EliteDangerous32", toFind); textBox1.Text = textBox1.Text + MyAddress.ToString(); }