一个远线程的问题!请高手指教!!

tob 2003-12-28 03:40:21
想在一个进程里面注入自己的函数和dll,我参考了一些程序,可以运行自己的线程,但本来的进程出错了,导致退出,什么回事呢?
程序:
DWORD __stdcall ThreadProc (RemotePara *lpPara){ //自己的线程, 打开一个messagebox
typedef int (__stdcall * MMessageBoxA)(HWND,LPCTSTR,LPCTSTR,DWORD);//定义MessageBox函数
MMessageBoxA myMessageBoxA;
myMessageBoxA =(MMessageBoxA)lpPara->dwMessageBox ;//得到函数入口地址
myMessageBoxA(NULL,lpPara->pMessageBox ,lpPara->pMessageBox,0);//call
return 0;
}
bool CRemoteDlg::OnInstall()
{
// TODO: Add your control notification handler code here
const DWORD THREADSIZE=1024*3;
DWORD byte_write;
//EnableDebugPriv();//提升权限
HANDLE hWnd = ::OpenProcess (PROCESS_ALL_ACCESS,FALSE,1344);
if(!hWnd)return 0;
void *pRemoteThread =::VirtualAllocEx(hWnd,0,THREADSIZE,MEM_COMMIT| MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if(!pRemoteThread)return 0;
if(!::WriteProcessMemory(hWnd,pRemoteThread,&ThreadProc,THREADSIZE,0))
return 0;

//再付值
RemotePara myRemotePara;
::ZeroMemory(&myRemotePara,sizeof(RemotePara));
HINSTANCE hUser32 = ::LoadLibrary ("user32.dll");
myRemotePara.dwMessageBox =(DWORD) ::GetProcAddress (hUser32 , "MessageBoxA");
strcat(myRemotePara.pMessageBox,"hello\0");
//写进目标进程
RemotePara *pRemotePara =(RemotePara *) ::VirtualAllocEx (hWnd ,0,sizeof(RemotePara),MEM_COMMIT,PAGE_READWRITE);//注意申请空间时的页面属性
if(!pRemotePara)return 0;
if(!::WriteProcessMemory (hWnd ,pRemotePara,&myRemotePara,sizeof myRemotePara,0))return 0;

//启动线程
HANDLE hThread = ::CreateRemoteThread (hWnd ,0,0,(DWORD (__stdcall *)(void *))pRemoteThread ,pRemotePara,0,&byte_write);
if(!hThread){

return 0;
}

return 0;


}
可以建立远线程,但本来的进程出错了,是什么回事呢?有没有例子?
...全文
88 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
tob 2003-12-28
  • 打赏
  • 举报
回复
ok,谢了!!! jruv(江城飞鸿)
jruv 2003-12-28
  • 打赏
  • 举报
回复
如果再不行就是你的OS的问题了,我也没辙了!
jruv 2003-12-28
  • 打赏
  • 举报
回复
刚刚调试通过的,没有任何问题啊

#include "stdafx.h"
#include "windows.h"

typedef struct _RemotePara{//参数结构
char pMessageBox[12];
DWORD dwMessageBox;
}RemotePara;

//提升权限
void EnableDebugPriv( void )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;

if ( ! OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return;
if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){
CloseHandle( hToken );
return;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
CloseHandle( hToken );
}

DWORD __stdcall ThreadProc (RemotePara *lpPara){ //自己的线程, 打开一个messagebox
typedef int (__stdcall * MMessageBoxA)(HWND,LPCTSTR,LPCTSTR,DWORD);//定义MessageBox函数
MMessageBoxA myMessageBoxA;
myMessageBoxA =(MMessageBoxA)lpPara->dwMessageBox ;//得到函数入口地址
myMessageBoxA(NULL,lpPara->pMessageBox ,lpPara->pMessageBox,0);//call
return 0;
}
Inject()
{
// TODO: Add your control notification handler code here
const DWORD THREADSIZE=1024*3;
DWORD byte_write;
EnableDebugPriv();//提升权限
HANDLE hWnd = ::OpenProcess (PROCESS_ALL_ACCESS,FALSE,1776);
if(!hWnd)return 0;
void *pRemoteThread =::VirtualAllocEx(hWnd,0,THREADSIZE,MEM_COMMIT| MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if(!pRemoteThread)return 0;
if(!::WriteProcessMemory(hWnd,pRemoteThread,&ThreadProc,THREADSIZE,0))
return 0;

//再付值
RemotePara myRemotePara;
::ZeroMemory(&myRemotePara,sizeof(RemotePara));
HINSTANCE hUser32 = ::LoadLibrary ("user32.dll");
myRemotePara.dwMessageBox =(DWORD) ::GetProcAddress (hUser32 , "MessageBoxA");
strcat(myRemotePara.pMessageBox,"hello\0");
//写进目标进程
RemotePara *pRemotePara =(RemotePara *) ::VirtualAllocEx (hWnd ,0,sizeof(RemotePara),MEM_COMMIT,PAGE_READWRITE);//注意申请空间时的页面属性
if(!pRemotePara)return 0;
if(!::WriteProcessMemory (hWnd ,pRemotePara,&myRemotePara,sizeof myRemotePara,0))return 0;

//启动线程
HANDLE hThread = ::CreateRemoteThread (hWnd ,0,0,(DWORD (__stdcall *)(void *))pRemoteThread ,pRemotePara,0,&byte_write);
if(!hThread){

return 0;
}
return 0;
}

int main(int argc, char* argv[])
{
Inject();
}
tob 2003-12-28
  • 打赏
  • 举报
回复
to jruv(江城飞鸿) 出现了对话框了,但就是本来的进程崩溃了
jruv 2003-12-28
  • 打赏
  • 举报
回复
提出对话筐???
有没有显示出你的MessageBox对话框阿?
tob 2003-12-28
  • 打赏
  • 举报
回复
我把线程插入ie的进程里面,提出对话筐,但是ie的进程崩溃了,出现不能read (地址)
jruv 2003-12-28
  • 打赏
  • 举报
回复
将执行后的现象详细的说明一下吧
tob 2003-12-28
  • 打赏
  • 举报
回复
其实我也不懂这个线程要多大的空间,我把它的空间放大了也出错,但远程线程是执行了,
jruv 2003-12-28
  • 打赏
  • 举报
回复
const DWORD THREADSIZE=1024*3如何得出的阿?
你怎么知道这个线程体是占这么大的空间?
改大点试试!

顺便问一句你是写入的哪个进程阿,没有gdi调用的进程是不能注入的(简单说就是没有图形界面的,当然这只是必要条件而非充分条件),因为它没有用到
user32.dll,自然你的MessageBox地址就无效了。
蒋晟 2003-12-28
  • 打赏
  • 举报
回复
http://www.csdn.net/develop/read_article.asp?id=15645
tob 2003-12-28
  • 打赏
  • 举报
回复
to jruv(江城飞鸿) 提升了权限也不行啊,应该是地址的问题,但不知道怎样改才行?
jruv 2003-12-28
  • 打赏
  • 举报
回复
你为什么把提升权限注释掉了;
//EnableDebugPriv();
//提升权限这一句很重要的阿
jruv 2003-12-28
  • 打赏
  • 举报
回复
不好意思,刚才没仔细看,其实你已经把线程体考过去了.
tob 2003-12-28
  • 打赏
  • 举报
回复
to jruv(江城飞鸿) 怎样改呢?
jruv 2003-12-28
  • 打赏
  • 举报
回复
HANDLE hThread = ::CreateRemoteThread (hWnd ,0,0,(DWORD (__stdcall *)(void *))pRemoteThread ,pRemotePara,0,&byte_write);
这句中的pRemoteThread是本地函数指针,在远程线程中不知道指到什么地方去了.
jruv 2003-12-28
  • 打赏
  • 举报
回复
你还未把ThreadProc函数体写入远进程阿;只是将参数拷贝过去了,
但函数还在本地进程阿,远程线程执行本地函数当然要出错的,根本就找不到这个函数,当然要崩溃了.
蒋晟 2003-12-28
  • 打赏
  • 举报
回复
一个进程中的地址在其他进程中通常是无效的
HINSTANCE hUser32 = ::LoadLibrary ("user32.dll");
这些放到远程线程里面去看看

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