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

  • Автор темы Автор темы xnxkzeu
  • Дата начала Дата начала
Эксперт
Эксперт
Статус
Оффлайн
Регистрация
31 Авг 2018
Сообщения
1,806
Реакции
1,074
Всем здарова, давно я ничего нормального не постил, надо бы исправлять.
Заинтересовал меня недавно такой фрукт, как 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
 
Последнее редактирование:
Всем здарова, давно я ничего нормального не постил, надо бы исправлять.
Заинтересовал меня недавно такой фрукт, как 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
Так вот что ты подразумевал что запостишь что то годное.
 
если используешь исключения - не забывай ресурсы оборачивать в RAII.
вот смотри ты консольку создаешь(представь что ты ее успешно создал появилось окошко)
C++:
Expand Collapse Copy
if ( !AllocConsole( ) )
            throw std::runtime_error( "Failed to allocate console." );

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

            FreeConsole( );

            if ( const HWND hConsole = GetConsoleWindow( ) )
                PostMessage( hConsole, WM_CLOSE, 0, 0 );
        }
но ведь если фреопен зафейлил то у тебя pStream будет nullptr - чек зафейлит, и консоль никогда не будет освобождена - получается ты ликаешь ресурс(созданную консоль). юзер остается с бесполезной открытой навсегда консолькой как долбоёб при деините чита. к тому же еще и повторно не сможет инжектнуть так как AllocConsole фейлит если консолька уже существует :))
и возможно это не единственное место в твоем коде где есть такая проблема. фиксится тем что консолька в RAII оборачивается чтобы при вылете исключения она деструктировалась и освобождалась.
 
C++:
Expand Collapse Copy
if ( pStream )
        {
            fclose( pStream );

            FreeConsole( );

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

Зависит только от предпочтений кодера, а я предпочитаю заранее инициализировать все, с чем может вестись работа внутри хуков
если ты не заметил, то ты в этих трех вызовах допустил баг. правильная раии-обертка скорее всего бы предотвратила его. ты точно не видишь смысла?
да и я смотрю ты ваще нигде в проекте не используешь RAII. это классная фича, попробуй. всегда надо с чего-то начинать. почему бы не сейчас? особенно с учетом того что ты используешь исключения которые ахуеть как хорошо сочетаются с RAII.
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
правильная раии-обертка скорее всего бы предотвратила его. ты точно не видишь смысла?
В этой раии обертке так же можно случайно воткнуть лишние фигурные скобки, это человеческий фактор от которого не застрахован никто. Все еще не вижу смысла в обертке там
 
В этой раии обертке так же можно случайно воткнуть лишние фигурные скобки, это человеческий фактор от которого не застрахован никто. Все еще не вижу смысла в обертке там
так я тебе и говорю что мы все рано или поздно ошибаемся. единственный способ избежать ошибок - сделать так, чтобы было меньше мест где их можно допустить.
в том то и суть что там МЕНЬШЕ ВЕРОЯТНОСТЬ лишние фигурные скобки воткнуть, у тебя в обертке на консоль будет ТОЛЬКО КОНСОЛЬ. там не будет фреопена фклоза которые тебя отвлекли и изза которых ты въебал лишние скобки.
смотри где у тебя скобки лишние были:
C++:
Expand Collapse Copy
if ( pStream )
        {
            fclose( pStream );
рядом с pStream и fclose. так хули КОНСОЛЬ должна страдать от этого? просто потому что она была рядом? так раздели фрееконсоле и фклозе и профит. пусть консоль отдельно закрывается от файла.
 
ну и у тебя проблема с деинитом чита и синхронизацией.
представим:
нажали 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++:
Expand Collapse Copy
1. jmp HookPresent //thread1
2. MH_Uninitialize() //thread2
3. HookHandler.reset() //thread2
4. HookHandler.Get() //thread1
 
уу бля бро пиздец.
если ты ПОСЛЕ ЭТОГО все еще не видишь смысл раии делать - ну пиздец что сказать.
OnDllDetach
вызывает
Render::Detach
вызывает
ImGui_ImplDX11_Shutdown
вызывает
ImGui_ImplDX11_GetBackendData
который возвращает nullptr ЕСЛИ Render::Attach(точнее имгуи креейт контекст блаблабла) ЕЩЕ НЕ БЫЛ ВЫЗВАН!!! (имгуи кстати похуй на этот нуллптр он просто ассертит в дебаге онли. в релизе тупо продолжает(и крашит как следствие))
следовательно
ЛЮБОЙ ФЕЙЛ ДО ВОТ ЭТОЙ СТРОЧКИ ВЫЗОВЕТ КРАШ ИЗЗА ТОГО ЧТО Render::Detach удаляет ресурсы(которых еще нету) даже если Render::Attach еще не был вызван. (в общем ты в детаче не чекаешь был ли успешный аттач)
C++:
Expand Collapse Copy
        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++:
Expand Collapse Copy
    ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
    IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?");
1659831975400.png

1659832115100.png

C++:
Expand Collapse Copy
catch( std::exception& exInfo )
    {
        LOG( "Something went wrong during initialization: {}", exInfo.what( ) );
        std::this_thread::sleep_for( std::chrono::seconds( 5 ) );
        OnDllDetach( hModule );
    }
C++:
Expand Collapse Copy
void OnDllDetach( HMODULE hModule )
{
    Hooks::Detach( );
    pVisuals.reset( );
    Render::Detach( );
    Input::Detach( );
    Logging::Detach( );
    FreeLibrary( hModule );
}
C++:
Expand Collapse Copy
void Detach( )//Render::Detach
    {
        if ( pRenderTargetView )
        {
            pRenderTargetView->Release( );
            pRenderTargetView = nullptr;
        }
        //gde check???
        ImGui_ImplDX11_Shutdown( );
        ImGui_ImplWin32_Shutdown( );

        ImGui::DestroyContext( );
    }
 
Последнее редактирование:
ну и ты личишь мапу с шема хуитой(не удаляешь при деините ибо она статик инлайн. в общем мораль такова что глобалы в длл не надо юзать. да и ваще нигде не надо.)
std::unordered_map< Hash_t, std::unordered_map< Hash_t, std::uint32_t > > Schema::mapOffsets;
она 2мб весит
с одной стороны похуй но с другой стороны лик есть лик. тут насрал там насрал и уже не очень хорошо получается
 
Назад
Сверху Снизу