阅读:1480回复: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
多谢各位,送分了。
|
|