CreateRemoteThread如何调用?

FlyBeckham 2000-09-08 09:08:00
用CreateRemoteThread在另外一个进程(NotePad程序)插入线程ThreadFunc
源代码如下:
DWORD WINAPI ThreadFunc(PVOID pvParam)
{

::MessageBox(NULL,"Test",(PSTR)pvParam,MB_OK);
return 1;
}

void InjectThread(PCSTR pszTexts,PROC pfnThread)//pszTexts作为线程函数的参数
{
HANDLE hProcess=NULL,hThread=NULL;
PSTR pszTempTexts=NULL;
HWND hwndEdit=NULL,hwndNotepad;
DWORD dwProcessId=0,dwThreadId=0;
hwndNotepad=::FindWindow("NotePad",NULL);
if(!hwndNotepad)return;
hwndEdit=GetFirstChild(hwndNotepad);
/*GetFirstChild(hwnd) =::GetWindow(hwnd,GW_CHILD)*/
//hwndNotepad=AfxGetMainWnd()->m_hWnd;
dwThreadId=GetWindowThreadProcessId(hwndNotepad,&dwProcessId);
hProcess=OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE,FALSE,dwProcessId);
if(!hProcess)return;
int cb=(1+lstrlen(pszTexts));
pszTempTexts=(PSTR)VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
if(!pszTempTexts)return;
if(!(WriteProcessMemory(hProcess,pszTempTexts,(PVOID)pszTexts,cb,NULL)))return;
PROC *procWrite=(PROC *)VirtualAllocEx(hProcess,NULL,sizeof(pfnThread),MEM_COMMIT,PAGE_READWRITE);
if(!WriteProcessMemory(hProcess,procWrite,&pfnThread,sizeof(pfnThread),NULL))return;
hThread=CreateRemoteThread(hProcess,NULL,1024*1024,(PTHREAD_START_ROUTINE)(*procWrite),(PVOID)pszTempTexts,0,NULL);
if(hThread=NULL)return;
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
CloseHandle(hProcess);
}
当这样调用:InjectThread("Test",(PROC)ThreadFunc)出来内存访问违规(Access Violation!)到底错在哪里?如果远程进程换成本地线程则运行正常.
...全文
239 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
FlyBeckham 2000-09-09
  • 打赏
  • 举报
回复
可是我在OpenProcess已经指定对进程的操作
hProcess=OpenProcess(PROCESS_CREATE_THREAD ¦ PROCESS_VM_OPERATION ¦ PROCESS_VM_WRITE,FALSE,dwProcessId);
因此CreateRemoteThread调用中的第二个参数所指定的安全描述设为缺省的
Holly 2000-09-09
  • 打赏
  • 举报
回复
请注意CreateRemoteThread()有效的的前提是第一个参数指定的进程的句柄所拥有的安全描述是PROCESS_CREATE_THREAD, PROCESS_VM_OPERATION, PROCESS_VM_WRITE, 和PROCESS_VM_READ,否则你无法访问该进程;
用CreateRemoteThread()的方法跨进程,通常只用于自己编写的进程,大部分的其他应用程序是不允许这种操作的!
FlyBeckham 2000-09-09
  • 打赏
  • 举报
回复
多谢Holly的指导.
现在我换成用Hook 将DLL(线程函数在DLL中)插入进程的地址空间,CreateRemoteThread
成功调用。有什么函数能够直接将函数的执行体注入到目标线程?
Holly 2000-09-09
  • 打赏
  • 举报
回复
我猜想你在试验Advanced Windows中提到的跨进程代码,不过你没有领会Jeffrey Richter的意思,他的建议是利用LoadLibrary函数进行调用,将你的要注入的代码放到DLL中!
Holly 2000-09-09
  • 打赏
  • 举报
回复
我仔细的跟踪了一次,你在

if(!WriteProcessMemory(hProcess,procWrite,&pfnThread,sizeof(pfnThread),NULL))
return;

这一句中向目标进程写了线程的起始地址,但没有将线程的执行体注入到目标进程中,也就是说,你的sizeof(pfnThread)只写入了4个字节,此时在目标进程中就有了一个函数指针指向一个并不存在的函数执行体,当然会Access Violation!
而在本地进程,此地址指向的执行体是有效的!

16,467

社区成员

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

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

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