远程执行自定义函数异常,有大佬清楚吗
本帖最后由 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: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:55 编辑
白陌陌 发表于 2024-5-30 17:39
如果我没看错的话,你似乎是想在目标进程里执行你的加载函数的代码?你传进去的地址指针是你注入程序的,不 ...
抱歉哈,我修改下内容,我原本代码申请内存填入dll的步骤是没用的,我删除下
我想实现的就是远程执行我的一个自定义函数,然后那个自定义函数会去加载我的那个dll,我加载那里应该 填写有问题,但是我自定义函数无论是什么,好像都会引起远程进程异常退出 问题就出在RemoteThreadProc,这个函数必须在远程进程空间内才行。一般远程注入是直接填入::LoadLibrary地址的,这样就免去将RemoteThreadProc执行代码写入目标进程,搞得麻烦一点可能还需要解决符号重定位问题。
简而言之,如果单纯实现远程注入,你这个RemoteThreadProc是多余的,直接替换为::LoadLibrary即可。 本帖最后由 w759003376 于 2024-5-30 18:20 编辑
plauger 发表于 2024-5-30 18:05
问题就出在RemoteThreadProc,这个函数必须在远程进程空间内才行。一般远程注入是直接填入::LoadLibrary地 ...
哦哦,所以就是因为我自定义函数在远程进程空间里面没用,所以才会执行异常,那我直接在对应进程上申请内存空间,把对应自定义函数填充进去,然后再用CreateRemoteThread去执行刚申请的内存地址指针就可以实现对吧 本帖最后由 plauger 于 2024-5-30 20:55 编辑
w759003376 发表于 2024-5-30 18:12
哦哦,所以就是因为我自定义函数在远程进程空间里面没用,所以才会执行异常,那我直接在对应进程上申请内 ...
是的,如果只是简单实现远程注入,像2楼那位兄弟那样实现就可以了。如果有更复杂的需求,需要写个函数来做更多的事情,那就必须将函数的字节码写到目标进程空间中,再次提醒一下,还是要注意符号重定位问题,比如在函数体内引用了全局变量之类的也是不可以的,必须要做到像shellcode那样,拷贝到任何地方都能正确执行才行。 plauger 发表于 2024-5-30 20:54
是的,如果只是简单实现远程注入,像2楼那位兄弟那样实现就可以了。如果有更复杂的需求,需要写个函数来 ...
好的,感谢各位大佬,牛的 前段时间才做过类似的事情,hook目标程序来执行我的代码,不过没有楼上兄弟那么专业,我只是把我的功能代码写在DLL里,然后dll自动hook原程序到我DLL的函数上,执行一段代码后又跳转回原程序 白陌陌 发表于 2024-5-31 12:33
前段时间才做过类似的事情,hook目标程序来执行我的代码,不过没有楼上兄弟那么专业,我只是把我的功能代码 ...
那怕是涉及到了堆栈平衡了把,挂起程序,然后记录eip,执行你的代码,然后再恢复是吧 w759003376 发表于 2024-5-31 14:25
那怕是涉及到了堆栈平衡了把,挂起程序,然后记录eip,执行你的代码,然后再恢复是吧
这个看具体需求的,我的写法更偏向hook一点,侵入性一般,主要是在目标程序上进行功能扩展,保证平栈就行,没有那么复杂
页:
[1]