为什么我的远程线程注入没有执行啊??? 50
我的程序有三个部分:1、主程序。2、钩子dll。3、注入dll程序执行思路:窗口上有一个按钮,单击了之后窗口会隐藏,然后设置了一个全局钩子,当按下home键的时候,就把当...
我的程序有三个部分:1、主程序。2、钩子dll。3、注入dll
程序执行思路:窗口上有一个按钮,单击了之后窗口会隐藏,然后设置了一个全局钩子,当按下home键的时候,就把当前进程句柄保存下来,然后向主程序发送WM_USER+100消息,进程句柄通过wParam传递,然后显示主程序,接着主程序收到这个消息,在远程进程中分配一块内存空间,写入注入dll的路径,然后创建远程线程,线程地址是LoadLibraryA的地址。注入dll的DLL_PROCESS_ATTACH中我只写了一个MessageBox,按理说远程线程创建了之后应该弹出一个消息框,但是没有,不知道原因
代码如下:
主程序----------------------------------------------------------------------
if(uMsg==WM_USER+100)
{
UnhookWindowsHookEx(hhook);
char chdir[MAX_PATH];
GetCurrentDirectory(MAX_PATH,chdir);
char chdll[]="\\search.dll";
memcpy(&chdir[strlen(chdir)],chdll,strlen(chdll)+1);
void* startaddress=VirtualAllocEx((HANDLE)wParam,0,strlen(chdir)+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if(!startaddress)
MessageBox(hwnd,"virtualalloc error","",0);
if(!WriteProcessMemory((HANDLE)wParam,startaddress,chdir,strlen(chdir)+1,0))
MessageBox(hwnd,"writeprocessmemory error","",0);
PTHREAD_START_ROUTINE pstart=(PTHREAD_START_ROUTINE)GetProcAddress(
GetModuleHandle("kernel32"),"LoadLibraryA");
HANDLE hthread=CreateRemoteThread(
(HANDLE)wParam,
0,
0,
pstart,
startaddress,
0,
0);
if(!hthread)
{
MessageBox(hwnd,"createremotethread error","",0);
VirtualFreeEx((HANDLE)wParam,startaddress,strlen(chdir)+1,MEM_RELEASE);
return 1;
}
WaitForSingleObject(hthread,INFINITE);
VirtualFreeEx((HANDLE)wParam,startaddress,strlen(chdir)+1,MEM_RELEASE);
return 1;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
} 展开
程序执行思路:窗口上有一个按钮,单击了之后窗口会隐藏,然后设置了一个全局钩子,当按下home键的时候,就把当前进程句柄保存下来,然后向主程序发送WM_USER+100消息,进程句柄通过wParam传递,然后显示主程序,接着主程序收到这个消息,在远程进程中分配一块内存空间,写入注入dll的路径,然后创建远程线程,线程地址是LoadLibraryA的地址。注入dll的DLL_PROCESS_ATTACH中我只写了一个MessageBox,按理说远程线程创建了之后应该弹出一个消息框,但是没有,不知道原因
代码如下:
主程序----------------------------------------------------------------------
if(uMsg==WM_USER+100)
{
UnhookWindowsHookEx(hhook);
char chdir[MAX_PATH];
GetCurrentDirectory(MAX_PATH,chdir);
char chdll[]="\\search.dll";
memcpy(&chdir[strlen(chdir)],chdll,strlen(chdll)+1);
void* startaddress=VirtualAllocEx((HANDLE)wParam,0,strlen(chdir)+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if(!startaddress)
MessageBox(hwnd,"virtualalloc error","",0);
if(!WriteProcessMemory((HANDLE)wParam,startaddress,chdir,strlen(chdir)+1,0))
MessageBox(hwnd,"writeprocessmemory error","",0);
PTHREAD_START_ROUTINE pstart=(PTHREAD_START_ROUTINE)GetProcAddress(
GetModuleHandle("kernel32"),"LoadLibraryA");
HANDLE hthread=CreateRemoteThread(
(HANDLE)wParam,
0,
0,
pstart,
startaddress,
0,
0);
if(!hthread)
{
MessageBox(hwnd,"createremotethread error","",0);
VirtualFreeEx((HANDLE)wParam,startaddress,strlen(chdir)+1,MEM_RELEASE);
return 1;
}
WaitForSingleObject(hthread,INFINITE);
VirtualFreeEx((HANDLE)wParam,startaddress,strlen(chdir)+1,MEM_RELEASE);
return 1;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
} 展开
2个回答
展开全部
进程句柄在不同进程间不通用。我猜测问题出在这里
你的wParam是通过DuplicateHandle复制过来的句柄吗?如果不是,那么你用不了这个句柄
如果是GetCurrentProcess获取的,那么通过消息送过来,这个句柄也还是Current Process。就有点像“今天”,到了“明天”以后“明天”也变成“今天”这种感觉。
你的wParam是通过DuplicateHandle复制过来的句柄吗?如果不是,那么你用不了这个句柄
如果是GetCurrentProcess获取的,那么通过消息送过来,这个句柄也还是Current Process。就有点像“今天”,到了“明天”以后“明天”也变成“今天”这种感觉。
更多追问追答
追问
我就是用GetCurrentProcess获取的啊,然后通过wParam传过来的,进程的句柄应该不会变吧?
追答
所以才不行啊。GetCurrentProcess你查查msdn里面怎么写的……
它返回的句柄表示的是“当前进程”,这个“当前”是带着走的。比如你在a.exe里调用的,它就代表a.exe这个进程,你把它发送到b.exe,它代表的含义就变成b.exe这个进程了。
不同进程间,句柄是不能通用的。
你需要DuplicateHandle函数,去看一下这个函数的用法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询