Инжектирование dll в Qt-приложение

207
14 марта 2018, 06:43

На данный момент бьюсь над решением следующей задачи: необходимо внедрить dll в Qt-приложение, а затем получить Qwidget для дальнейшего взаимодействия с ними. Перепробовал/перечитал много информации. Через Qt-creator создаю своё приложение и внедрение происходит успешно, а вот в стороннее никак не получается. Очевидно, что-то делаю неправильно. Если у кого есть подобный опыт, пожалуйста, покажите код по подобным внедрениям. Буду очень благодарен!

Код инжектирования:

#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
char const path[] = "TestLibrary.dll";
void setDebugPrivilege()
{
    HANDLE hToken;
    TOKEN_PRIVILEGES privileges;
    privileges.PrivilegeCount = 1;
    privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        std::cout << "Failed to open process." << std::endl;
    }
    if (!LookupPrivilegeValue(0, SE_DEBUG_NAME, &privileges.Privileges[0].Luid))
    {
        std::cout << "Failed to look up privileges." << std::endl;
    }
    if (!AdjustTokenPrivileges(hToken, false, &privileges, sizeof(privileges), 0, 0))
    {
        std::cout << "Failed to adjust token privileges." << std::endl;
    }
    CloseHandle(hToken);
}
int main()
{
    setDebugPrivilege();
    HWND hWnd;
    hWnd = FindWindowA(0, "MainWindow");
    if (!hWnd) 
    {
        std::cout << "Could not find editor window." << std::endl;
    }
    DWORD pId;
    GetWindowThreadProcessId(hWnd, &pId);
    if (!pId) 
    {
        std::cout << "Could not find process id." << std::endl;
    }
    HANDLE hProcess;
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pId);
    if (!hProcess) 
    {
        std::cout << "Failed to open process." << std::endl;
    }
    HANDLE allocatedAddress;
    allocatedAddress = VirtualAllocEx(hProcess, 0, sizeof(path), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    BOOL result = WriteProcessMemory(hProcess, (void*)allocatedAddress, (void*)path, sizeof(path), 0);
    HANDLE hRemoteThread;
    hRemoteThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"), allocatedAddress, 0, 0);
    if (!hRemoteThread) 
    {
        std::cout << "Failed to create remote thread: " << GetLastError() << std::endl;
    }
    WaitForSingleObject(hRemoteThread, INFINITE);
    VirtualFreeEx(hProcess, allocatedAddress, sizeof(path), MEM_DECOMMIT);
    CloseHandle(hProcess);
    system("Pause");
    return 0;
}

Код dll на Qt:

#include <Windows.h>
#include "testlibrary.h"
extern "C" __declspec(dllexport) BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved);
BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        {
            TestLibrary test;
            test.Test();
            break;
        }
        case DLL_THREAD_ATTACH:
        {
            break;
        }
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

P.S. Всё это было найдено на просторах интернета. Но видимо каких-то знаний мне не хватает, чтобы довести дело до успешного завершения

READ ALSO
Вызвать Lua функцию из таблицы Lua через lua C Api

Вызвать Lua функцию из таблицы Lua через lua C Api

У меня есть следующий код на Lua:

268
Рандом ASCII C++

Рандом ASCII C++

Можно ли как то рандомить символы из ASCII C++? Если да то как? А то массивы символов не хочется вводить

240
Быстрое считывание с++

Быстрое считывание с++

Здравствуйте, нужна помощь с написанием быстрого считывания из файла с помощью getchar_unlock()В файле есть две строки не обязательно одинакового...

311