На данный момент бьюсь над решением следующей задачи: необходимо внедрить 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. Всё это было найдено на просторах интернета. Но видимо каких-то знаний мне не хватает, чтобы довести дело до успешного завершения
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Можно ли как то рандомить символы из ASCII C++? Если да то как? А то массивы символов не хочется вводить
Здравствуйте, нужна помощь с написанием быстрого считывания из файла с помощью getchar_unlock()В файле есть две строки не обязательно одинакового...