使用QueueUserAPC将DLL代码注入到第三方进程

我想注入我的DLL到64位应用程序,并且我尝试了使用QueueUserAPC在给定链接中解释的逻辑。 我收到了每个API的成功消息,但是当我在ProcessExplorer中看到时,我无法在过程中看到我的dll。 以下是我的代码:

bool FindProcess(PCWSTR exeName, DWORD& pid, vector<DWORD>& tids) {
auto hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD, 0);
if (hSnapshot == INVALID_HANDLE_VALUE)
    return false;
pid = 0;
PROCESSENTRY32 pe = { sizeof(pe) };
if (::Process32First(hSnapshot, &pe)) {
    do {
        if (_wcsicmp(pe.szExeFile, exeName) == 0) {
            pid = pe.th32ProcessID;
            THREADENTRY32 te = { sizeof(te) };
            if (::Thread32First(hSnapshot, &te)) {
                do {
                    if (te.th32OwnerProcessID == pid) {
                        tids.push_back(te.th32ThreadID);
                    }
                } while (::Thread32Next(hSnapshot, &te));
            }
            break;
        }
    } while (::Process32Next(hSnapshot, &pe));
}
::CloseHandle(hSnapshot);
return pid > 0 && !tids.empty();}



void main(){
DWORD pid;
vector<DWORD> tids;
if (FindProcess(L"DataGrid.exe", pid, tids))
{
    printf("OpenProcessn");
    HANDLE hProcess = ::OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pid);
    printf("VirtualAllocExn");
    auto p = ::VirtualAllocEx(hProcess, nullptr, 1 << 12, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    wchar_t buffer[] = L"C:UserssbhumaDocumentsVisual Studio 2015ProjectsGalaxyHookDebugGalaxyHook.dll";
    printf("WriteProcessMemoryn");
    ::WriteProcessMemory(hProcess, p, buffer, sizeof(buffer), nullptr);
    for (const auto& tid : tids)
    {
        printf("OpenThreadn");
        HANDLE hThread = ::OpenThread(THREAD_SET_CONTEXT, FALSE, tid);
        if (hThread)
        {
            printf("GetProcAddressn");
            DWORD word = ::QueueUserAPC((PAPCFUNC)::GetProcAddress(GetModuleHandle(L"kernel32"), "LoadLibraryW"), hThread, (ULONG_PTR)p);
            if (word)
            {
                printf("insdie ifn");
            }
            printf("End of IFn");
        }
    }
    printf("VirtualFreeExn");
    ::VirtualFreeEx(hProcess, p, 0, MEM_RELEASE | MEM_DECOMMIT);
}}

有关将dll注入到64位应用程序的任何帮助都很有帮助,因为我是这个主题的新手。

问候,

Sowmya。


首先,确保您将注射器应用程序构建为64位。

一个可能的原因是你太早释放缓冲区。 QueueUserAPC不会等待; 它将呼叫排队并立即返回。 可以是您的注入器进程结束运行for循环,调用VirtualFreeEx ,然后您的目标进程接收APC,尝试加载您的DLL,但名称缓冲区已经释放到那时,所以LoadLibrary失败。 要验证,请将对VirtualFreeEx的呼叫注释掉。 如果您的DLL将加载OK,修复内存泄漏的一种方法是在您注入的DLL的DllMain(DLL_PROCESS_ATTACH)中调用QueueUserAPC(), OpenEventSetEventCloseHandle之前,在注入器应用程序中使用命名事件CreateEventWaitForSingleObjectVirtualFreeEx之前的注入器应用程序中,我推荐在等待结束时使用超时, CloseHandle 。 作为一个副作用,您的注射器应用程序将能够找出并报告注射是否成功。

另一个可能的原因是您的目标应用程序从不进入可警告状态 并非所有应用程序都使用APC,但在Windows中有多种可供选择的方法来实现异步。 因此,并非所有的应用程序都会调用这些SleepEx / WaitForMultipleObjectsEx函数。 这样的应用程序永远不会收到该APC。 如果是这样的话,你应该使用另一种DLL注入方法。 DataGrid.exe名称提示您的目标应用程序可能是一个GUI应用程序。 您可以使用EnumWindowsFindWindow来查找它的顶级窗口, GetWindowThreadProcessId来获取拥有该窗口的线程ID, SetWindowsHookEx将您的DLL注入到目标进程中。

链接地址: http://www.djcxy.com/p/60325.html

上一篇: DLL Code injection to third party process using QueueUserAPC

下一篇: Dll injection in x64 process don't work