Внедрение .dll в windows приложений на linux - PullRequest
0 голосов
/ 27 апреля 2020

Привет сообщество stackoverflow,

Недавно я перешел с Windows на Linux, как и все мои приложения и проекты. Я думаю, что это лучший выбор, который я когда-либо делал, но я не уверен, подходит ли он для внедрения Windows DLL в Windows программ, которые работают с Wine.

Я знаю, что .so - это формат общей библиотеки для Linux, но я не могу найти эквивалентный порт этой библиотеки DLL ... Я попытался запустить Extreme Injector, Xenos инжектор, а также мой Я написал собственный с Wine, который работает безупречно в Windows, но это дало мне массу ошибок и даже не запустило эти инжекторы.

Инжектор, который я скомпилировал в Windows:

#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

DWORD GetProcId(const char* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!_stricmp(procEntry.szExeFile, procName))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));
        }
    }
    CloseHandle(hSnap);
    return procId;
}

int main()
{
    const char* dllPath = "mydll.dll";
    const char* procName = "program.exe";
    DWORD procId = 0;

    while (!procId)
    {
        procId = GetProcId(procName);
        Sleep(30);
    }

    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, procId);

    if (hProc && hProc != INVALID_HANDLE_VALUE)
    {
        void* loc = VirtualAllocEx(hProc, 0, MAX_PATH, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

        WriteProcessMemory(hProc, loc, dllPath, strlen(dllPath) + 1, 0);

        HANDLE hThread = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, loc, 0, 0);

        if (hThread)
        {
            CloseHandle(hThread);
        }
    }

    if (hProc)
    {
        CloseHandle(hProc);
    }
    return 0;
}


Почему конкретно мой инжектор не будет работать под Wine (и другими)? Я думаю, что это более сложный вопрос, чем кажется на первый взгляд, но, возможно, кто-то знает ответ на этот вопрос.

Я просто ищу простой метод для внедрения Windows DLL в Windows запущенных приложений на Linux с вином. Есть способ сделать это? Также, если кто-то знает, как изменить простой инжектор в коде Windows, чтобы он работал с Wine, и объяснить, почему эти конкретные изменения должны быть выполнены, чтобы он работал, это было бы очень полезно.

Спасибо за ваше время.

Привет

...