w759003376 发表于 2024-5-30 17:05

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

本帖最后由 w759003376 于 2024-5-30 18:06 编辑

下面是执行远程自定义函数代码,代码大概逻辑就是远程在对应进程上执行程序,程序执行的就是我这边自定义的一个函数RemoteThreadProc,这函数内容就是打印test,但是执行后对应远端的进程会异常
有大佬看到出问题吗
#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那块的代码,

   
// 取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一点,侵入性一般,主要是在目标程序上进行功能扩展,保证平栈就行,没有那么复杂
页: [1]
查看完整版本: 远程执行自定义函数异常,有大佬清楚吗