-
Автор темы
- #1
Простой код для парсинга смещений и названий игровых кваров, для автоматического обновления можно и нужно использовать паттерн для поиска функции инициализации кваров.
Паттерн: "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 81 EC ? ? ? ? 0F 29 70 E8 48 8B F9"
Размер функции: 0xF988
Begin - Адрес начала функции SCVars::InitCVars()
End - Разумеется конец этой функции.
Пример использования:
Вариант второй:
- Ставим хук на IConsole::Register(virtual index 7), парсим 1 и 2 аргументы.
Паттерн: "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 81 EC ? ? ? ? 0F 29 70 E8 48 8B F9"
Размер функции: 0xF988
Begin - Адрес начала функции SCVars::InitCVars()
End - Разумеется конец этой функции.
C++:
bool IsAscii(std::string String) {
auto Ascii = [](char ch) -> bool { return ch >= 0 && ch < 128; };
for (auto It : String) { if (!Ascii(It)) { return false; } }
return true;
};
std::map< std::string, std::uintptr_t > ParseCVars() {
auto CVars = std::map< std::string, std::uintptr_t >();
auto Begin = std::uintptr_t { 0x1412E9F90 };
auto End = Begin + std::uintptr_t{ 0xF988 };
char* Name = 0;
auto Offset = std::uintptr_t{ 0x0 };
for (auto It = Begin; It != End; It++) {
if (::IsBadReadPtr(reinterpret_cast<void*>(It), 4)) {
continue;
}
auto Opcode = reinterpret_cast<std::uint8_t*>(It);
/* lea r8, rdi */
if (Opcode[0] == 0x4C && Opcode[1] == 0x8D &&
(Opcode[2] == 0x47 || Opcode[2] == 0x87)) {
Offset = *reinterpret_cast<int*>(It + 0x3);
if (!Offset) {
continue;
}
if (Offset >= (End - Begin)) {
Offset = *reinterpret_cast<unsigned char*>(It + 0x3);
}
}
/* lea rdx */
if (Opcode[0] == 0x48 && Opcode[1] == 0x8d) {
Name = reinterpret_cast<char*>(reinterpret_cast<std::uintptr_t*>(
It + *reinterpret_cast<std::uint32_t*>(It + 0x3) + 0x7));
if (::IsBadReadPtr(reinterpret_cast<void*>(Name), 4) || !IsAscii(Name)) {
continue;
}
CVars.insert(std::pair < std::string, std::uintptr_t >(Name, Offset));
}
}
return CVars;
}
C++:
auto CVars = ParseCVars();
CVars.find("cl_fov")->second;
- Ставим хук на IConsole::Register(virtual index 7), парсим 1 и 2 аргументы.
Последнее редактирование: