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

Начинающий
Статус
Оффлайн
Регистрация
20 Дек 2021
Сообщения
2
Реакции[?]
0
Поинты[?]
0
CSS:
#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;
}
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
while (!GetAsyncKeyState(VK_END))
Скажи спасибо что эта хуевина еще не падает.
Ты правишь данные игры из другого потока, никак не синхронизируясь с ней, в момент когда ты их пишешь они уже могут с концами исчезнуть и будет доступ к невалидной памяти.
Лучше нормально составь структуры, чтобы код был читаемым, а не этот ужас, и нормально хукай игру.
Для хука хорошо подойдет ClientModeCSNormal::DoPostScreenSpaceEffects, игра сама добавляет все нужные объекты в менеджер глоу, нужно лишь изменить их параметры, но игра часто сбрасывает их, поэтому переписывать нужно каждый кадр после игры.
 
Pa$$ter
Пользователь
Статус
Оффлайн
Регистрация
9 Июн 2020
Сообщения
241
Реакции[?]
83
Поинты[?]
12K
Скажи спасибо что эта хуевина еще не падает.
Ты правишь данные игры из другого потока, никак не синхронизируясь с ней, в момент когда ты их пишешь они уже могут с концами исчезнуть и будет доступ к невалидной памяти.
Лучше нормально составь структуры, чтобы код был читаемым, а не этот ужас, и нормально хукай игру.
Для хука хорошо подойдет ClientModeCSNormal::DoPostScreenSpaceEffects, игра сама добавляет все нужные объекты в менеджер глоу, нужно лишь изменить их параметры, но игра часто сбрасывает их, поэтому переписывать нужно каждый кадр после игры.
В данном случае не крашит потому-что и в экстернал читах это делается так-же, для игроков глоу обьект всегда есть, и это вполне можно заставить работать но т.к. синхронизации с игрой нет будет моргать как в старых экстернал читах. Но лучше конечно это делать в хуке, т.к. тогда оно и процессора будет есть меньше и работать правильно.

А не работает скорее всего потому-что ты закрываешь хэндл потока.
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
В данном случае не крашит потому-что и в экстернал читах это делается так-же
В экстернал читах если ты прочитаешь невалидную память ничего не случится т.к. RPM/WPM в ядре обернуты в try/catch и исключения глушатся.
В интернал как у тс, если он тронет невалидную память то свалится с ошибкой доступа.
Если уж делаешь интернал, то можешь позволить сделать все правильно, нет смысла комбинировать худшее из каждого подхода.
 
Pa$$ter
Пользователь
Статус
Оффлайн
Регистрация
9 Июн 2020
Сообщения
241
Реакции[?]
83
Поинты[?]
12K
В экстернал читах если ты прочитаешь невалидную память ничего не случится т.к. RPM/WPM в ядре обернуты в try/catch.
В интернал как у тс, если он тронет невалидную память то свалится с ошибкой доступа.
Да, но как я и сказал этот обьект всегда есть, по крайней мере когда ты на мапе. И да, так делать это ОЧЕНЬ плохая практика, я лишь указал что это *может* работать.
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Да, но как я и сказал этот обьект всегда есть, по крайней мере когда ты на мапе.
Моделирую ситуацию.
1. Его код проверяет if (entity == NULL) continue;, объект есть
2. В этот момент в потоке игры чекаются пакеты, приходит слепок сущностей от сервера, игрок вышел, его объект удаляется, память оставленная им становится свободной или кем то переиспользуется.
3. Его код читает индекс int glowIndex = *(int*)(entity + m_iGlowIndex);, в этот момент память сущности невалидная, там сейчас может быть что угодно, даже если это прочитается то там может быть какой нибудь невероятно огромный int.
4. Его код юзает этот индекс как множитель, в результате получает абсолютно бессмысленные адреса и наконец падает с ошибкой доступа.
Сколько удалений объектов этот код переживет? 1? 10? Неизвестно, это рандом и анстаб, делать так нельзя, я уже объяснила почему.
 
Пользователь
Статус
Оффлайн
Регистрация
30 Апр 2019
Сообщения
143
Реакции[?]
33
Поинты[?]
4K
CSS:
#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.
Вот тема, в последнем сообщении рабочий код, только оффсеты обнови.
 
Последнее редактирование:
Сверху Снизу