There is a code that, for some reason which is incomprehensible to me, cannot find the necessary addresses.
bool CompareMask(const BYTE* pData, const BYTE* bMask, const char* szMask) { for(; *szMask; ++szMask, ++pData, ++bMask) if(*szMask == 'x' && *pData != *bMask) return NULL; return (*szMask) == NULL; } DWORD FindPattern(DWORD dwAddress, BYTE* bMask, char* szMask) { for(DWORD i = 0; i < 2048; i++) if(CompareMask((BYTE*)(dwAddress + i), bMask, szMask)) return (DWORD)(dwAddress + i); return NULL; } void ToolboxThread() { AllocConsole(); freopen("CONOUT$", "w", stdout); MEMORY_BASIC_INFORMATION mMemInfo; for(DWORD dwAddress = 0; dwAddress < 0x7FFFFFFF; dwAddress += 2048) { DWORD dwVirtualQuery = VirtualQuery((void*)dwAddress, &mMemInfo, 2048); if(dwVirtualQuery == ERROR_INVALID_PARAMETER || dwVirtualQuery == NULL) break; if(mMemInfo.Type == MEM_MAPPED) continue; if(!mMemInfo.Protect & (PAGE_GUARD | PAGE_NOCACHE | PAGE_NOACCESS)) { if(mMemInfo.Protect == PAGE_READONLY) { Offsets.Health = FindPattern(dwAddress, (PBYTE)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8C\x01\x00\x00\x00\x36\x65", "??????????????xxx???xx"); Offsets.Mana = FindPattern(dwAddress, (PBYTE)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8C\x02\x00\x00\x00\x37\x65", "??????????????xxx???xx"); Offsets.Vigor = FindPattern(dwAddress, (PBYTE)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8C\x04\x00\x00\x00\x39\x65", "??????????????xxx???xx"); } } } std::cout << Offsets.Health << std::endl << Offsets.Mana << std::endl << Offsets.Vigor << std::endl; } The address masks are correct. They were tested through OllyDbg. Interested in such a moment, why it does not work. Maybe I missed some important detail, because There are not enough resources on this topic in the network.