Вопрос Spoof sv_cheats

Начинающий
Статус
Оффлайн
Регистрация
17 Май 2019
Сообщения
72
Реакции[?]
5
Поинты[?]
0
Работает ли сейчас dota_use_particle_fow "0" ?
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
альтернативно можешь
C++:
typedef void(__fastcall* CMDUnrestricted)(uintptr_t, uintptr_t, const char*, uintptr_t);
template <typename T> static T* CreateInterface(const char* szModule, const char* szInterface) {

    typedef void* (*oCreateInterface)(const char*, int);

    oCreateInterface pCreateInterface = (oCreateInterface)GetProcAddress(GetModuleHandleA(szModule), "CreateInterface");

    return (T*)pCreateInterface(szInterface, 0);
}

int main(){
CMDUnrestricted UnrestrictedCommand;
void* CEngineClient = CreateInterface<void*>("engine2.dll", "Source2EngineToClient001");
UnrestrictedCommand = (CMDUnrestricted)
        * reinterpret_cast<uintptr_t*>(
            *reinterpret_cast<uintptr_t*>(CEngineClient)
            + 8 * 35 //(35 по счету в виртуальной таблице и размер указателя на х64 это 8 байт)
            );

UnrestrictedCommand(0,0,"dota_camera_distance 1500",0);
UnrestrictedCommand(0,0,"dota_use_particle_fow 0",0);
UnrestrictedCommand(0,0,"r_farz 20000",0);
}
 
Начинающий
Статус
Оффлайн
Регистрация
17 Май 2019
Сообщения
72
Реакции[?]
5
Поинты[?]
0
альтернативно можешь
C++:
typedef void(__fastcall* CMDUnrestricted)(uintptr_t, uintptr_t, const char*, uintptr_t);
template <typename T> static T* CreateInterface(const char* szModule, const char* szInterface) {

    typedef void* (*oCreateInterface)(const char*, int);

    oCreateInterface pCreateInterface = (oCreateInterface)GetProcAddress(GetModuleHandleA(szModule), "CreateInterface");

    return (T*)pCreateInterface(szInterface, 0);
}

int main(){
CMDUnrestricted UnrestrictedCommand;
void* CEngineClient = CreateInterface<void*>("engine2.dll", "Source2EngineToClient001");
UnrestrictedCommand = (CMDUnrestricted)
        * reinterpret_cast<uintptr_t*>(
            *reinterpret_cast<uintptr_t*>(CEngineClient)
            + 8 * 35 //(35 по счету в виртуальной таблице и размер указателя на х64 это 8 байт)
            );

UnrestrictedCommand(0,0,"dota_camera_distance 1500",0);
UnrestrictedCommand(0,0,"dota_use_particle_fow 0",0);
UnrestrictedCommand(0,0,"r_farz 20000",0);
}
Я так понимаю это способ с инжектом dll?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Я так понимаю это способ с инжектом dll?
да, инжектишь длл в которой примерно такой код.
ClientCmd_Unrestricted просто выполняет любую комманду независимо от того, включен sv_cheats или нет
 
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
520
Реакции[?]
95
Поинты[?]
2K
а оффсеты потом как искать?
индексы виртуальных функций очень редко меняются, а если меняются то не сильно смещаются.
Если понимаешь можешь и сам потом найти, а если нет то вручную потыкать +-5 единиц индекса
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
альтернативно можешь
C++:
typedef void(__fastcall* CMDUnrestricted)(uintptr_t, uintptr_t, const char*, uintptr_t);
template <typename T> static T* CreateInterface(const char* szModule, const char* szInterface) {

    typedef void* (*oCreateInterface)(const char*, int);

    oCreateInterface pCreateInterface = (oCreateInterface)GetProcAddress(GetModuleHandleA(szModule), "CreateInterface");

    return (T*)pCreateInterface(szInterface, 0);
}

