轻松玩转CreateRemoteThread (转载
2006-08-31 17:11
344 查看
CreateRemoteThread提供了一个在远程进程中执行代码的方法,就像代码长出翅膀飞到别处运行。本文将做一个入门介绍,希望对广大编程爱好者有所帮助。
先解释一下远程进程,其实就是要植入你的代码的进程,相对于你的工作进程(如果叫本地进程的话)它就叫远程进程,可理解为宿主。
首先介绍一下我们的主要工具CreateRemoteThread,这里先将函数原型简单介绍以下。
CreateRemoteThread可将线程创建在远程进程中。
函数原型
HANDLE CreateRemoteThread(
HANDLE hProcess, // handle to process
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);
参数说明:
hProcess
[输入] 进程句柄
lpThreadAttributes
[输入] 线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针
dwStackSize
[输入] 线程栈大小,以字节表示
lpStartAddress
[输入] 一个LPTHREAD_START_ROUTINE类型的指针,指向在远程进程中执行的函数地址
lpParameter
[输入] 传入参数
dwCreationFlags
[输入] 创建线程的其它标志
lpThreadId
[输出] 线程身份标志,如果为NULL,则不返回
返回值
成功返回新线程句柄,失败返回NULL,并且可调用GetLastError获得错误值。
接下来我们将以两种方式使用CreateRemoteThread,大家可以领略到CreateRemoteThread的神通,它使你的代码可以脱离你的进程,植入到别的进程中运行。
先解释一下远程进程,其实就是要植入你的代码的进程,相对于你的工作进程(如果叫本地进程的话)它就叫远程进程,可理解为宿主。
首先介绍一下我们的主要工具CreateRemoteThread,这里先将函数原型简单介绍以下。
CreateRemoteThread可将线程创建在远程进程中。
函数原型
HANDLE CreateRemoteThread(
HANDLE hProcess, // handle to process
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);
参数说明:
hProcess
[输入] 进程句柄
lpThreadAttributes
[输入] 线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针
dwStackSize
[输入] 线程栈大小,以字节表示
lpStartAddress
[输入] 一个LPTHREAD_START_ROUTINE类型的指针,指向在远程进程中执行的函数地址
lpParameter
[输入] 传入参数
dwCreationFlags
[输入] 创建线程的其它标志
lpThreadId
[输出] 线程身份标志,如果为NULL,则不返回
返回值
成功返回新线程句柄,失败返回NULL,并且可调用GetLastError获得错误值。
接下来我们将以两种方式使用CreateRemoteThread,大家可以领略到CreateRemoteThread的神通,它使你的代码可以脱离你的进程,植入到别的进程中运行。
第一种方式 | ||
第一种方式,我们使用函数的形式。即我们将自己程序中的一个函数植入到远程进程中。 步骤1:首先在你的进程中创建函数MyFunc,我们将把它放在另一个进程中运行,这里以windows 计算器为目标进程。 static DWORD WINAPI MyFunc (LPVOID pData) { //do something //... //pData输入项可以是任何类型值 //这里我们会传入一个DWORD的值做示例,并且简单返回 return *(DWORD*)pData; } static void AfterMyFunc (void) { } 这里有个小技巧,定义了一个static void AfterMyFunc (void);为了下面确定我们的代码大小 步骤2:定位目标进程,这里是一个计算器 HWND hStart = ::FindWindow (TEXT("SciCalc"),NULL); 步骤3:获得目标进程句柄,这里用到两个不太常用的函数(当然如果经常做线程/进程等方面的 项目的话,就很面熟了),但及有用 DWORD PID, TID; TID = ::GetWindowThreadProcessId (hStart, &PID); HANDLE hProcess; hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,PID); 步骤4:在目标进程中配变量地址空间,这里我们分配10个字节,并且设定为可以读 写PAGE_READWRITE,当然也可设为只读等其它标志,这里就不一一说明了。 char szBuffer[10]; *(DWORD*)szBuffer=1000;//for test void *pDataRemote =(char*) VirtualAllocEx( hProcess, 0, sizeof(szBuffer), MEM_COMMIT, PAGE_READWRITE ); 步骤5:写内容到目标进程中分配的变量空间 ::WriteProcessMemory( hProcess, pDataRemote, szBuffer,(sizeof(szBuffer),NULL); 步骤6:在目标进程中分配代码地址空间 计算代码大小 DWORD cbCodeSize=((LPBYTE) AfterMyFunc - (LPBYTE) MyFunc); 分配代码地址空间 PDWORD pCodeRemote = (PDWORD) VirtualAllocEx( hProcess, 0, cbCodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE ); 步骤7:写内容到目标进程中分配的代码地址空间 WriteProcessMemory( hProcess, pCodeRemote, &MyFunc, cbCodeSize, NULL); 步骤8:在目标进程中执行代码 HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE) pCodeRemote, pDataRemote, 0 , NULL); DWORD h; if (hThread) { ::WaitForSingleObject( hThread, INFINITE ); ::GetExitCodeThread( hThread, &h ); TRACE("run and return %d/n",h); ::CloseHandle( hThread ); } 这里有几个值得说明的地方: 使用WaitForSingleObject等待线程结束; 使用GetExitCodeThread获得返回值; 最后关闭句柄CloseHandle。 步骤9:清理现场 释放空间 ::VirtualFreeEx( hProcess, pCodeRemote, cbCodeSize,MEM_RELEASE ); ::VirtualFreeEx( hProcess, pDataRemote, cbParamSize,MEM_RELEASE ); 关闭进程句柄 ::CloseHandle( hProcess );
|
相关文章推荐
- 轻松玩转CreateRemoteThread
- 轻松玩转CreateRemoteThread,让你的代码长出翅膀(转)
- 轻松玩转CreateRemoteThread,让你的代码长出翅膀
- 轻松玩转CreateRemoteThread
- 轻松玩转CreateRemoteThread,让你的代码长出翅膀
- 轻松玩转CreateRemoteThread,让你的代码长出翅膀
- (转载)CreateRemoteThread (代码注入)
- CreateRemoteThread的使用(转载)
- CreateRemoteThread的使用(转载)
- CreateRemoteThread的使用(转载)
- CreateRemoteThread 直接注入代码执行
- CreateRemoteThread 远程注入
- CreateRemoteThread简单应用之二
- [Delphi]利用createRemoteThread远程注入(非DLL插入)
- 《Windows API巡礼》--CreateRemoteThread和WriteProcessMemory
- 在Delphi中利用CreateRemoteThread远程注入例子
- CreateRemoteThread API 函数心得
- createremotethread()远程注入dll
- A brief on using CreateRemoteThread
- CreateRemoteThread简单应用