Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Как сделать из консольного приложения библиотеку DLL

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
362
Реакции
21
Всем Привет, Доброе Утро, добрый день, добрейший вечерочек.
Как сделать из консольного приложения библиотеку DLL,а при инжекте в блокнот, сделать открытие консольки, из уже написаного кода?
 
Всем Привет, Доброе Утро, добрый день, добрейший вечерочек.
Как сделать из консольного приложения библиотеку DLL,а при инжекте в блокнот, сделать открытие консольки, из уже написаного кода?
Если я не ошибаюсь, то придется использовать WinAPI методы.
AllocConsole - Выделяет текущую консоль для процесса

Думаю, что тебе как раз нужна эта функция
 
Если я не ошибаюсь, то придется использовать WinAPI методы.
AllocConsole - Выделяет текущую консоль для процесса

Думаю, что тебе как раз нужна эта функция
Думаю да, я про неё читал, интересно как её в консольное приложение вставить, я так понимаю где-то в main?
 
Думаю да, я про неё читал, интересно как её в консольное приложение вставить, я так понимаю где-то в main?
Вот небольшой пример на библиотеке MinHook:
C++:
Expand Collapse Copy
#include <string>
#include <windows.h>
#include <iostream>
#include "MinHook\MinHook.h"
#include "Util\Common.h"

#if defined _M_X64
#pragma comment(lib, "libMinHook-x64-v141-mdd.lib")
#elif defined _M_IX86
#pragma comment(lib, "libMinHook-x86-v141-mdd.lib")
#endif

int DisableHooks() {
    if (MH_DisableHook(MH_ALL_HOOKS) != MH_OK)
    {
        return 1;
    }

    // Uninitialize MinHook.
    if (MH_Uninitialize() != MH_OK)
    {
        return 1;
    }
    return 0;
}


DWORD WINAPI HookThread(LPVOID lpModule)
{
    util::CreateConsole();
    // Initialize MinHook.
    if (MH_Initialize() != MH_OK)
        util::Log("MH_Initialize failed");

    // TODO: Create hooks

    // Enable the hooks.
    if (MH_EnableHook(MH_ALL_HOOKS) != MH_OK)
    {
        util::Log("MH_EnableHook failed");
        return 1;
    }

    return 0;
}


BOOL APIENTRY DllMain(HMODULE hModule, DWORD_PTR ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        CreateThread(NULL, 0, HookThread, hModule, NULL, NULL);
        break;
    case DLL_PROCESS_DETACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
        DisableHooks();
        break;
    }
    return TRUE;
}
C++:
Expand Collapse Copy
#pragma once

namespace util
{
    void CreateConsole();
    HMODULE GetCurrentModule();
    void Log(const char *fmt, ...);
}
C++:
Expand Collapse Copy
#include <windows.h>
#include <fcntl.h>
#include <stdio.h>
#include <io.h>
#include <string>
#include <fstream>
#include <commdlg.h>

#include "Util\Common.h"

void util::CreateConsole()
{
    if (!AllocConsole())
    {
        char buffer[1024] = { 0 };
        sprintf_s(buffer, "Failed to AllocConsole( ), GetLastError( ) = %d", GetLastError());
        MessageBox(HWND_DESKTOP, buffer, "Error", MB_OK);

        return;
    }

    auto lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    auto hConHandle = _open_osfhandle(PtrToUlong(lStdHandle), _O_TEXT);
    auto fp = _fdopen(hConHandle, "w");

    freopen_s(&fp, "CONOUT$", "w", stdout);

    *stdout = *fp;
    setvbuf(stdout, NULL, _IONBF, 0);
}

HMODULE util::GetCurrentModule()
{
    HMODULE hModule = NULL;

    GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
        reinterpret_cast<LPCTSTR>(GetCurrentModule),
        &hModule);

    return hModule;
}

void util::Log(const char *fmt, ...)
{
    if (!fmt)    return;

    char        text[4096];
    va_list        ap;
    va_start(ap, fmt);
    vsprintf_s(text, fmt, ap);
    va_end(ap);

    std::ofstream logfile("log.txt", std::ios::app);
    if (logfile.is_open() && text) {
        logfile << text;
    }
    logfile.close();
}
 
Вот небольшой пример на библиотеке MinHook:
C++:
Expand Collapse Copy
#include <string>
#include <windows.h>
#include <iostream>
#include "MinHook\MinHook.h"
#include "Util\Common.h"

