• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос Почему не работает вх?

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
20 Дек 2021
Сообщения
2
Реакции
0
CSS:
Expand Collapse Copy
#include <Windows.h>


DWORD dwLocalPlayer = 0xDB458C;
DWORD dwGlowObjectManager = 0x5317E28;
DWORD dwEntityList = 0x4DCFA94;
DWORD m_iTeamNum = 0xF4;
DWORD m_iGlowIndex = 0x10488;

DWORD WINAPI MainThread(HMODULE hModule)
{
    DWORD moduleBase = (DWORD)GetModuleHandle("client.dll");

    while (!GetAsyncKeyState(VK_END))
    {
        DWORD LocalPlayer = *(DWORD*)(moduleBase + dwLocalPlayer);
        DWORD GlowObjectManager = *(DWORD*)(moduleBase + dwGlowObjectManager);
        DWORD EntityList = *(DWORD*)(moduleBase + dwEntityList);

        int localTeam = *(int*)(LocalPlayer + m_iTeamNum);

        for (int i = 1; i < 32; i++)
        {
            DWORD entity = *(DWORD*)(moduleBase + dwEntityList) + i * 0x10;

            if (entity == NULL) continue;


            int glowIndex = *(int*)(entity + m_iGlowIndex);
            int entityTeam = *(int*)(entity + m_iTeamNum);

            if (entityTeam == localTeam)
            {
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x8)) = 0.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0xC)) = 1.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x10)) = 0.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x14)) = 1.7f;
            }
            else
            {
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x8)) = 1.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0xC)) = 0.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x10)) = 0.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x14)) = 1.7f;
            }
            *(bool*)((GlowObjectManager + glowIndex * 0x38 + 0x28)) = true;
            *(bool*)((GlowObjectManager + glowIndex * 0x38 + 0x29)) = false;
        }
    }
    FreeLibraryAndExitThread(hModule, 0);
    return 0;
}

BOOL APIENTRY DLLMail(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CloseHandle(CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)MainThread, hModule, 0, nullptr));
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
 
а что дебаг говорит ?
 
while (!GetAsyncKeyState(VK_END))
Скажи спасибо что эта хуевина еще не падает.
Ты правишь данные игры из другого потока, никак не синхронизируясь с ней, в момент когда ты их пишешь они уже могут с концами исчезнуть и будет доступ к невалидной памяти.
Лучше нормально составь структуры, чтобы код был читаемым, а не этот ужас, и нормально хукай игру.
Для хука хорошо подойдет ClientModeCSNormal::DoPostScreenSpaceEffects, игра сама добавляет все нужные объекты в менеджер глоу, нужно лишь изменить их параметры, но игра часто сбрасывает их, поэтому переписывать нужно каждый кадр после игры.
 
Скажи спасибо что эта хуевина еще не падает.
Ты правишь данные игры из другого потока, никак не синхронизируясь с ней, в момент когда ты их пишешь они уже могут с концами исчезнуть и будет доступ к невалидной памяти.
Лучше нормально составь структуры, чтобы код был читаемым, а не этот ужас, и нормально хукай игру.
Для хука хорошо подойдет ClientModeCSNormal::DoPostScreenSpaceEffects, игра сама добавляет все нужные объекты в менеджер глоу, нужно лишь изменить их параметры, но игра часто сбрасывает их, поэтому переписывать нужно каждый кадр после игры.
В данном случае не крашит потому-что и в экстернал читах это делается так-же, для игроков глоу обьект всегда есть, и это вполне можно заставить работать но т.к. синхронизации с игрой нет будет моргать как в старых экстернал читах. Но лучше конечно это делать в хуке, т.к. тогда оно и процессора будет есть меньше и работать правильно.

А не работает скорее всего потому-что ты закрываешь хэндл потока.
 
