注入 - 远线程注入DLL到目标进程

//
//    函数          --          void InjectDLL(LPCTSTR)
//
//    功能          --          注入DLL到指定窗口
//
//    @param       --          要注入的DLL全路径
//
//    返回值        --          无
//
void InjectDLL(LPCTSTR lpDLLFullPath)
{
    DWORD            dwPID = 0;                               // 目标进程PID
    HANDLE            hGameProcess = NULL;                    // 目标进程句柄
    LPDWORD        lpdwAddr = NULL;                           // 远程申请的内存空间地址
    DWORD            dwWriteByteSize = 0;                     // 写入的字节数
    HANDLE            hRemoteThread = NULL;                   // 远程线程句柄

    // 1. 获取窗口句柄
    HWND hGameWnd = ::FindWindow(GAME_CLASS_NAME, NULL);
    if (hGameWnd)
    {
        // 2. 通过窗口句柄, 获取窗口PID
        GetWindowThreadProcessId(hGameWnd, &dwPID);
        if (dwPID)
        {
            // 3. 通过窗口PID, 获取游戏进程句柄
            hGameProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
            if (hGameProcess)
            {
                // 4. 在游戏进程里, 分配一片内存空间, 用于存放要注入的DLL;        
                //    @param1 : 游戏进程句柄;         @param2 : 指定的内存地址(一般为NULL);    @param3 == 256 代表DLL路径的最大长度;    @param4 : 可读可写
                lpdwAddr = (LPDWORD)VirtualAllocEx(hGameProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
                if (lpdwAddr)
                {
                    // 5. 写入DLL全路径
                    WriteProcessMemory(hGameProcess, lpdwAddr, lpDLLFullPath, strlen(lpDLLFullPath) + 1, &dwWriteByteSize);    //MAIN_DLL_FULL_PATH
                    if (dwWriteByteSize >= strlen(lpDLLFullPath))
                    {
                        // 6. 创建远程线程注入DLL
                        hRemoteThread = CreateRemoteThread(hGameProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpdwAddr, 0, NULL);
                        
                        // 7. 清理资源
                        WaitForSingleObject(hRemoteThread, INFINITE);
                        CloseHandle(hRemoteThread);                                          // 关闭远程线程句柄
                        VirtualFreeEx(hGameProcess, lpdwAddr, 256, MEM_DECOMMIT);            // 释放申请的内存空间    
                        CloseHandle(hGameProcess);                                           // 关闭目标进程句柄
                        printf(_T("\r\n资源清理完毕!\r\n"));
                    }
                    else
                    {
                        CloseHandle(hGameProcess);
                        printf(_T("\r\n写入DLL路径失败!\r\n"));
                    }
                }
            }
        }
    }
}

 

posted @ 2016-05-08 23:53  C/C++/Python/Java  阅读(1945)  评论(0编辑  收藏  举报