Начинающий
			
			
				
					
				
			
		- Статус
 - Оффлайн
 
- Регистрация
 - 9 Мар 2021
 
- Сообщения
 - 148
 
- Реакции
 - 11
 
У меня есть адрес энтити листа, если в чит энжине перейти то к чему адрес энтити листа запрашивает доступ, то там будет много адресов игроков.
Если что загвоздка в этом адресе, то что я не могу просто перебирать энтити лист по смещениям от одного энтити к другому, т.к. все энтити каждый раз находятся в рандомных местах, поэтому мне нужно именно узнавать к каким адресам энтити, адрес энтити листа смотрит.
Вопрос через какую библиотеку и как узнать у адреса энтити листа к чем он запрашивает доступ, и куда записывать эти адреса, в массив?
И ещё правильно ли у меня вообще работаем схема с поиском паттернов, может что-то изменить?
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
				
			Если что загвоздка в этом адресе, то что я не могу просто перебирать энтити лист по смещениям от одного энтити к другому, т.к. все энтити каждый раз находятся в рандомных местах, поэтому мне нужно именно узнавать к каким адресам энтити, адрес энтити листа смотрит.
Вопрос через какую библиотеку и как узнать у адреса энтити листа к чем он запрашивает доступ, и куда записывать эти адреса, в массив?
И ещё правильно ли у меня вообще работаем схема с поиском паттернов, может что-то изменить?
			
				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.");
        }
    }
}
	
			
				Последнее редактирование: