| 
			 
					阅读:1658回复:8
				 
				调用CreateRemoteThread的问题
					为什么用CreateRemoteThread注册的ThreadProc执行完一个函数调用后总是得到一个access violation的异常呢?那位大虾有成功运行ThreadProc的完整的例子?				 
							 | 
	|
| 
			 沙发# 
								发布于:2005-03-01 15:45				
			
					hProcess
 
							Identifies the process in which the thread is to be created. Windows NT: The handle must have PROCESS_CREATE_THREAD access. 这个条件满足吗?  | 
	|
					
						
  | 
	
| 
			 板凳# 
								发布于:2005-03-01 17:52				
			
					线程的参数必须得在Remote Process分配空间的。
 
							你用CreateRemoteThread要实现什么功能,是注入DLL吗,代码贴出来看看。 [编辑 - 3/1/05 by fslife]  | 
	|
					
						
  | 
	
| 
			 地板# 
								发布于:2005-03-02 00:46				
			
					就是这样,简化了一下,比如只是弹出一个MsgBox,但是只要点确定后就会出错。
 
							#include <Windows.h> #define GetFunc(hModule, FuncName, pFuncAddress) \\ *(FARPROC *) pFuncAddress=GetProcAddress(hModule,FuncName); typedef struct _tagREMOTEDATA { char szText[MAX_PATH]; LPVOID _MessageBoxA; } REMOTEDATA, *LPREMOTEDATA; typedef int (WINAPI *tMessageBoxA)(HWND, LPSTR, LPSTR, UINT); REMOTEDATA RemoteData; #pragma check_stack (off) DWORD WINAPI RemoteThread(LPVOID lpParameter) { LPREMOTEDATA p=(LPREMOTEDATA)lpParameter; ((tMessageBoxA)p->_MessageBoxA)(NULL,p->szText,p->szText,MB_OK); return 0; } static VOID RemoteThreadEnd(void) {} #pragma check_stack int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { PROCESS_INFORMATION pi; STARTUPINFO si={0}; HMODULE hUser32=LoadLibrary(\"user32.dll\"); GetFunc(hUser32,\"MessageBoxA\",&RemoteData._MessageBoxA); strcpy(RemoteData.szText,\"Hello\"); if(0) //debug RemoteThread RemoteThread(&RemoteData); if(!CreateProcess(\"C:\\\\Windows\\\\notepad.exe\",NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) { MessageBox(NULL,\"Error running notepad.exe\",\"Error\",MB_OK | MB_ICONERROR); return FALSE; } const DWORD cbSize=(LPBYTE)RemoteThreadEnd-(LPBYTE)RemoteThread; LPVOID pCode=VirtualAllocEx(pi.hProcess,NULL,cbSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE); LPVOID pData=VirtualAllocEx(pi.hProcess,NULL,sizeof(RemoteData),MEM_COMMIT, PAGE_EXECUTE_READWRITE); DWORD cbSizeWrite=0; BOOL bRes=WriteProcessMemory(pi.hProcess,pCode,RemoteThread,cbSize,&cbSizeWrite); bRes=WriteProcessMemory(pi.hProcess,pData,(LPVOID)&RemoteData,sizeof(RemoteData),&cbSizeWrite); HANDLE hThread=CreateRemoteThread(pi.hProcess, NULL,0,(LPTHREAD_START_ROUTINE)pCode,pData,0,NULL); WaitForSingleObject(hThread, INFINITE); VirtualFreeEx(pi.hProcess,pData,0,MEM_RELEASE); VirtualFreeEx(pi.hProcess,pCode,0,MEM_RELEASE); FreeLibrary(hUser32); return 0; } [编辑 - 3/2/05 by Odyssey]  | 
	|
| 
			 地下室# 
								发布于:2005-03-02 09:57				
			
					呵呵,和我遇到同样的问题,你把程序编译为RELEASE版本就没问题了.
 
							因为在DEBUG版本下,系统会默认在每个函数后面调用一个堆栈检测函数,而你远线程了以后,该堆栈检测函数还是你本地的地址,当然就不对拉. 或者在DEBUG下把编译选项中的 /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /Gm /EHsc /RTC1 /MLd /Fo\"Debug/\" /Fd\"Debug/vc70.pdb\" /W3 /nologo /c /Wp64 /ZI /TP /RTC1 RUN TIME CHECK STACK去掉即可.  | 
	|
					
 
  | 
	
| 
			 5楼# 
								发布于:2005-03-02 10:21				
			
					wowocock说的没错,就是Debug版本的时候,cbSize的结果是错的
 
							cbSize=LPBYTE)RemoteThreadEnd-(LPBYTE)RemoteThread; 我跟踪了一下,Debug下有时候会出现 RemoteThreadEnd < RemoteThread。 [编辑 - 3/2/05 by fslife]  | 
	|
					
						
  | 
	
| 
			 6楼# 
								发布于:2005-03-02 11:54				
			
					To wowocock:
 
							#pragma check_stack (off) 的作用不就是关闭这个堆栈检测的吗,为什么会没有作用?  | 
	|
					
						
  | 
	
| 
			 7楼# 
								发布于:2005-03-02 23:28				
			
					没测试过,你测试有用吗???				 
							 | 
	|
					
						
  | 
	
| 
			 8楼# 
								发布于:2005-03-03 10:49				
			
					多谢各位,送分了。				 
							 | 
	|