CreateRemoteThread 创建远程线程

guosheng1987 2009-05-14 11:18:15
// 向目标进程地址空间写入DLL名称    
DWORD dwSize, dwWritten;
dwSize = lstrlenA( lpszDll ) + 1;
LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );
if ( NULL == lpBuf )
{
CloseHandle( hProcess );
// 失败处理
}
if ( WriteProcessMemory( hProcess, lpBuf, (LPVOID)lpszDll, dwSize, &dwWritten ) )
{
// 要写入字节数与实际写入字节数不相等,仍属失败
if ( dwWritten != dwSize )
{
VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
CloseHandle( hProcess );
// 失败处理
}
}
else
{
CloseHandle( hProcess );
// 失败处理
}
HMODULE hInstLibrary = LoadLibrary(INJECT_DLL);
CreateRemoteThread(hProcess, NULL, 0, LPTHREAD_START_ROUTINE(hInstLibrary), lpBuf, 0, &lpThreadId);




这是把dll注入远程进程的一段代码

有一点不懂的地方
这个dwSize 我需要分配多大内存? 用于存储什么东西?

是存储dll的名称吗?








...全文
143 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gust2012 2009-05-15
  • 打赏
  • 举报
回复
3楼讲的很明白了
dwSize 需要分配的内存是 DLL实际路径名的长度+1,+1是为了包含\0 ,表示字符串结束。

  • 打赏
  • 举报
回复
dwSize = lstrlenA( lpszDll ) + 1;
LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );

你要注入一个DLL到其他进程,就必须调用LoadLib...函数来加载你的DLL文件名称,才能起到在目标进程中注入DLL的目的
因此,你需要把DLL的文件名写入到目标进程的一块空间内

dwSize = lstrlenA( lpszDll ) + 1; //dwSize为你的DLL文件名+1(用于包含\0)
LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );
从由hProcess指定的进程中分配一快虚存,大小为你的DLL文件名+1

WriteProcessMemory( hProcess, lpBuf, (LPVOID)lpszDll, dwSize, &dwWritten )
向你刚才申请的空间内写入要被加载的DLL文件名称路径

CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibrary, lpBuf, 0, &lpThreadId);

让目标进程启动一个远程线程,将LoadLibrary的函数指针传入其中(当然这个指针地址也应该是目标进程虚存对应的地址),线程参数就是你写入的文件名。这样说你明白了么?
  • 打赏
  • 举报
回复
如果你要远程执行函数,那么那个函数必须在目标进程内存在,申请的空间大小自然是你需要执行的函数的参数大小,另外你传给目标进程的函数指针也必须是目标进程内的地址,不是你在你的进程内写个函数,让目标进程执行。


guosheng1987 2009-05-15
  • 打赏
  • 举报
回复
如果 不是调用dll而是调用远程线程函数

我应该分配多大空间呢



还有创建线程调用dll,或者是调用其他的线程函数,

主要是通过CreateRemoteThread的第三个参数函数的入口指针找到函数,然后实现这个函数,这么理解没有错吧
qq845284425 2009-05-15
  • 打赏
  • 举报
回复

学习
greatws 2009-05-15
  • 打赏
  • 举报
回复
这个dwSize 我需要分配多大内存? 用于存储什么东西?

dwSize是要注入的DLL绝对路径长度外加'\0',你分261肯定够了,因为最大路径是260,不过如果是UNICODE的话,要扩大一倍
hurryboylqs 2009-05-14
  • 打赏
  • 举报
回复
dwSize就是一页的大小吧,4K

const DWORD THREADSIZE=1024*4;
HANDLE pRemoteThread,hRemoteProcess;
PTHREAD_START_ROUTINE pfnAddr = NULL;
DWORD pId = 0;
void *pFileRemote = NULL;

HWND hWinPro=::FindWindow("XXX",NULL); //取窗体句柄
if(!hWinPro)
{

return 0;

}
else
{
::GetWindowThreadProcessId(hWinPro,&pId); //获取目标句柄的PID
hRemoteProcess=::OpenProcess(PROCESS_ALL_ACCESS,false,pId); //打开进程
pFileRemote=::VirtualAllocEx(hRemoteProcess,0,THREADSIZE,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);//分配内存空间
if(!::WriteProcessMemory(hRemoteProcess,pFileRemote,"d:\\RemoteDll.dll",THREADSIZE,NULL))
return;
pfnAddr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA"); //获取API地址
pRemoteThread=::CreateRemoteThread(hRemoteProcess,NULL,0,pfnAddr,pFileRemote,0,NULL);//注入线程
if(pRemoteThread==NULL)
return;
else MessageBox("success!"); //注入成功
}
}



guosheng1987 2009-05-14
  • 打赏
  • 举报
回复
CreateRemoteThread

我从目标进程创建的远程线程,

我需要知道远程线程的函数地址也就是LPTHREAD_START_ROUTINE,

那么我为目标进程分配的一块空间里面到底是存储了什么?

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