#if defined _M_X64
#pragma comment(lib, "libMinHook-x64-v141-mdd.lib")
#elif defined _M_IX86
#pragma comment(lib, "libMinHook-x86-v141-mdd.lib")
#endif

int DisableHooks() {
    if (MH_DisableHook(MH_ALL_HOOKS) != MH_OK)
    {
        return 1;
    }

    // Uninitialize MinHook.
    if (MH_Uninitialize() != MH_OK)
    {
        return 1;
    }
    return 0;
}


DWORD WINAPI HookThread(LPVOID lpModule)
{
    util::CreateConsole();
    // Initialize MinHook.
    if (MH_Initialize() != MH_OK)
        util::Log("MH_Initialize failed");

    // TODO: Create hooks

    // Enable the hooks.
    if (MH_EnableHook(MH_ALL_HOOKS) != MH_OK)
    {
        util::Log("MH_EnableHook failed");
        return 1;
    }

    return 0;
}


BOOL APIENTRY DllMain(HMODULE hModule, DWORD_PTR ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hModule);
        CreateThread(NULL, 0, HookThread, hModule, NULL, NULL);
        break;
    case DLL_PROCESS_DETACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
        DisableHooks();
        break;
    }
    return TRUE;
}
C++:
Expand Collapse Copy
#pragma once

namespace util
{
    void CreateConsole();
    HMODULE GetCurrentModule();
    void Log(const char *fmt, ...);
}
C++:
Expand Collapse Copy
#include <windows.h>
#include <fcntl.h>
#include <stdio.h>
#include <io.h>
#include <string>
#include <fstream>
#include <commdlg.h>

#include "Util\Common.h"

void util::CreateConsole()
{
    if (!AllocConsole())
    {
        char buffer[1024] = { 0 };
        sprintf_s(buffer, "Failed to AllocConsole( ), GetLastError( ) = %d", GetLastError());
        MessageBox(HWND_DESKTOP, buffer, "Error", MB_OK);

        return;
    }

    auto lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    auto hConHandle = _open_osfhandle(PtrToUlong(lStdHandle), _O_TEXT);
    auto fp = _fdopen(hConHandle, "w");

    freopen_s(&fp, "CONOUT$", "w", stdout);

    *stdout = *fp;
    setvbuf(stdout, NULL, _IONBF, 0);
}

HMODULE util::GetCurrentModule()
{
    HMODULE hModule = NULL;

    GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
        reinterpret_cast<LPCTSTR>(GetCurrentModule),
        &hModule);

    return hModule;
}

void util::Log(const char *fmt, ...)
{
    if (!fmt)    return;

    char        text[4096];
    va_list        ap;
    va_start(ap, fmt);
    vsprintf_s(text, fmt, ap);
    va_end(ap);

    std::ofstream logfile("log.txt", std::ios::app);
    if (logfile.is_open() && text) {
        logfile << text;
    }
    logfile.close();
}
Так да,только это же на плюсах, а как на шарпе сделать?
 
C#:
Expand Collapse Copy
public static void CreateConsole()
    {
        AllocConsole();

        // stdout's handle seems to always be equal to 7
        IntPtr defaultStdout = new IntPtr(7);
        IntPtr currentStdout = GetStdHandle(StdOutputHandle);

        if (currentStdout != defaultStdout)
            // reset stdout
            SetStdHandle(StdOutputHandle, defaultStdout);

        // reopen stdout
        TextWriter writer = new StreamWriter(Console.OpenStandardOutput())
        { AutoFlush = true };
        Console.SetOut(writer);
    }

    // P/Invoke required:
    private const UInt32 StdOutputHandle = 0xFFFFFFF5;
    [DllImport("kernel32.dll")]
    private static extern IntPtr GetStdHandle(UInt32 nStdHandle);
    [DllImport("kernel32.dll")]
    private static extern void SetStdHandle(UInt32 nStdHandle, IntPtr handle);
    [DllImport("kernel32")]
    static extern bool AllocConsole();
Так да,только это же на плюсах, а как на шарпе сделать?
Извиняюсь, чет затупил)
 
Q: Как сделать из консольного приложения библиотеку DLL
A: Зайди в параметры проекта и скомпилируй как 'библиотека приложения'

Q: при инжекте в блокнот, сделать открытие консольки, из уже написаного кода
A: Есть немного закостыленный метод, через вызов *метода .NET из длл с помощью другой длл c++ вызывающею её
Источник:
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование модератором:
Назад
Сверху Снизу