Исходник Dota-cheat | База под доту 2

Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
Всем здарова, давно я ничего нормального не постил, надо бы исправлять.
Заинтересовал меня недавно такой фрукт, как Dota 2, начал я ее ковырять и доковырялся до того, что решил релизнуть вам под нее базу, тем более, что адекватных баз в целом на просторах интернета найдено не было.

Функционал на данный момент минимальный:
1. Подсветка иллюзий
2. VBE

В чем плюсы этой базы:
1. Я постарался писать код так, чтобы он был адекватно читаем.
2. Имеет в себе реверс SchemaSystem, которая пришла на замену нетварам.
3. Все написано с использованием C++20
4. Да и в целом это первая паблик база с +- адекватным кодом
5. Минимум говнокода

Сама база использует в качестве зависимостей такие прекрасные проекты, как:
1. ImGui
2. FreeType
3. MinHook

Для компиляции нужна Visual Studio 2022 со следующими компонентами:
C++ Clang-cl для средств сборки 143
Компилятор C++ Clang для Windows

Сама база:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Буду рад если нажмете кнопку Star на гитхабе <3
 
Последнее редактирование:
Приколист югейма
Начинающий
Статус
Оффлайн
Регистрация
12 Ноя 2020
Сообщения
131
Реакции[?]
26
Поинты[?]
9K
Всем здарова, давно я ничего нормального не постил, надо бы исправлять.
Заинтересовал меня недавно такой фрукт, как Dota 2, начал я ее ковырять и доковырялся до того, что решил релизнуть вам под нее базу, тем более, что адекватных баз в целом на просторах интернета найдено не было.

Функционал на данный момент минимальный - только подсвечивает иллюзии, но в будущем будет больше всякого разного, забивать на разработку этой базы(которая возможно перерастет в полноценный опен-сурс чит под доку2) я не буду.

В чем плюсы этой базы:
1. Я постарался писать код так, чтобы он был адекватно читаем.
2. Имеет в себе реверс SchemaSystem, которая пришла на замену нетварам.
3. Все написано с использованием C++20
4. Да и в целом это первая паблик база с +- адекватным кодом
5. Минимум говнокода

Сама база использует в качестве зависимостей такие прекрасные проекты, как:
1. ImGui
2. FreeType
3. MinHook

Для компиляции нужна Visual Studio 2022 со следующими компонентами:
C++ Clang-cl для средств сборки 143
Компилятор C++ Clang для Windows

Сама база:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Буду рад если нажмете кнопку Star на гитхабе <3
Так вот что ты подразумевал что запостишь что то годное.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
если используешь исключения - не забывай ресурсы оборачивать в RAII.
вот смотри ты консольку создаешь(представь что ты ее успешно создал появилось окошко)
C++:
if ( !AllocConsole( ) )
            throw std::runtime_error( "Failed to allocate console." );

        AttachConsole( ATTACH_PARENT_PROCESS );
потом кидаешь исключение если фреопен зафейлил(представь он зафейлил)
C++:
        if ( ( pStream = freopen( "CONOUT$", "w", stdout ) ); !pStream )
            throw std::runtime_error( "Failed to reopen stdout stream." );
у тебя вызывается твой детач. ты в нем чекаешь:
C++:
if ( pStream )
        {
            fclose( pStream );

            FreeConsole( );

            if ( const HWND hConsole = GetConsoleWindow( ) )
                PostMessage( hConsole, WM_CLOSE, 0, 0 );
        }
но ведь если фреопен зафейлил то у тебя pStream будет nullptr - чек зафейлит, и консоль никогда не будет освобождена - получается ты ликаешь ресурс(созданную консоль). юзер остается с бесполезной открытой навсегда консолькой как долбоёб при деините чита. к тому же еще и повторно не сможет инжектнуть так как AllocConsole фейлит если консолька уже существует :))
и возможно это не единственное место в твоем коде где есть такая проблема. фиксится тем что консолька в RAII оборачивается чтобы при вылете исключения она деструктировалась и освобождалась.
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
C++:
if ( pStream )
        {
            fclose( pStream );

            FreeConsole( );

            if ( const HWND hConsole = GetConsoleWindow( ) )
                PostMessage( hConsole, WM_CLOSE, 0, 0 );
        }