int main(){
CMDUnrestricted UnrestrictedCommand;
void* CEngineClient = CreateInterface<void*>("engine2.dll", "Source2EngineToClient001");
UnrestrictedCommand = (CMDUnrestricted)
        * reinterpret_cast<uintptr_t*>(
            *reinterpret_cast<uintptr_t*>(CEngineClient)
            + 8 * 35 //(35 по счету в виртуальной таблице и размер указателя на х64 это 8 байт)
            );

UnrestrictedCommand(0,0,"dota_camera_distance 1500",0);
UnrestrictedCommand(0,0,"dota_use_particle_fow 0",0);
UnrestrictedCommand(0,0,"r_farz 20000",0);
}
залупа не работает сорри (. юзайте способ от кратчесов, который просто снимает защиту с конваров
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
либо с дллки просто изменяйте байты в engine2.dll и client.dll на рантайме и юзайте UnrestrictedCommand
client.dll:
83 ec 38 48 85 d2 74 1c 4d 85 c0 74 17 4d 8b c8 48 8d 0d -> 8b 0d e1 dc dd 01 49 8b d0 48 8b 01 48 ff a0 30 01 00 00
engine2.dll:
00 e9 59 01 00 00 ba 00 40 00 00 ff 50 18 84 c0 74 76 e8 -> 00 e9 59 01 00 00 ba 00 40 00 00 ff 50 18 84 c0 eb 76 e8
48 8b 07 ba 00 20 00 00 48 8b cf ff 50 18 84 c0 74 54 48 -> 48 8b 07 ba 00 20 00 00 48 8b cf ff 50 18 84 c0 eb 54 48

C++:
...
#define IR(x, a, b) (x >= a && x <= b)
#define gBi(x) (IR((x & (~0x20)), 'A', 'F') ? ((x & (~0x20)) - 'A' + 0xA): (IR(x, '0', '9') ? x - '0': 0))
#define gBy(x) (gBi(x[0]) << 4 | gBi(x[1]))

static uintptr_t FPat(const uintptr_t& start_address, const uintptr_t& end_address, const char* target_pattern) {
    const char* pattern = target_pattern;

    uintptr_t first_match = 0;

    for (uintptr_t position = start_address; position < end_address; position++) {
        if (!*pattern)
            return first_match;

        const uint8_t pattern_current = *reinterpret_cast<const uint8_t*>(pattern);
        const uint8_t memory_current = *reinterpret_cast<const uint8_t*>(position);

        if (pattern_current == '\?' || memory_current == gBy(pattern)) {
            if (!first_match)
                first_match = position;

            if (!pattern[2])
                return first_match;

            pattern += pattern_current != '\?' ? 3 : 2;
        }
        else {
            pattern = target_pattern;
            first_match = 0;
        }
    }

    return NULL;
}

static uintptr_t FPat(const char* module, const char* target_pattern) {
    MODULEINFO module_info = { 0 };

    if (!GetModuleInformation(GetCurrentProcess(), GetModuleHandleA(module), &module_info, sizeof(MODULEINFO)))
        return NULL;

    const uintptr_t start_address = uintptr_t(module_info.lpBaseOfDll);
    const uintptr_t end_address = start_address + module_info.SizeOfImage;

    return FPat(start_address, end_address, target_pattern);
}
...
char clientrep[] = { 0x8b, 0x0d, 0xe1, 0xdc, 0xdd, 0x01, 0x49, 0x8b, 0xd0, 0x48, 0x8b, 0x01, 0x48, 0xff, 0xa0, 0x30, 0x01, 0x00, 0x00 };
char enginerep2[] = { 0x48, 0x8b, 0x07, 0xba, 0x00, 0x20, 0x00, 0x00, 0x48, 0x8b, 0xcf, 0xff, 0x50, 0x18, 0x84, 0xc0, 0xeb, 0x54, 0x48 };
char enginerep[] = { 0x00, 0xe9, 0x59, 0x01, 0x00, 0x00, 0xba, 0x00, 0x40, 0x00, 0x00, 0xff, 0x50, 0x18, 0x84, 0xc0, 0xeb, 0x76, 0xe8 };
uintptr_t clientpattern;
uintptr_t enginepattern;
uintptr_t enginepattern2;
MEMORY_BASIC_INFORMATION mbi;
int main(){
...
if ((clientpattern = FPat("client.dll", "83 ec 38 48 85 d2 74 1c 4d 85 c0 74 17 4d 8b c8 48 8d 0d")) != NULL)
{
        VirtualQuery((LPCVOID)clientpattern, &mbi, sizeof(mbi));
        VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect);
    ::memcpy((void*)clientpattern, &clientrep, sizeof(clientrep));
        VirtualProtect(mbi.BaseAddress, mbi.RegionSize, mbi.Protect, &mbi.Protect);
};

if ((enginepattern = FPat("engine2.dll", "00 e9 59 01 00 00 ba 00 40 00 00 ff 50 18 84 c0 74 76 e8")) != NULL)
{
        VirtualQuery((LPCVOID)enginepattern, &mbi, sizeof(mbi));
        VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect);
    ::memcpy((void*)enginepattern, &enginerep, sizeof(enginerep));
        VirtualProtect(mbi.BaseAddress, mbi.RegionSize, mbi.Protect, &mbi.Protect);
};
if ((enginepattern2 = FPat("engine2.dll", "48 8b 07 ba 00 20 00 00 48 8b cf ff 50 18 84 c0 74 54 48")) != NULL)
{
        VirtualQuery((LPCVOID)enginepattern2, &mbi, sizeof(mbi));
        VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect);
    ::memcpy((void*)enginepattern2, &enginerep2, sizeof(enginerep2));
        VirtualProtect(mbi.BaseAddress, mbi.RegionSize, mbi.Protect, &mbi.Protect);
};
...
void* CEngineClient = CreateInterface<void*>("engine2.dll", "Source2EngineToClient001");
    UnrestrictedCommand = (CMDUnrestricted)
        * reinterpret_cast<uintptr_t*>(
            *reinterpret_cast<uintptr_t*>(CEngineClient)
            + 8 * 35
            );
...
typedef uintptr_t(__fastcall* IsInGame)();
IsInGame InGame;
...
    InGame = (IsInGame)
        *reinterpret_cast<uintptr_t*>(
            *reinterpret_cast<uintptr_t*>(CEngineClient)
            + 8 * 26
            );
...
bool Unrestricted = false;
bool inGame = false;
...
//где-нибудь в ендсцене например проверка каждые 60 кадров(условно)
if(++framecounter == 60){
if (InGame() & 0xFF)
        inGame = true;
else {
        inGame = false;
        Unrestricted = false;
    }
framecounter = 0;
}
if(inGame && !Unrestricted)
{
UnrestrictedCommand(0, 0, "dota_camera_distance 1500", 0);
UnrestrictedCommand(0, 0, "dota_use_particle_fow 0", 0);
UnrestrictedCommand(0, 0, "r_farz 20000", 0);
Unrestricted = true;
}
...
}
ну как-то так...
 
Последнее редактирование:
Сверху Снизу