C++ Как создать консоль из под dll

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Ноя 2021
Сообщения
63
Реакции
2
Как создать консоль из под dll и вывести в него текст
 
Смотри в направлении AllocConsole();
Найдёшь что-то рабочее (не просто написание в буффер процесса, а прям создание консоли) - отпишешь
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
Expand Collapse Copy
AllocConsole( );
freopen_s( reinterpret_cast< FILE** >( stdin ), "CONIN$", "r", stdin );
freopen_s( reinterpret_cast< FILE** >( stdout ), "CONOUT$", "w", stdout );
 
Пожалуйста, авторизуйтесь для просмотра ссылки.
мог бы и загуглить...
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Наипростейший способ

C++:
Expand Collapse Copy
if ( AllocConsole( ) )
{
    FILE* file{};
    freopen_s( &file, "CONOUT$", "w+", stdout );
}
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
сама функция создания консоли:
Expand Collapse Copy
void CreateConsole()
{
    if (!AllocConsole()) {
        // Add some error handling here.
        // You can call GetLastError() to get more info about the error.
        return;
    }

    // std::cout, std::clog, std::cerr, std::cin
    FILE* fDummy;
    freopen_s(&fDummy, "CONOUT$", "w", stdout);
    freopen_s(&fDummy, "CONOUT$", "w", stderr);
    freopen_s(&fDummy, "CONIN$", "r", stdin);
    std::cout.clear();
    std::clog.clear();
    std::cerr.clear();
    std::cin.clear();
};

example usage:
Expand Collapse Copy
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateConsole();
        printf_s("lol\n"); // test
        printf_s("fixing imports\n"); // test
        printf_s("fatal crack loaded\n"); // test
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        FreeConsole(); // clean up
        break;
    }
    return TRUE;
}
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
Expand Collapse Copy
AllocConsole();
freopen("CONOUT$", "w", stdout);
std::cout << "1337" << std::endl;
Хорошо, но что ты будешь делать если у тебя AllocConsole вернёт не 1 а 0? И если чел не умеет юзать _CRT_SECURE_NO_WARNINGS ?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Хорошо, но что ты будешь делать если у тебя AllocConsole вернёт не 1 а 0?
Ну и че ебать? Если AllocConsole вернет false, то у процесса уже есть консоль. Это значит, что ты все так же сможешь перенаправить поток для записи и писать в уже открытую (не твоей dll) консоль. Че за тупой доеб?
 
C++:
Expand Collapse Copy
void attach_console( const std::wstring_view& name ) {
    AllocConsole( );

    if ( !freopen_s( reinterpret_cast< FILE** >( stdin ), "CONIN$", "r", stdin ) ) {
        throw std::runtime_error( "couldn't open stdin handle");
    }

    if ( !freopen_s( reinterpret_cast< FILE** >( stdout ), "CONOUT$", "w", stdout) ) {
        throw std::runtime_error( "couldn't open stdout handle");
    };

    if ( !freopen_s( reinterpret_cast< FILE** >( stdout ), "CONOUT$", "w", stderr) ) {
        throw std::runtime_error( "couldn't open stderr handle");
    };

    if ( !name.empty( ) ) {
        SetConsoleTitle( name );
    }
}
 
Назад
Сверху Снизу