TviKo7teaFy_ 2023-09-13 18:03 采纳率: 0%
浏览 3

远程子类化函数如何实现

远程调用call时间长会导致游戏崩溃
eip注入时间长会导致游戏卡死而且稳定性差(如果eip注入有更好的办法希望朋友们可以指点一下)
然后想尝试一下远线程子类化主线程,但是前提是不通过注入dll,完全的远程创建使用,朋友们有没有好的办法或者指点一下流程

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-09-13 22:11
    关注

    引用 皆我百晓生 小程序回复内容作答:

    远程子类化函数是指在一个进程中,通过远程线程来创建并执行子类化操作,即远程在主线程上创建和处理子类窗口消息。

    实现远程子类化函数需要进行以下步骤:

    1. 获取目标进程的句柄:通过OpenProcess函数打开目标进程,获取其句柄。

    2. 在目标进程中分配内存:使用VirtualAllocEx函数在目标进程中分配一块足够大的内存,用于存储远程线程执行的代码。

    3. 在目标进程中写入代码:使用WriteProcessMemory函数将远程线程执行的代码写入之前分配的内存空间。

    4. 创建远程线程:使用CreateRemoteThread函数在目标进程中创建远程线程,并将代码的入口点设置为之前分配的内存空间。

    5. 等待线程执行完成:使用WaitForSingleObject等待远程线程执行完成。

    以下是一个简单的示例代码:

    #include <windows.h>
    #include <iostream>
    
    void SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        // 子类窗口处理过程
    }
    
    int main()
    {
        HWND hWnd = FindWindow(nullptr, L"Window Title"); // 获取窗口句柄
        if (hWnd == nullptr)
        {
            std::cout << "Window not found" << std::endl;
            return 0;
        }
    
        DWORD dwProcessId, dwThreadId;
        dwThreadId = GetWindowThreadProcessId(hWnd, &dwProcessId); // 获取进程ID和线程ID
    
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId); // 打开进程
    
        // 在目标进程中分配内存
        LPVOID pRemoteMem = VirtualAllocEx(hProcess, nullptr, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
      
        // 在目标进程中写入代码
        // 创建远程线程执行子类窗口操作
        BYTE code[] = {
            0x68, 0x00, 0x00, 0x00, 0x00, // push 0 (hWnd)
            0x68, 0x00, 0x00, 0x00, 0x00, // push 0 (uMsg)
            0x68, 0x00, 0x00, 0x00, 0x00, // push 0 (wParam)
            0x68, 0x00, 0x00, 0x00, 0x00, // push 0 (lParam)
            0x68, 0x00, 0x00, 0x00, 0x00, // push 0 (SubclassProc)
            0x68, 0x00, 0x00, 0x00, 0x00, // push 0 (Return Address)
            0xC3 // ret
        };
        memcpy(code + 1, &hWnd, sizeof(HWND));
        memcpy(code + 6, &uMsg, sizeof(UINT));
        memcpy(code + 11, &wParam, sizeof(WPARAM));
        memcpy(code + 16, &lParam, sizeof(LPARAM));
        memcpy(code + 21, &SubclassProc, sizeof(PROC));
    
        WriteProcessMemory(hProcess, pRemoteMem, code, sizeof(code), nullptr);
    
        // 创建远程线程
        HANDLE hRemoteThread = CreateRemoteThread(hProcess, nullptr, 0,
            static_cast<LPTHREAD_START_ROUTINE>(pRemoteMem), nullptr, 0, nullptr);
    
        // 等待远程线程执行完成
        WaitForSingleObject(hRemoteThread, INFINITE);
    
        // 清理资源
        CloseHandle(hRemoteThread);
        VirtualFreeEx(hProcess, pRemoteMem, 0, MEM_RELEASE);
        CloseHandle(hProcess);
    
        return 0;
    }
    

    需要注意的是,远程子类化函数需要具备足够的权限(如PROCESS_ALL_ACCESS)才能打开目标进程并操作其内存空间。同时,关于系统安全、测试用例、安全架构、远程调用等问题,需要根据具体情况进行详细分析和考虑。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月13日

悬赏问题

  • ¥25 使用cube ai 导入onnx模型时报错
  • ¥15 关于#微信小程序#的问题:用一个网页显示所有关联的微信小程序数据,包括每个小程序的用户访问量
  • ¥15 root的安卓12系统上,如何使apk获得root或者高级别的系统权限?
  • ¥20 关于#matlab#的问题:如果用MATLAB函数delayseq可以对分数延时,但是延时后波形较原波形有幅度上的改变
  • ¥15 使用华为ENSP软件模拟实现该实验拓扑
  • ¥15 通过程序读取主板上报税口的数据
  • ¥15 matlab修改为并行
  • ¥15 尝试访问%1服务的windows注册表时遇到问题。必须先解决此问题,然后才能运行安装过程。(请确认您正在使用管理员权限运行)373
  • ¥15 (关键词-运算放大器)
  • ¥15 关于#游戏策划#的问题:当浏览器输入兑换码,疯狂点击领取按钮,邮箱马上到账几十个兑换码礼包