Вопрос ConVar external | как включить r_drawothermodels 2

Пользователь
Пользователь
Статус
Оффлайн
Регистрация
30 Апр 2019
Сообщения
143
Реакции
35
Всем привет! Я пишу external читы, возникла потребность заставить работать консольные команды защищенные sv_cheats 1 по типу r_drawothermodels 2.
Проблема в том, что я не умею этого делать. Я знаю что есть OneByte читы которые запускают эту команду, но мне хотелось бы научится запускать и другие команды. Есть ли у кого-то учебник по этому поводу или может кто-то умеет это делать чтобы объяснить хотя бы на r_drawothermodels 2?
 
C++:
Expand Collapse Copy
#define NT_SUCCESS(x) ((x) >= 0)
typedef NTSTATUS(NTAPI* _NtWriteVirtualMemory)(HANDLE ProcessHandle, PVOID BaseAddress, LPCVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten);
_NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)GetProcAddress(GetModuleHandleA(XOR("ntdll.dll")), XOR("NtWriteVirtualMemory"));
typedef NTSTATUS(NTAPI* _NtReadVirtualMemory)(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToRead, PULONG NumberOfBytesRead);
_NtReadVirtualMemory NtReadVirtualMemory = (_NtReadVirtualMemory)GetProcAddress(GetModuleHandleA(XOR("ntdll.dll")), XOR("NtReadVirtualMemory"));

C++:
Expand Collapse Copy
int Utils::GetStringHash(const char* name)
{
    int codes[256];
    DWORD convar_name_hash_table = mem->read<DWORD>(mem->FindSignature(G.vstdlib_dll, G.vstdlib_dll_size, XOR("\x8B\x3C\x85"), XOR("xxx")) + 3) - G.vstdlib_dll;
    mem->rvm(G.vstdlib_dll + 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_dll, G.vstdlib_dll_size, XOR("\x8B\x0D\x00\x00\x00\x00\xC7\x05"), XOR("xx????xx")) + 0x2) - G.vstdlib_dll;
    DWORD CvarEngine = mem->read<DWORD>(G.vstdlib_dll + 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);
    }
}


C++:
Expand Collapse Copy
std::string Utils::getValue(const char* name)
{
    char dummy[255]; 
    mem->rvm(mem->read<DWORD>(GetConVarAddress(name) + 0x24), &dummy); 
    return std::string(dummy); 
}

C++:
Expand Collapse Copy
void Utils::SetValue(const char* name, int val)
{
    DWORD addr = GetConVarAddress(name); 
    mem->write<int>(addr + 0x30, val ^ addr); 
}

C++:
Expand Collapse Copy
void Utils::SetValue(const char* name, float val)
{
    DWORD addr = GetConVarAddress(name);
    mem->write<int>(addr + 0x2C, *(int*)&val ^ addr);
}

Использование:

Код:
Expand Collapse Copy
SetValue(XOR("cl_grenadepreview"), 1);
 
C++:
Expand Collapse Copy
#define NT_SUCCESS(x) ((x) >= 0)
typedef NTSTATUS(NTAPI* _NtWriteVirtualMemory)(HANDLE ProcessHandle, PVOID BaseAddress, LPCVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten);
_NtWriteVirtualMemory NtWriteVirtualMemory = (_NtWriteVirtualMemory)GetProcAddress(GetModuleHandleA(XOR("ntdll.dll")), XOR("NtWriteVirtualMemory"));
typedef NTSTATUS(NTAPI* _NtReadVirtualMemory)(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToRead, PULONG NumberOfBytesRead);
_NtReadVirtualMemory NtReadVirtualMemory = (_NtReadVirtualMemory)GetProcAddress(GetModuleHandleA(XOR("ntdll.dll")), XOR("NtReadVirtualMemory"));

C++:
Expand Collapse Copy
int Utils::GetStringHash(const char* name)
{
    int codes[256];
    DWORD convar_name_hash_table = mem->read<DWORD>(mem->FindSignature(G.vstdlib_dll, G.vstdlib_dll_size, XOR("\x8B\x3C\x85"), XOR("xxx")) + 3) - G.vstdlib_dll;
    mem->rvm(G.vstdlib_dll + 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_dll, G.vstdlib_dll_size, XOR("\x8B\x0D\x00\x00\x00\x00\xC7\x05"), XOR("xx????xx")) + 0x2) - G.vstdlib_dll;
    DWORD CvarEngine = mem->read<DWORD>(G.vstdlib_dll + 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);
    }
}


C++:
Expand Collapse Copy
std::string Utils::getValue(const char* name)
{
    char dummy[255];
    mem->rvm(mem->read<DWORD>(GetConVarAddress(name) + 0x24), &dummy);
    return std::string(dummy);
}

C++:
Expand Collapse Copy
void Utils::SetValue(const char* name, int val)
{
    DWORD addr = GetConVarAddress(name);
    mem->write<int>(addr + 0x30, val ^ addr);
}

C++:
Expand Collapse Copy
void Utils::SetValue(const char* name, float val)
{
    DWORD addr = GetConVarAddress(name);
    mem->write<int>(addr + 0x2C, *(int*)&val ^ addr);
}

Использование:

Код:
Expand Collapse Copy
SetValue(XOR("cl_grenadepreview"), 1);
Бляха, спасибо тебе друг, писал на UC кормили советами, но толком дать ответ на вопрос не смогли, а тут смотри как. Поставил бы лайк, но пропала кнопка сорян... Еще раз спасибо большое, дай Бог тебе всего хорошего)
 
детектед ес че
 
Я совсем не так пишу эти консольные команды. А так, я уже нашел способ, как с sv_cheats 1 писать экстренал читы :laughing:. Т.е. легально получается.
 
Последнее редактирование:
tu ouvres la console?


SetValue (XOR ("cl_grenadepreview"), 1);
 
tu ouvres la console?


SetValue (XOR ("cl_grenadepreview"), 1);
Il existe des ConVars qui ne sont pas disponibles même avec sv_cheats 1, et la commande cl_grenadepreview est disponible pour modification, tout le monde peut modifier la valeur sur son serveur. Je ne l'ai pas encore testé, mais il me semble que les fonctions que la personne ci-dessus a données peuvent accéder aux commandes de console déverrouillées qui nécessitent sv_cheats 1
 
Назад
Сверху Снизу