吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 517|回复: 9
收起左侧

[讨论] 远程执行自定义函数异常,有大佬清楚吗

[复制链接]
w759003376 发表于 2024-5-30 17:05
本帖最后由 w759003376 于 2024-5-30 18:06 编辑

下面是执行远程自定义函数代码,代码大概逻辑就是远程在对应进程上执行程序,程序执行的就是我这边自定义的一个函数RemoteThreadProc,这函数内容就是打印test,但是执行后对应远端的进程会异常
有大佬看到出问题吗
[C++] 纯文本查看 复制代码
#include <windows.h>
#include <iostream>

// 全局变量,用于存储加载的DLL模块句柄
HMODULE g_hModule = NULL;
HMODULE hModule;
DWORD lpExitCode;
DWORD LoadAddr;

// 远程线程执行函数,用于加载DLL
DWORD WINAPI RemoteThreadProc(LPVOID lpParameter)
{
    std::cout << "test" << std::endl;
   
    return 0;
}


BOOL LoadDll(DWORD ProcId)
{
    LPVOID DllAlloc;
    // 获取目标进程的句柄
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcId);
    std::cout << hProc << std::endl;
    if (hProc == NULL)
    {
        std::cerr << "无法打开进程" << std::endl;
        return FALSE;
    }

      
    // 创建远程线程,在目标进程中执行加载DLL的操作
    HANDLE hThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)RemoteThreadProc, NULL, 0, NULL);

    if (hThread == NULL)
    {
        std::cerr << "无法创建远程线程" << std::endl;
        VirtualFreeEx(hProc, lpRemoteDllPath, 0, MEM_RELEASE);
        CloseHandle(hProc);
        return FALSE;
    }

    // 等待远程线程执行完毕
    WaitForSingleObject(hThread, INFINITE);
    std::cout << "开始清理资源" << std::endl;
    // 清理资源
    //CloseHandle(hThread);
   // VirtualFreeEx(hProc, lpRemoteDllPath, 0, MEM_RELEASE);
   // CloseHandle(hProc);

    
    return TRUE;
}



int main()
{
    DWORD processId =15228; // 目标进程的ID

    if (LoadDll(processId, dllPath))
    {
        // 成功执行自定义函数后的操作
    }


    return 0;
}



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

白陌陌 发表于 2024-5-30 17:39
本帖最后由 白陌陌 于 2024-5-30 17:45 编辑

如果我没看错的话,你似乎是想在目标进程里执行你的加载函数的代码?你传进去的地址指针是你注入程序的,不是你目标程序的啊,修改一下加载DLL那块的代码,

[C++] 纯文本查看 复制代码
    
// 取LoadLibraryA 的地址
LPVOID pLoadLibrary = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    if (pLoadLibrary == NULL) {
        std::cerr << "取LoadLibraryA方法失败" << GetLastError() << std::endl;
        VirtualFreeEx(hProc, lpRemoteDllPath, 0, MEM_RELEASE);
        CloseHandle(hProc);
        return FALSE;
    }

    // 远程线程加载DLL
    HANDLE hRemoteThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)pLoadLibrary, lpRemoteDllPath, 0, NULL);
    if (hRemoteThread == NULL) {
        std::cerr << "创建远程线程失败 " << GetLastError() << std::endl;
        VirtualFreeEx(hProcess, pRemoteMemory, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return FALSE;
    }
 楼主| w759003376 发表于 2024-5-30 17:52
本帖最后由 w759003376 于 2024-5-30 17:55 编辑
白陌陌 发表于 2024-5-30 17:39
如果我没看错的话,你似乎是想在目标进程里执行你的加载函数的代码?你传进去的地址指针是你注入程序的,不 ...

抱歉哈,我修改下内容,我原本代码申请内存填入dll的步骤是没用的,我删除下
我想实现的就是远程执行我的一个自定义函数,然后那个自定义函数会去加载我的那个dll,我加载那里应该 填写有问题,但是我自定义函数无论是什么,好像都会引起远程进程异常退出
plauger 发表于 2024-5-30 18:05
问题就出在RemoteThreadProc,这个函数必须在远程进程空间内才行。一般远程注入是直接填入::LoadLibrary地址的,这样就免去将RemoteThreadProc执行代码写入目标进程,搞得麻烦一点可能还需要解决符号重定位问题。

简而言之,如果单纯实现远程注入,你这个RemoteThreadProc是多余的,直接替换为::LoadLibrary即可。
 楼主| w759003376 发表于 2024-5-30 18:12
本帖最后由 w759003376 于 2024-5-30 18:20 编辑
plauger 发表于 2024-5-30 18:05
问题就出在RemoteThreadProc,这个函数必须在远程进程空间内才行。一般远程注入是直接填入::LoadLibrary地 ...

哦哦,所以就是因为我自定义函数在远程进程空间里面没用,所以才会执行异常,那我直接在对应进程上申请内存空间,把对应自定义函数填充进去,然后再用CreateRemoteThread去执行刚申请的内存地址指针就可以实现对吧
plauger 发表于 2024-5-30 20:54
本帖最后由 plauger 于 2024-5-30 20:55 编辑
w759003376 发表于 2024-5-30 18:12
哦哦,所以就是因为我自定义函数在远程进程空间里面没用,所以才会执行异常,那我直接在对应进程上申请内 ...

是的,如果只是简单实现远程注入,像2楼那位兄弟那样实现就可以了。如果有更复杂的需求,需要写个函数来做更多的事情,那就必须将函数的字节码写到目标进程空间中,再次提醒一下,还是要注意符号重定位问题,比如在函数体内引用了全局变量之类的也是不可以的,必须要做到像shellcode那样,拷贝到任何地方都能正确执行才行。
 楼主| w759003376 发表于 2024-5-30 23:22
plauger 发表于 2024-5-30 20:54
是的,如果只是简单实现远程注入,像2楼那位兄弟那样实现就可以了。如果有更复杂的需求,需要写个函数来 ...

好的,感谢各位大佬,牛的
白陌陌 发表于 2024-5-31 12:33
前段时间才做过类似的事情,hook目标程序来执行我的代码,不过没有楼上兄弟那么专业,我只是把我的功能代码写在DLL里,然后dll自动hook原程序到我DLL的函数上,执行一段代码后又跳转回原程序
 楼主| w759003376 发表于 2024-5-31 14:25
白陌陌 发表于 2024-5-31 12:33
前段时间才做过类似的事情,hook目标程序来执行我的代码,不过没有楼上兄弟那么专业,我只是把我的功能代码 ...

那怕是涉及到了堆栈平衡了把,挂起程序,然后记录eip,执行你的代码,然后再恢复是吧
白陌陌 发表于 2024-5-31 16:58
w759003376 发表于 2024-5-31 14:25
那怕是涉及到了堆栈平衡了把,挂起程序,然后记录eip,执行你的代码,然后再恢复是吧

这个看具体需求的,我的写法更偏向hook一点,侵入性一般,主要是在目标程序上进行功能扩展,保证平栈就行,没有那么复杂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-14 22:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表