Немного закосячил, тут не должно было быть фигурных скобок, щас залью коммит
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Немного закосячил, тут не должно было быть фигурных скобок, щас залью коммит
решение не такое простое))
уберешь фигурные скобки - будешь FreeConsole вызывать даже если AllocConsole зафейлил. тебе дополнительный чек еще как минимум понадобится
if(ConsoleAllocatedSuccessfully) FreeConsole();
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
решение не такое простое))
уберешь фигурные скобки - будешь FreeConsole вызывать даже если AllocConsole зафейлил. тебе дополнительный чек еще как минимум понадобится
if(ConsoleAllocatedSuccessfully) FreeConsole();
Вызов FreeConsole при зафейленном AllocConsole никак не влияет на работу программы, так что там ничего страшного
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Вызов FreeConsole при зафейленном AllocConsole никак не влияет на работу программы, так что там ничего страшного
ну не знаю. делать что-то плохое просто потому что это не влияет на работу программы сомнительная идея. щас одно ты так сделал, завтра другое, а послезавтра у тебя комп взорвётся. лучше выработать привычку и НОРМАЛЬНО это дерьмо(и всё что с ним рядом лежит) пофиксить через RAII. созданная консоль(как и стрим с фреопена) - это не просто какаято рандомная хуита. это объект, ресурс. у него есть жизнь, смерть. это же один из ключевых концептов С++ и ООП
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
ну не знаю. делать что-то плохое просто потому что это не влияет на работу программы сомнительная идея. щас одно ты так сделал, завтра другое, а послезавтра у тебя комп взорвётся. лучше выработать привычку и НОРМАЛЬНО это дерьмо(и всё что с ним рядом лежит) пофиксить через RAII. созданная консоль(как и стрим с фреопена) - это не просто какаято рандомная хуита. это объект, ресурс. у него есть жизнь, смерть. это же один из ключевых концептов С++ и ООП
Пожалуйста, авторизуйтесь для просмотра ссылки.
If the calling process is not already attached to a console, the FreeConsole request still succeeds.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Пожалуйста, авторизуйтесь для просмотра ссылки.
я вкурсе я прочитал документацию уже. я тебе еще раз повторяю что единственная причина по которой у тебя изначально был этот баг это потому что ты себе позволяешь RAII-несовместимый код писать и при этом юзаешь исключения. от багов нельзя застраховаться, мы все ошибаемся, единственный способ уменьшить баги это уменьшить количество мест где их можно допустить. если бы у тебя изначально консоль была ресурсом, у тебя бы не было сырых вызовов AllocConsole и FreeConsole(они были бы в конструкторе и деструкторе где было бы сложнее ошибиться ибо там бы не было всякой побочной хуиты типа фреопенов фстримов и тд которые бы тебя отвлекали. это чисто логика для консоли и больше ничего там нету лишнего, ты можешь сфокусировать свое внимание именно на этом конкретном месте не задумываясь о других вещах) и бага бы просто не было. но нет ты говоришь что тебе похуй и ты продолжишь так делать. к чему тебя это приведет? к очередному похожему багу. потому что ты не предпринял никаких мер для устранения причины бага. ты точно так же когда-нибудь ошибешься скобочки не там поставишь и все пизда тебе. чтобы такого не было - убери нужду для этих действий которые ты делаешь руками в пачке. тогда тебе и не придется париться со скобочками. когда у тебя есть одна конкретная вещь в ней сложнее ошибиться чем когда у тебя куча всякого говна(тебе нужно файл закрыть, консоль убрать и тд и тп все это ты делаешь рядом). разве не по этой причине ты сделал Attach Detach блаблабла и вызываешь это в инитне/деините? ты же мог бы сразу в OnDllDetach 100 строк нахуярить всякого говна. почему ты этого не сделал? потому что это хуевая идея. потому что сложнее ошибиться когда ты вещи разделяешь, сортируешь. так почему бы не пойти дальше и еще больше разделить задачи на этапы и выделить ресурсы(консоль, стрим с фреопена и тд) должным образом?
кстати зачем ты WM_CLOSE консоли посылаешь? у меня тоже логгер на AllocConsole+FreeConsole+freopen+fclose все спокойно без WM_CLOSE закрывается(только что протестил).
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
девайс кстати в дх11 можно из свапчейны(а свапчейну из презента) получать, тогда сига не нужна будет(= чит дольше жить будет). правда это несовместимо с твоим текущим дизайном - нужен общий инит в ините, а дх11 порция инита в хуке презента(обычно люди в читах так и делают).
C++:
ID3D11Device* device{ nullptr };
if (SUCCEEDED(swapchain->GetDevice(__uuidof(device), reinterpret_cast<void**>(&device))) && device) ...
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
потому что ты себе позволяешь RAII-несовместимый код писать и при этом юзаешь исключения.
Не вижу смысла писать RAII-обертку ради вызова трех функций, которые так и так вызываются в одном месте, от создания класса ничего не изменится
девайс кстати в дх11 можно из свапчейны(а свапчейну из презента) получать, тогда сига не нужна будет(= чит дольше жить будет). правда это несовместимо с твоим текущим дизайном - нужен общий инит в ините, а дх11 порция инита в хуке презента(обычно люди в читах так и делают).
C++:
ID3D11Device* device{ nullptr };
if (SUCCEEDED(swapchain->GetDevice(__uuidof(device), reinterpret_cast<void**>(&device))) && device) ...
Зависит только от предпочтений кодера, а я предпочитаю заранее инициализировать все, с чем может вестись работа внутри хуков
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Не вижу смысла писать RAII-обертку ради вызова трех функций, которые так и так вызываются в одном месте, от создания класса ничего не изменится