В данном случае не крашит потому-что и в экстернал читах это делается так-же
В экстернал читах если ты прочитаешь невалидную память ничего не случится т.к. RPM/WPM в ядре обернуты в try/catch и исключения глушатся.
В интернал как у тс, если он тронет невалидную память то свалится с ошибкой доступа.
Если уж делаешь интернал, то можешь позволить сделать все правильно, нет смысла комбинировать худшее из каждого подхода.
 
В экстернал читах если ты прочитаешь невалидную память ничего не случится т.к. RPM/WPM в ядре обернуты в try/catch.
В интернал как у тс, если он тронет невалидную память то свалится с ошибкой доступа.
Да, но как я и сказал этот обьект всегда есть, по крайней мере когда ты на мапе. И да, так делать это ОЧЕНЬ плохая практика, я лишь указал что это *может* работать.
 
Да, но как я и сказал этот обьект всегда есть, по крайней мере когда ты на мапе.
Моделирую ситуацию.
1. Его код проверяет if (entity == NULL) continue;, объект есть
2. В этот момент в потоке игры чекаются пакеты, приходит слепок сущностей от сервера, игрок вышел, его объект удаляется, память оставленная им становится свободной или кем то переиспользуется.
3. Его код читает индекс int glowIndex = *(int*)(entity + m_iGlowIndex);, в этот момент память сущности невалидная, там сейчас может быть что угодно, даже если это прочитается то там может быть какой нибудь невероятно огромный int.
4. Его код юзает этот индекс как множитель, в результате получает абсолютно бессмысленные адреса и наконец падает с ошибкой доступа.
Сколько удалений объектов этот код переживет? 1? 10? Неизвестно, это рандом и анстаб, делать так нельзя, я уже объяснила почему.
 
CSS:
Expand Collapse Copy
#include <Windows.h>


DWORD dwLocalPlayer = 0xDB458C;
DWORD dwGlowObjectManager = 0x5317E28;
DWORD dwEntityList = 0x4DCFA94;
DWORD m_iTeamNum = 0xF4;
DWORD m_iGlowIndex = 0x10488;

DWORD WINAPI MainThread(HMODULE hModule)
{
    DWORD moduleBase = (DWORD)GetModuleHandle("client.dll");

    while (!GetAsyncKeyState(VK_END))
    {
        DWORD LocalPlayer = *(DWORD*)(moduleBase + dwLocalPlayer);
        DWORD GlowObjectManager = *(DWORD*)(moduleBase + dwGlowObjectManager);
        DWORD EntityList = *(DWORD*)(moduleBase + dwEntityList);

        int localTeam = *(int*)(LocalPlayer + m_iTeamNum);

        for (int i = 1; i < 32; i++)
        {
            DWORD entity = *(DWORD*)(moduleBase + dwEntityList) + i * 0x10;

            if (entity == NULL) continue;


            int glowIndex = *(int*)(entity + m_iGlowIndex);
            int entityTeam = *(int*)(entity + m_iTeamNum);

            if (entityTeam == localTeam)
            {
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x8)) = 0.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0xC)) = 1.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x10)) = 0.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x14)) = 1.7f;
            }
            else
            {
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x8)) = 1.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0xC)) = 0.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x10)) = 0.f;
                *(float*)((GlowObjectManager + glowIndex * 0x38 + 0x14)) = 1.7f;
            }
            *(bool*)((GlowObjectManager + glowIndex * 0x38 + 0x28)) = true;
            *(bool*)((GlowObjectManager + glowIndex * 0x38 + 0x29)) = false;
        }
    }
    FreeLibraryAndExitThread(hModule, 0);
    return 0;
}

BOOL APIENTRY DLLMail(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CloseHandle(CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)MainThread, hModule, 0, nullptr));
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
Я так понимаю у тебя internal, но работает точно также как и external.
Вот тема, в последнем сообщении рабочий код, только оффсеты обнови.
 
Последнее редактирование:
Назад
Сверху Снизу