首页
社区
课程
招聘
[求助]关于远程线程注入
发表于: 2010-2-23 21:55 4261

[求助]关于远程线程注入

2010-2-23 21:55
4261
我写了个很简单的远程线程注入程序,注入PID为2515的进程,代码如下:
int __stdcall ThreadProc   (void   *lpPara){   
        //MessageBox(NULL,"hello","hello",0);
        //先定义参数结构   
        typedef   struct   _RemotePara{//参数结构   
                char   pMessageBox[12];   
                DWORD   dwMessageBox;   
        }RemotePara;   
        //赋值   
        RemotePara   myRemotePara;   
        ::ZeroMemory(&myRemotePara,sizeof(RemotePara));   
        HINSTANCE   hUser32   =   ::LoadLibrary   ("user32.dll");   
        myRemotePara.dwMessageBox   =(DWORD)   ::GetProcAddress   (hUser32   ,   "MessageBoxA");   
        strcat(myRemotePara.pMessageBox,"hello\0");   

        return   0;   
  }   

int   main(int   argc,   char*   argv[])
{
        const   DWORD   THREADSIZE=1024*4;//暂定线程体大小为4K
  DWORD   byte_write;   
  HANDLE   hWnd   =   ::OpenProcess   (PROCESS_ALL_ACCESS,FALSE,2515);  //打开PID为2515的进程
  if(!hWnd)
          printf("error OpenProcess!\n ");   

  void   *pRemoteThread   =::VirtualAllocEx(hWnd,0,THREADSIZE,MEM_COMMIT|   MEM_RESERVE,PAGE_EXECUTE_READWRITE);//在宿主进程中使用VirtualAllocEx函数申请一段内存   
  if(!pRemoteThread)
          printf("error VirtualAllocEx!\n");  
  if(!::WriteProcessMemory(hWnd,pRemoteThread,&ThreadProc,THREADSIZE,0))//写入宿主进程
          
  printf("error WriteProcessMemory!\n");
  //启动线程   
  HANDLE   hThread   =   ::CreateRemoteThread   (hWnd   ,0,0,(DWORD   (__stdcall   *)(void   *))pRemoteThread   ,NULL,0,&byte_write);   
  if(!hThread){   //还有内存分配未释放   
          printf("error CreateRemoteThread!\n");   
  }   
return 0;
}

编译通过没问题,但是每次运行,都导致了PID2515的进程终止,出现错误 提示。我不清楚是自己的程序出了问题,还是运行方法不对,还是windows自己的一种保护机制?我是用windowsXP+SP3。请指教。谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 460
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
函数ThreadProc 是在你的注入程序中编译的,其地址的偏移量是相对注入程序来说的。
直接COPY到要注入的程序后。地址自然不对了。。
OD调试下你的注入程序和被注入程序就能看到了。
2010-2-24 10:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没有直接拷贝啊
HINSTANCE   hUser32   =   ::LoadLibrary   ("user32.dll");   
  myRemotePara.dwMessageBox   =(DWORD)   ::GetProcAddress   (hUser32   ,   "MessageBoxA");
2010-2-24 19:57
0
雪    币: 445
活跃值: (25)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
你的ThreadProc里面调用的api都是要依靠当前进程的IAT来调用的,直接复制到别的进程这样调用当然会出错了,而且还有重定位的问题
2010-2-24 22:21
0
雪    币: 460
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
WriteProcessMemory(hWnd,pRemoteThread,&ThreadProc,THREADSIZE,0)
这就是直接把ThreadProc函数直接写过去的。。函数ThreadProc本身已经不对了。。

你可以用OD找到函数ThreadProc。。然后选中。二进制复制,再随便找一个地方粘上去看看是什么结果。。。
2010-2-25 08:53
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
楼上几位都解释的很好了
通俗的举个例子
ThreadProc 里面的一个 "user32.dll" 在这段函数代码里其实是一个字符串的地址 通过这个地址来查找这个字符串 显然这个字符串是本进程的  而你要注入到其他的进程 这段代码就要在其他的进程运行 显然找不到这个字符串
所以肯定会出错误咯
给你一个之前写过的例子,希望对你有所帮助
http://hi.baidu.com/blueapple_c/blog/item/a5ddeb2ad2de6ef1e7cd40ce.html
2010-2-25 09:18
0
游客
登录 | 注册 方可回帖
返回
//