Зависит только от предпочтений кодера, а я предпочитаю заранее инициализировать все, с чем может вестись работа внутри хуков
если ты не заметил, то ты в этих трех вызовах допустил баг. правильная раии-обертка скорее всего бы предотвратила его. ты точно не видишь смысла?
да и я смотрю ты ваще нигде в проекте не используешь RAII. это классная фича, попробуй. всегда надо с чего-то начинать. почему бы не сейчас? особенно с учетом того что ты используешь исключения которые ахуеть как хорошо сочетаются с RAII.
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,792
Реакции[?]
1,073
Поинты[?]
29K
правильная раии-обертка скорее всего бы предотвратила его. ты точно не видишь смысла?
В этой раии обертке так же можно случайно воткнуть лишние фигурные скобки, это человеческий фактор от которого не застрахован никто. Все еще не вижу смысла в обертке там
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
В этой раии обертке так же можно случайно воткнуть лишние фигурные скобки, это человеческий фактор от которого не застрахован никто. Все еще не вижу смысла в обертке там
так я тебе и говорю что мы все рано или поздно ошибаемся. единственный способ избежать ошибок - сделать так, чтобы было меньше мест где их можно допустить.
в том то и суть что там МЕНЬШЕ ВЕРОЯТНОСТЬ лишние фигурные скобки воткнуть, у тебя в обертке на консоль будет ТОЛЬКО КОНСОЛЬ. там не будет фреопена фклоза которые тебя отвлекли и изза которых ты въебал лишние скобки.
смотри где у тебя скобки лишние были:
C++:
if ( pStream )
        {
            fclose( pStream );
рядом с pStream и fclose. так хули КОНСОЛЬ должна страдать от этого? просто потому что она была рядом? так раздели фрееконсоле и фклозе и профит. пусть консоль отдельно закрывается от файла.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
ну и у тебя проблема с деинитом чита и синхронизацией.
представим:
нажали VK_END.
у тебя там код:
...
std::thread( fnCallback ).detach( ); //fnCallback = OnDllDetach
в OnDllDetach:
Hooks::Detach( ); //хуй знает когда будет вызван этот код - все асинхронно ибо у тебя нью тред с детачем.
в Hooks::Detach():
MH_Uninitialize( );
hookHandler.reset( );
то есть где-то в какой-то момент в каком-то треде хуй знает когда будет hookHandler.reset();
а теперь представим что был вызван хук презента(до MH_Uninitialize), в котором
return Hooks::Get( ).m_pfnPresent( pSwapchain, unSyncInterval, unFlags );
а теперь представим что в момент когда выполнение в презенте дошло до Hooks::Get() параллельно вызывается hookHandler.reset(). MH_Uninitialize() ничего не изменит т.к. хук презента уже вызван и даже если его снять это нихуя не даст.
тогда мы получаем в ебало std::bad_optional_access(изза hookHandler.reset()) ну и скорее всего крашим.
такое редко бывает но бывает. у меня крашило с несинхронизированным деинитом изза хуков ендсцены презента и прочей хуиты(потому что хук вызывается, а я параллельно хук снимаю и всё свое дерьмо удаляю, и в итоге хук пытается вызвать оригинал которого уже нету, или еще какой-нибудь ресурс получить которого уже нету).
C++:
1. jmp HookPresent //thread1
2. MH_Uninitialize() //thread2
3. HookHandler.reset() //thread2
4. HookHandler.Get() //thread1
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
уу бля бро пиздец.
если ты ПОСЛЕ ЭТОГО все еще не видишь смысл раии делать - ну пиздец что сказать.
OnDllDetach
вызывает
Render::Detach
вызывает
ImGui_ImplDX11_Shutdown
вызывает
ImGui_ImplDX11_GetBackendData
который возвращает nullptr ЕСЛИ Render::Attach(точнее имгуи креейт контекст блаблабла) ЕЩЕ НЕ БЫЛ ВЫЗВАН!!! (имгуи кстати похуй на этот нуллптр он просто ассертит в дебаге онли. в релизе тупо продолжает(и крашит как следствие))
следовательно
ЛЮБОЙ ФЕЙЛ ДО ВОТ ЭТОЙ СТРОЧКИ ВЫЗОВЕТ КРАШ ИЗЗА ТОГО ЧТО Render::Detach удаляет ресурсы(которых еще нету) даже если Render::Attach еще не был вызван. (в общем ты в детаче не чекаешь был ли успешный аттач)
C++:
        Logging::Attach( );
        LOG( "Logging initialized." );
        CTX::DOTA = CTX::DOTA_t( );
        CTX::Memory = CTX::Memory_t( );
        CTX::Config = CTX::Config_t( );
        LOG( "Context initialized." );
        Schema::Setup( );
        LOG( "Schema initialized." );
        Input::Attach( CTX::DOTA->m_pD3D11Device );
        LOG( "Input initialized." );
        Render::Attach( CTX::DOTA->m_pD3D11Device, Input::GetWindowHandle( ) );
сорри но мораль такова, что твои Attach/Detach - говнокод. один из компонентов RAII это как раз чек на валидность перед освобождением ресурсов. если бы у тебя был правильный RAII - такой хуйни бы не было.
C++:
    ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
    IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?");
1659831975400.png
1659832115100.png
C++:
catch( std::exception& exInfo )
    {
        LOG( "Something went wrong during initialization: {}", exInfo.what( ) );
        std::this_thread::sleep_for( std::chrono::seconds( 5 ) );
        OnDllDetach( hModule );
    }
C++:
void OnDllDetach( HMODULE hModule )
{
    Hooks::Detach( );
    pVisuals.reset( );
    Render::Detach( );
    Input::Detach( );
    Logging::Detach( );
    FreeLibrary( hModule );
}
C++:
void Detach( )//Render::Detach
    {
        if ( pRenderTargetView )
        {
            pRenderTargetView->Release( );
            pRenderTargetView = nullptr;
        }
        //gde check???
        ImGui_ImplDX11_Shutdown( );
        ImGui_ImplWin32_Shutdown( );

        ImGui::DestroyContext( );
    }
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
ну и ты личишь мапу с шема хуитой(не удаляешь при деините ибо она статик инлайн. в общем мораль такова что глобалы в длл не надо юзать. да и ваще нигде не надо.)
std::unordered_map< Hash_t, std::unordered_map< Hash_t, std::uint32_t > > Schema::mapOffsets;
она 2мб весит
с одной стороны похуй но с другой стороны лик есть лик. тут насрал там насрал и уже не очень хорошо получается
 
Сверху Снизу