• 注入


    //
    //    函数          --          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("
    资源清理完毕!
    "));
                        }
                        else
                        {
                            CloseHandle(hGameProcess);
                            printf(_T("
    写入DLL路径失败!
    "));
                        }
                    }
                }
            }
        }
    }
  • 相关阅读:
    第04组 Beta冲刺(2/4)
    第04组 Beta冲刺(1/4)
    2019 SDN上机第6次作业
    SDN课程阅读作业(2)
    2019 SDN上机第5次作业
    第04组 Alpha事后诸葛亮
    第04组 Alpha冲刺(4/4)
    2019 SDN上机第4次作业
    第04组 Alpha冲刺(3/4)
    第07组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/DuanLaoYe/p/5472344.html
Copyright © 2020-2023  润新知