hd с деф. конфигом не дампит абсолютно все сигнатуры и нетвары, а конвары не дампит вообщеhazeddumper на гите поищи
//int
mem->write<int>(addr + 0x30, val ^ addr);
//float
mem->write<int>(addr + 0x2C, *(int*)&val ^ addr);
СПАСИБО <30x6293c038 - r_modelAmbientMin
0x62937158 - mat_force_tonemap_scale
C++://int mem->write<int>(addr + 0x30, val ^ addr); //float mem->write<int>(addr + 0x2C, *(int*)&val ^ addr);
СПАСИБО <3
Если не секрет, то куда записывать значения? В client.dll или engine.dll? И значения записывать во float?
Т.е. Write<float>(clientModule + *нужный оффсет*, 1.f); ? (в случае с экстерналом)
UPD.: я мудак, не сразу заметил функции. Но вопрос по тому, куда именно писать остаётся открытым)
UPD.2: я вдвойне мудак, поэтому лучше спрошу, где брать или как искать алреса конваров? и что это за значения 0x30 & 0x2C? Да, я настолько жалок)
int Utils::GetStringHash(const char* name)
{
int codes[256];
DWORD convar_name_hash_table = mem->read<DWORD>(mem->FindSignature(G.vstdlib, G.vstdlib_size, AY_OBFUSCATE("\x8B\x3C\x85"), AY_OBFUSCATE("xxx")) + 3) - G.vstdlib;
mem->rvm(G.vstdlib + convar_name_hash_table, &codes);
int v2 = 0;
int v3 = 0;
for (int i = 0; i < strlen(name); i += 2)
{
v3 = codes[v2 ^ toupper(name[i])];
if (i + 1 == strlen(name))
break;
v2 = codes[v3 ^ toupper(name[i + 1])];
}
return v2 | (v3 << 8);
}
DWORD Utils::GetConVarAddress(const char* name)
{
int hash = GetStringHash(name);
DWORD interface_engine_cvar = mem->read<DWORD>(mem->FindSignature(G.vstdlib, G.vstdlib_size, AY_OBFUSCATE("\x8B\x0D\x00\x00\x00\x00\xC7\x05"), AY_OBFUSCATE("xx????xx")) + 0x2) - G.vstdlib;
DWORD CvarEngine = mem->read<DWORD>(G.vstdlib + interface_engine_cvar);
DWORD Pointer = mem->read<DWORD>(mem->read<DWORD>(CvarEngine + 0x34) + ((BYTE)hash * 4));
while (Pointer)
{
if (mem->read<DWORD>(Pointer) == hash)
{
DWORD ConVarPointer = mem->read<DWORD>(Pointer + 0x4);
char* varname[32];
mem->rvm(mem->read<DWORD>(ConVarPointer + 0xC), &varname);
if (!strcmp((char*)varname, name))
{
return ConVarPointer;
}
}
Pointer = mem->read<DWORD>(Pointer + 0xC);
}
}
std::string Utils::getValue(const char* name)
{
char dummy[255];
mem->rvm(mem->read<DWORD>(GetConVarAddress(name) + 0x24), &dummy);
return std::string(dummy);
}
void Utils::SetValue(const char* name, float val)
{
DWORD addr = GetConVarAddress(name);
mem->write<int>(addr + 0x2C, *(int*)&val ^ addr);
}
void Utils::SetValue(const char* name, int val)
{
DWORD addr = GetConVarAddress(name);
mem->write<int>(addr + 0x30, val ^ addr);
}
Спасибо огромнейшее ещё раз!C++:int Utils::GetStringHash(const char* name) { int codes[256]; DWORD convar_name_hash_table = mem->read<DWORD>(mem->FindSignature(G.vstdlib, G.vstdlib_size, AY_OBFUSCATE("\x8B\x3C\x85"), AY_OBFUSCATE("xxx")) + 3) - G.vstdlib; mem->rvm(G.vstdlib + convar_name_hash_table, &codes); int v2 = 0; int v3 = 0; for (int i = 0; i < strlen(name); i += 2) { v3 = codes[v2 ^ toupper(name[i])]; if (i + 1 == strlen(name)) break; v2 = codes[v3 ^ toupper(name[i + 1])]; } return v2 | (v3 << 8); } DWORD Utils::GetConVarAddress(const char* name) { int hash = GetStringHash(name); DWORD interface_engine_cvar = mem->read<DWORD>(mem->FindSignature(G.vstdlib, G.vstdlib_size, AY_OBFUSCATE("\x8B\x0D\x00\x00\x00\x00\xC7\x05"), AY_OBFUSCATE("xx????xx")) + 0x2) - G.vstdlib; DWORD CvarEngine = mem->read<DWORD>(G.vstdlib + interface_engine_cvar); DWORD Pointer = mem->read<DWORD>(mem->read<DWORD>(CvarEngine + 0x34) + ((BYTE)hash * 4)); while (Pointer) { if (mem->read<DWORD>(Pointer) == hash) { DWORD ConVarPointer = mem->read<DWORD>(Pointer + 0x4); char* varname[32]; mem->rvm(mem->read<DWORD>(ConVarPointer + 0xC), &varname); if (!strcmp((char*)varname, name)) { return ConVarPointer; } } Pointer = mem->read<DWORD>(Pointer + 0xC); } } std::string Utils::getValue(const char* name) { char dummy[255]; mem->rvm(mem->read<DWORD>(GetConVarAddress(name) + 0x24), &dummy); return std::string(dummy); } void Utils::SetValue(const char* name, float val) { DWORD addr = GetConVarAddress(name); mem->write<int>(addr + 0x2C, *(int*)&val ^ addr); } void Utils::SetValue(const char* name, int val) { DWORD addr = GetConVarAddress(name); mem->write<int>(addr + 0x30, val ^ addr); }
Вызов функции: SetValue("нужный convar", значение);
Получить оффсет convara: GetConVarAddress("нужный convar");
Получить значение convara:GetValue("нужный convar");
Извини за пинг, но в ProcMem нет FindSignature, AY_OBFUSCATE, а также отсутствует переменная G или что это.C++:int Utils::GetStringHash(const char* name) { int codes[256]; DWORD convar_name_hash_table = mem->read<DWORD>(mem->FindSignature(G.vstdlib, G.vstdlib_size, AY_OBFUSCATE("\x8B\x3C\x85"), AY_OBFUSCATE("xxx")) + 3) - G.vstdlib; mem->rvm(G.vstdlib + convar_name_hash_table, &codes); int v2 = 0; int v3 = 0; for (int i = 0; i < strlen(name); i += 2) { v3 = codes[v2 ^ toupper(name[i])]; if (i + 1 == strlen(name)) break; v2 = codes[v3 ^ toupper(name[i + 1])]; } return v2 | (v3 << 8); } DWORD Utils::GetConVarAddress(const char* name) { int hash = GetStringHash(name); DWORD interface_engine_cvar = mem->read<DWORD>(mem->FindSignature(G.vstdlib, G.vstdlib_size, AY_OBFUSCATE("\x8B\x0D\x00\x00\x00\x00\xC7\x05"), AY_OBFUSCATE("xx????xx")) + 0x2) - G.vstdlib; DWORD CvarEngine = mem->read<DWORD>(G.vstdlib + interface_engine_cvar); DWORD Pointer = mem->read<DWORD>(mem->read<DWORD>(CvarEngine + 0x34) + ((BYTE)hash * 4)); while (Pointer) { if (mem->read<DWORD>(Pointer) == hash) { DWORD ConVarPointer = mem->read<DWORD>(Pointer + 0x4); char* varname[32]; mem->rvm(mem->read<DWORD>(ConVarPointer + 0xC), &varname); if (!strcmp((char*)varname, name)) { return ConVarPointer; } } Pointer = mem->read<DWORD>(Pointer + 0xC); } } std::string Utils::getValue(const char* name) { char dummy[255]; mem->rvm(mem->read<DWORD>(GetConVarAddress(name) + 0x24), &dummy); return std::string(dummy); } void Utils::SetValue(const char* name, float val) { DWORD addr = GetConVarAddress(name); mem->write<int>(addr + 0x2C, *(int*)&val ^ addr); } void Utils::SetValue(const char* name, int val) { DWORD addr = GetConVarAddress(name); mem->write<int>(addr + 0x30, val ^ addr); }
Вызов функции: SetValue("нужный convar", значение);
Получить оффсет convara: GetConVarAddress("нужный convar");
Получить значение convara:GetValue("нужный convar");
Извини за пинг, но в ProcMem нет FindSignature, AY_OBFUSCATE, а также отсутствует переменная G или что это.
DWORD FindSignature(DWORD start, DWORD size, const char* sig, const char* mask)
{
BYTE* data = new BYTE[size];
SIZE_T bytesRead;
ReadProcessMemory(G.hProcess, (LPVOID)start, data, size, &bytesRead);
for (DWORD i = 0; i < size; i++)
{
if (mem->MemoryCompare((const BYTE*)(data + i), (const BYTE*)sig, mask)) {
delete[] data;
return start + i;
}
}
delete[] data;
return NULL;
}
bool MemoryCompare(const BYTE* bData, const BYTE* bMask, const char* szMask)
{
for (; *szMask; ++szMask, ++bData, ++bMask)
{
if (*szMask == 'x' && *bData != *bMask)
{
return false;
}
}
return (*szMask == NULL);
}
Спасибо ещё раз огромное. Днём попробую)C++:DWORD FindSignature(DWORD start, DWORD size, const char* sig, const char* mask) { BYTE* data = new BYTE[size]; SIZE_T bytesRead; ReadProcessMemory(G.hProcess, (LPVOID)start, data, size, &bytesRead); for (DWORD i = 0; i < size; i++) { if (mem->MemoryCompare((const BYTE*)(data + i), (const BYTE*)sig, mask)) { delete[] data; return start + i; } } delete[] data; return NULL; } bool MemoryCompare(const BYTE* bData, const BYTE* bMask, const char* szMask) { for (; *szMask; ++szMask, ++bData, ++bMask) { if (*szMask == 'x' && *bData != *bMask) { return false; } } return (*szMask == NULL); }
G - это мои глобальные переменные.
AY_OBFUSCATE - функция для защиты чита от детекта. Убери просто эту функцию.
G.vstdlib - это модуль, такой же как и client.dll или engine.dll, тебе нужно его получить в своей memory фукнции.
если что-то не получится, напиши в дс Saivior#9999
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz