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

Начинающий
Статус
Оффлайн
Регистрация
13 Ноя 2021
Сообщения
61
Реакции[?]
2
Поинты[?]
0
Как создать консоль из под dll и вывести в него текст
 
Пользователь
Статус
Оффлайн
Регистрация
16 Мар 2021
Сообщения
376
Реакции[?]
78
Поинты[?]
11K
Смотри в направлении AllocConsole();
Найдёшь что-то рабочее (не просто написание в буффер процесса, а прям создание консоли) - отпишешь
 
Забаненный
Статус
Оффлайн
Регистрация
7 Ноя 2022
Сообщения
1
Реакции[?]
0
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
AllocConsole( );
freopen_s( reinterpret_cast< FILE** >( stdin ), "CONIN$", "r", stdin );
freopen_s( reinterpret_cast< FILE** >( stdout ), "CONOUT$", "w", stdout );
 
dev
Забаненный
Статус
Оффлайн
Регистрация
5 Апр 2022
Сообщения
302
Реакции[?]
215
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Наипростейший способ

C++:
if ( AllocConsole( ) )
{
    FILE* file{};
    freopen_s( &file, "CONOUT$", "w+", stdout );
}
 
#include <brain>
Забаненный
Статус
Оффлайн
Регистрация
29 Сен 2020
Сообщения
588
Реакции[?]
99
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
14 Апр 2021
Сообщения
53
Реакции[?]
8
Поинты[?]
0
сама функция создания консоли:
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:
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;
}
 
dev
Забаненный
Статус
Оффлайн
Регистрация
5 Апр 2022
Сообщения
302
Реакции[?]
215
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
AllocConsole();
freopen("CONOUT$", "w", stdout);
std::cout << "1337" << std::endl;
Хорошо, но что ты будешь делать если у тебя AllocConsole вернёт не 1 а 0? И если чел не умеет юзать _CRT_SECURE_NO_WARNINGS ?
 
dev
Забаненный
Статус
Оффлайн
Регистрация
5 Апр 2022
Сообщения
302
Реакции[?]
215
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пользователь
Статус
Оффлайн
Регистрация
17 Июл 2021
Сообщения
462
Реакции[?]
118
Поинты[?]
11K
Хорошо, но что ты будешь делать если у тебя AllocConsole вернёт не 1 а 0?
Ну и че ебать? Если AllocConsole вернет false, то у процесса уже есть консоль. Это значит, что ты все так же сможешь перенаправить поток для записи и писать в уже открытую (не твоей dll) консоль. Че за тупой доеб?
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,605
Реакции[?]
607
Поинты[?]
48K
C++:
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 );
    }
}
 
Сверху Снизу