在linux上的windows应用程序中注入.dll

qvsjd97n  于 2023-06-05  发布在  Linux
关注(0)|答案(1)|浏览(265)

你好stackoverflow社区
最近我从Windows切换到Linux,我所有的应用程序和项目也是如此。我认为这是我做过的最好的选择,但我不确定是否也可以将Windows DLL注入到运行Wine的Windows程序中。
我知道.so是Linux的共享库格式,但我找不到该dll的等效端口。我试过运行极端注射器,Xenos注射器,也是我自己写的一个与葡萄酒,在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注入到在Linux上运行的Windows应用程序中。有办法做到吗?另外,如果有人知道如何修改Windows代码下的简单注入器,使其与Wine一起工作,并解释为什么这些特定的修改必须到位,使其工作,这将是非常感激的。
谢谢你的时间。
欢迎光临

ccrfmcuu

ccrfmcuu1#

DLL注入应该与wine一起工作,前提是注入器和目标程序都在相同的wine前缀中运行。
You can use mingw to compile DLLs on Linux.
但是要注意大小写敏感性,导入Windows.h不起作用,导入windows.h就可以了。以下是可用于测试的示例DLL的代码:

#include <windows.h>
#include <iostream>

DWORD WINAPI MainThread(HMODULE hModule) {
    AllocConsole();
    FILE* f;
    freopen_s(&f, "CONOUT$", "w", stdout);
    std::cout << "TEST" << std::endl;

    fclose(f);
    FreeConsole();
    FreeLibraryAndExitThread(hModule, 0);
    return 0;
}

__declspec(dllexport) BOOL WINAPI APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
  switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
    {
      CloseHandle(CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)MainThread, hModule, 0, nullptr));
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
  }
  return TRUE;
}

正如上面链接的文章中所写的,链接时需要添加-shared -Wl,--subsystem,windows

相关问题