-
Автор темы
- #1
У меня есть адрес энтити листа, если в чит энжине перейти то к чему адрес энтити листа запрашивает доступ, то там будет много адресов игроков.
Если что загвоздка в этом адресе, то что я не могу просто перебирать энтити лист по смещениям от одного энтити к другому, т.к. все энтити каждый раз находятся в рандомных местах, поэтому мне нужно именно узнавать к каким адресам энтити, адрес энтити листа смотрит.
Вопрос через какую библиотеку и как узнать у адреса энтити листа к чем он запрашивает доступ, и куда записывать эти адреса, в массив?
И ещё правильно ли у меня вообще работаем схема с поиском паттернов, может что-то изменить?
Если что загвоздка в этом адресе, то что я не могу просто перебирать энтити лист по смещениям от одного энтити к другому, т.к. все энтити каждый раз находятся в рандомных местах, поэтому мне нужно именно узнавать к каким адресам энтити, адрес энтити листа смотрит.
Вопрос через какую библиотеку и как узнать у адреса энтити листа к чем он запрашивает доступ, и куда записывать эти адреса, в массив?
И ещё правильно ли у меня вообще работаем схема с поиском паттернов, может что-то изменить?
C++:
// Переменные для хранения результата поиска паттерна
static uintptr_t patternAddress = 0;
static bool patternFound = false;
// Структура для хранения паттернов и функций
struct PatternFunction {
const char* pattern;
const char* mask;
void** functionPointer;
void* hookFunction;
};
// Функция для поиска паттерна в памяти
uintptr_t FindPattern(uintptr_t start, uintptr_t size, const char* pattern, const char* mask) {
size_t patternLength = strlen(mask);
for (uintptr_t i = 0; i < size - patternLength; i++) {
bool found = true;
for (uintptr_t j = 0; j < patternLength; j++) {
if (mask[j] != '?' && pattern[j] != *(char*)(start + i + j)) {
found = false;
break;
}
}
if (found) {
return start + i;
}
}
return NULL;
}
uintptr_t FindPatternInModule(const char* moduleName, const char* pattern, const char* mask) {
MODULEINFO moduleInfo = { 0 };
HMODULE hModule = GetModuleHandle(moduleName);
if (!hModule) return NULL;
GetModuleInformation(GetCurrentProcess(), hModule, &moduleInfo, sizeof(MODULEINFO));
uintptr_t base = (uintptr_t)moduleInfo.lpBaseOfDll;
uintptr_t size = (uintptr_t)moduleInfo.SizeOfImage;
return FindPattern(base, size, pattern, mask);
}
// Примерная инициализация паттернов и их привязка
PatternFunction patternFunctions[3] = {
{ "\xD8\x03\xD9\x5D\x00\xD9\x85", "xxxx?xx", nullptr, nullptr },
{ "\xAA\xBB\xCC\xDD\xEE\xFF\x00", "xxxxxxx", nullptr, nullptr },
{ "\x12\x34\x56\x78\x9A\xBC\xDE", "xxxxxxx", nullptr, nullptr },
};
void InitPatternFunctions() {
for (auto& pf : patternFunctions) {
uintptr_t address = FindPatternInModule("game.exe", pf.pattern, pf.mask);
if (address && pf.functionPointer && pf.hookFunction) {
kiero::bind(42, pf.functionPointer, pf.hookFunction); // kiero hook использую есличо
Log("Pattern bound successfully.");
}
else {
Log("Pattern binding failed.");
}
}
}
Последнее редактирование: