int __stdcall WINAPI MyFunc (LPVOID lpram)
{ RemoteParam *prp = (RemoteParam*)lpram;
PFN_MESSAGEBOX MY_MessageBox = (PFN_MESSAGEBOX)prp->dwMessageBox;
MY_MessageBox(NULL,prp->szMsg,prp->szMsg,0);
return 0;
} void AfterMyFunc (void)
{
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
///获得进程pid
HWND hStart = ::FindWindow ("Notepad",NULL);
DWORD PID,TID;
///打开进程空间
TID = ::GetWindowThreadProcessId (hStart, &PID);HANDLE hProcess;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,PID);
///在目标进程中为需要插入的线程分配代码空间,并写入
DWORD cbCodeSize=((LPBYTE) AfterMyFunc - (LPBYTE) MyFunc);
PDWORD pCodeRemote = (PDWORD) VirtualAllocEx( hProcess, 0, cbCodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
WriteProcessMemory( hProcess, pCodeRemote, &MyFunc, cbCodeSize, NULL);
//将函数messagebox地址,还有用到的变量写到目标进程中
RemoteParam remoteData;
ZeroMemory(&remoteData, sizeof(RemoteParam));//填充结构体变量中的成员
HINSTANCE hUser32 = LoadLibrary("User32.dll");
remoteData.dwMessageBox = (DWORD)GetProcAddress(hUser32, "MessageBoxA");
strcat(remoteData.szMsg, "Hello\0");//为线程参数在宿主进程中开辟存储区域
RemoteParam* pRemoteParam = (RemoteParam*)VirtualAllocEx(
hProcess , 0, sizeof(RemoteParam), MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess,
pRemoteParam, &remoteData, sizeof(remoteData), 0); ///在目标进程中启动线程
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)pCodeRemote,pRemoteParam, 0 , NULL);
}程序在MyFunc函数中调用MessageBox并将MyFunc作为一个线程 ,插入到Notepad中,运行时MessageBox对话框可以正常显示,但一旦MessageBox返回,宿主进程就回出错,哪位朋友帮我看看哪里出了问题???
{ RemoteParam *prp = (RemoteParam*)lpram;
PFN_MESSAGEBOX MY_MessageBox = (PFN_MESSAGEBOX)prp->dwMessageBox;
MY_MessageBox(NULL,prp->szMsg,prp->szMsg,0);
return 0;
} void AfterMyFunc (void)
{
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
///获得进程pid
HWND hStart = ::FindWindow ("Notepad",NULL);
DWORD PID,TID;
///打开进程空间
TID = ::GetWindowThreadProcessId (hStart, &PID);HANDLE hProcess;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,PID);
///在目标进程中为需要插入的线程分配代码空间,并写入
DWORD cbCodeSize=((LPBYTE) AfterMyFunc - (LPBYTE) MyFunc);
PDWORD pCodeRemote = (PDWORD) VirtualAllocEx( hProcess, 0, cbCodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
WriteProcessMemory( hProcess, pCodeRemote, &MyFunc, cbCodeSize, NULL);
//将函数messagebox地址,还有用到的变量写到目标进程中
RemoteParam remoteData;
ZeroMemory(&remoteData, sizeof(RemoteParam));//填充结构体变量中的成员
HINSTANCE hUser32 = LoadLibrary("User32.dll");
remoteData.dwMessageBox = (DWORD)GetProcAddress(hUser32, "MessageBoxA");
strcat(remoteData.szMsg, "Hello\0");//为线程参数在宿主进程中开辟存储区域
RemoteParam* pRemoteParam = (RemoteParam*)VirtualAllocEx(
hProcess , 0, sizeof(RemoteParam), MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess,
pRemoteParam, &remoteData, sizeof(remoteData), 0); ///在目标进程中启动线程
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)pCodeRemote,pRemoteParam, 0 , NULL);
}程序在MyFunc函数中调用MessageBox并将MyFunc作为一个线程 ,插入到Notepad中,运行时MessageBox对话框可以正常显示,但一旦MessageBox返回,宿主进程就回出错,哪位朋友帮我看看哪里出了问题???
解决方案 »
- VS2010把程序拷贝到桌面,debug没错,release出错
- menuitem 为什么不能变灰,不是popup
- === 高手求救 ,Telnet 问题 ===
- 在计算器的标题栏的中间加一个图标
- 欢迎讨论:用vc6.0应该装一个什么样的系统?
- 关于MFC的一点疑问,请高手指教。。。
- 奇怪问题,要求置顶,win32 Dynamic-link library 连接 sybase 数据库的问题,详细请进。
- SOS!! 硬盘的文件无法访问了!
- 初学:怎样更改API中系统定义好的右键菜单?
- C#会替代VC++吗?
- 商业软件中使用了LGPL/MPL两种许可证的代码,怎么在产品中作版权声明或者其他必须遵守的义务!?才能避免版权问题?
- WSASend最终无法完成的问题
typedef int (* PFN_MESSAGEBOX)(HWND, LPCTSTR, LPCTSTR, DWORD);
=================================================================
同意 Idle_ 由于参数调用规则不一致引起了堆栈错误,即函数可以正常调用(参数压栈正常),但返回时MESSAGEBOX已将参数堆栈释放掉,而使用typedef int (* PFN_MESSAGEBOX)(HWND, LPCTSTR, LPCTSTR, DWORD);则再次释放堆栈,造成错位,至此ret返回时跑到了错误的地址。
但不知道为何会出现这种情况??希望了解的朋友解释
2. DWORD cbCodeSize=((LPBYTE) AfterMyFunc - (LPBYTE) MyFunc);
会不会是你这里申请内存大小太小的问题? 尝试把这里大小改大点看看..比如4096
3. int __stdcall WINAPI MyFunc (LPVOID lpram)
在这里__stdcall = WINAPI ,你干吗要申明两次? int __stdcall MyFunc (LPVOID lpram)就可以了..
谢谢,马上给分