Odyssey
驱动小牛
驱动小牛
  • 注册日期2004-12-15
  • 最后登录2008-03-29
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望115点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
阅读:1480回复:8

调用CreateRemoteThread的问题

楼主#
更多 发布于:2005-03-01 13:55
为什么用CreateRemoteThread注册的ThreadProc执行完一个函数调用后总是得到一个access violation的异常呢?那位大虾有成功运行ThreadProc的完整的例子?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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.
这个条件满足吗?
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-01 17:52
线程的参数必须得在Remote Process分配空间的。
你用CreateRemoteThread要实现什么功能,是注入DLL吗,代码贴出来看看。


[编辑 -  3/1/05 by  fslife]
在交流中学习。。。
Odyssey
驱动小牛
驱动小牛
  • 注册日期2004-12-15
  • 最后登录2008-03-29
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望115点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
地板#
发布于: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]
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于: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去掉即可.
附件名称/大小 下载次数 最后更新
2005-03-02_remote.rar (1063KB)  4
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-02 10:21
wowocock说的没错,就是Debug版本的时候,cbSize的结果是错的
cbSize=LPBYTE)RemoteThreadEnd-(LPBYTE)RemoteThread;
我跟踪了一下,Debug下有时候会出现 RemoteThreadEnd < RemoteThread。


[编辑 -  3/2/05 by  fslife]
在交流中学习。。。
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-02 11:54
To wowocock:
#pragma check_stack (off)
的作用不就是关闭这个堆栈检测的吗,为什么会没有作用?
在交流中学习。。。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2005-03-02 23:28
没测试过,你测试有用吗???
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Odyssey
驱动小牛
驱动小牛
  • 注册日期2004-12-15
  • 最后登录2008-03-29
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望115点
  • 贡献值0点
  • 好评度115点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-03-03 10:49
多谢各位,送分了。
游客

返回顶部