А что сложного? Как вариант можно так (код накидал в блокноте): #define MAX_ADDRLISTSIZE 255 void GetModuleInfo(MODULEENTRY32& module, char* module_name, bool main_process) //(из класса MemoryEditor), если хочешь юзать вне класса, //не забудь pID дополнительно передавать { HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pID); module.dwSize = sizeof(MODULEENTRY32); if (Module32First(snapshot, &module)) { if (main_process) { CloseHandle(snapshot); return module; } while (Module32Next(snapshot, &module)) { if (_stricmp(module.szModule, module_name) == 0) { CloseHandle(snapshot); return module; } } } return module; } void findPatterns() { MODULEENTRY32 peInfo = {0}; GetModuleInfo(peInfo, "", true); // берём инфу о самом процессе int startAddress = (DWORD)info.modBaseAddr; // к примеру берём точку входа int finalAddress = startAddress + (DWORD)info.modBaseSize; // конец модуля int scanLen = (DWORD)info.modBaseSize; // размер модуля DWORD addressList[MAX_ADDRLISTSIZE] = {0}; // список адресов BYTE matches = 0; // количество совпадений int currentAddress = 0; // текущий адрес while (currentAddress < finalAddress) { currentAddress = FindPattern(startAddress + currentAddress, // откуда ищем? точка входа + последний найденный адрес scanLen - currentAddress, // сколько памяти просканируем? Длина модуля - посл. найденный адрес (PBYTE)"\0x90\0x90\0x90\0x90", // наша вставка "xxxx"); // наша маска if (currentAddress > 0) { addressList[matches] = currentAddress; // записываем в массив адресов наш адрес matches++; // увеличиваем счётчик совпадений } else break; } for (BYTE i = 0; i < matches; i++) { printf("Result #%d = 0x%X\n", addressList[i]); } } Вот второй вариант (тоже накидал в блокноте, возможно в вызове FindPattern перед matches, нужно будет поставить оператор взятия адреса): #define MAX_ADDRLISTSIZE 255 void FindPattern (DWORD* addrList, // массив адресов BYTE& matches, // кол-во совпадений DWORD start_address, // начало сканирования DWORD length, // сколько памяти просканируем BYTE* pattern, // вставка char *mask) // маска { matches = 0; // счётчик совпадений for (DWORD i = 0; i < length; i++) { if (DataCompare (ReadMemory<BYTE*>(start_address + i), pattern , mask)) // если мы нашли совпадение { addrList[matches] = (DWORD)(start_address + i); /* Записываем в наш список адресов найденный адрес (стартовый адрес + i (кол-во уже просканированных байт))*/ matches++; // увеличиваем счётчик совпадений } } } void findPatterns() { DWORD addressList[MAX_ADDRLISTSIZE] = {0}; // список адресов BYTE matches = 0; // кол-во совпадений MODULEENTRY32 peInfo = {0}; GetModuleInfo(peInfo, "", true); // берём инфу о самом процессе FindPattern(addressList, // передаём наш массив функции (в него она запишет адреса) matches, // передаём ей наш счётчик, куда функция запишет кол-во совпадений (DWORD)info.modBaseAddr, // откуда сканируем? базовый адрес приложения (DWORD)info.modBaseSize, // сколько сканируем? размер приложения (PBYTE)"\0x90\0x90\0x90\0x90", // наша вставка "xxxx"); // наша маска for (BYTE i = 0; i < matches; i++) printf("Result #%d = 0x%X\n", addressList[i]); }