CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

DLL插入问题

楼主sunxysong(寒羽)2005-08-02 08:51:59 在 VC/MFC / 进程/线程/DLL 提问

自己写了一个简单的DLL文件,只用于简单的测试.我想将这个DLL文件插入到另外的进程中去运行,其结果应该是能看到一个提示窗口.  
  我在网上查了一些资料,使用了如下代码注入到别的进程后,但是并没有提示窗口的出现,问题大概出在没有调用导出的ShowMe()函数(ShowMe()为DLL中唯一的导出函数).  
   
  请教:我如何在将DLL插入到别的进程后,再调用其中的导出函数,使其正常工作?  
   
  //////////////////////////////////////////////////////////////////////////////  
  DLL的主要源码如下(其中ShowMe()为唯一的导出函数):  
   
  #include   "dll.h"  
  #include   <windows.h>  
  #include   <stdio.h>  
  #include   <stdlib.h>  
   
  DLLIMPORT   void   ShowMe   ()  
  {  
          MessageBox   (0,   "Injected!\n",   "Notice",   MB_OK);  
  }  
   
   
  BOOL   APIENTRY   DllMain   (HINSTANCE   hInst           /*   Library   instance   handle.   */   ,  
                                                DWORD   reason                 /*   Reason   this   function   is   being   called.   */   ,  
                                                LPVOID   reserved           /*   Not   used.   */   )  
  {  
          switch   (reason)  
          {  
              case   DLL_PROCESS_ATTACH:  
                  break;  
   
              case   DLL_PROCESS_DETACH:  
                  break;  
   
              case   DLL_THREAD_ATTACH:  
                  break;  
   
              case   DLL_THREAD_DETACH:  
                  break;  
          }  
   
          /*   Returns   TRUE   on   success,   FALSE   on   failure   */  
          return   TRUE;  
  }  
   
  //////////////////////////////////////////////////////////////////////////  
   
  主程序的主要源码如下(主程序EXE和要注入的DLL在同一目录下):  
   
   
  #include   "stdafx.h"  
  #include   <stdlib.h>  
   
  int   APIENTRY   WinMain(HINSTANCE   hInstance,  
                                            HINSTANCE   hPrevInstance,  
                                            LPSTR           lpCmdLine,  
                                            int               nCmdShow)  
  {  
  //得到主程序也就是DLL的绝对路径  
  LPTSTR   path=(LPTSTR)malloc(255);  
  GetCurrentDirectory(255,path);  
   
  strcat((char   *)path,"\\dllpro.dll");  
    char   *FullName   =   (char   *)path;  
           
          //如果是要打开系统进程,还要先申请debug权限  
          //申请权限部分略......  
   
          HANDLE   hRemoteProcess   =   NULL;  
   
   
  //被注入的进程ID假设为688  
  if   ((hRemoteProcess   =   OpenProcess(PROCESS_CREATE_THREAD   |   //允许远程创建线程    
  PROCESS_VM_OPERATION   |   //允许远程VM操作    
  PROCESS_VM_WRITE   |     //允许远程VM写  
  PROCESS_VM_READ,         //允许远程VM读  
  0,    
  688))   ==   NULL)  
  {  
  //debug--  
  MessageBox(NULL,"打开进程失败!","信息",MB_OK);  
                  return   1;  
  }  
   
  char   *pDllName   =   NULL;  
   
  if   ((pDllName   =   (char   *)VirtualAllocEx(   hRemoteProcess,    
  NULL,    
  lstrlen(FullName)   +   1,    
  MEM_COMMIT,    
  PAGE_READWRITE))   ==   NULL)  
  {  
                  CloseHandle(hRemoteProcess);  
  return   1;  
  }  
   
  //使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间    
  if   (WriteProcessMemory(hRemoteProcess,    
  pDllName,    
  FullName,    
  lstrlen(FullName),    
  NULL)   ==   0)  
  {  
                  VirtualFreeEx(hRemoteProcess,pDllName,0,MEM_RELEASE);  
                  CloseHandle(hRemoteProcess);  
                  return   1;  
  }  
   
  //计算LoadLibraryA的入口地址  
  PTHREAD_START_ROUTINE   pfnStartAddr   =   NULL;  
   
  if   ((pfnStartAddr   =   (PTHREAD_START_ROUTINE)GetProcAddress(  
  GetModuleHandle(TEXT("kernel32")),   "LoadLibraryA"))   ==   NULL)  
  {  
                  VirtualFreeEx(hRemoteProcess,pDllName,0,MEM_RELEASE);  
                  CloseHandle(hRemoteProcess);  
   
                  return   1;  
  }  
   
   
  DWORD   ThreadId   =   0;  
  HANDLE   Result=0;  
   
  //这里好像并未执行DLL中的导出函数?  
  //那创建的线程执行的是什么?  
          Result= CreateRemoteThread(hRemoteProcess,   //被嵌入的远程进程    
  NULL,  
  0,    
  pfnStartAddr,     //LoadLibraryA的入口地址    
  pDllName,      
  0,    
  &ThreadId);  
   
          CloseHandle(hRemoteProcess);  
   
   
       
  free(path);  
   
  return   0;  
  }  
   
   
  /////////////////////////////////////////////////////////////////////////////  
  请问:以上代码中如何使CreateRemoteThread()函数执行DLL中的导出函数?  
   
   
  急切盼望各位大侠解答!!! 问题点数:20、回复次数:16Top

1 楼sunxysong(寒羽)回复于 2005-08-02 08:54:47 得分 0

自己顶一下Top

2 楼linestyle(linestyle)回复于 2005-08-02 09:26:51 得分 0

你在什么调用了ShowMe   函数啊??Top

3 楼surstar(我要写个操作系统出来……)回复于 2005-08-02 09:58:42 得分 10

case   DLL_PROCESS_ATTACH:  
                  ShowMe();  
                  break;  
   
  试一下  
   
  CreateRemoteThread()是让目标进程创建新线程,新线程地址就是第四个参数Top

4 楼sunxysong(寒羽)回复于 2005-08-03 16:01:39 得分 0

我去试一下.顺便问一下,如何得到CreateRemoteThread()创建的线程函数的返回值?(是线程函数的返回值)Top

5 楼Areslee(懒虫易水)回复于 2005-08-04 17:39:35 得分 0

参考MSDN。。。。。。Top

6 楼sunxysong(寒羽)回复于 2005-08-06 15:25:03 得分 0

to   Areslee(懒虫易水)  
  能给出MSDN该问题的具体地址吗?谢谢Top

7 楼sunxysong(寒羽)回复于 2005-08-11 14:34:28 得分 0

再一次求教Top

8 楼nf3()回复于 2005-08-11 15:10:28 得分 0

如何向CSRSS.EXE进程插入一个DLL   ?Top

9 楼nf3()回复于 2005-08-11 15:14:59 得分 0

你必须确定你的DLL中的导出函数在你插入的进程中的地址,才能用CreateRemoteThread()Top

10 楼nanfeng231(木木)回复于 2005-08-11 17:54:41 得分 5

应该不会调用,除非DLL_PROCESS_ATTACH下调用Top

11 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2005-08-11 23:59:38 得分 5

DLL加载的时候,可以捕获到DLL_PROCESS_ATTACH  
   
  case   DLL_PROCESS_ATTACH:  
                  ShowMe();  
                  break;  
   
  在这里加入你的函数,这样,DLL在加载的时候,就可以执行你的ShowMe();了。呵呵。Top

12 楼mjcom(不明飞行物)回复于 2005-08-12 08:01:12 得分 0

...............Top

13 楼Areslee(懒虫易水)回复于 2005-08-15 13:24:54 得分 0

安装MSDN,然后以CreateRemoteThread为索引搜之  
  地址无法给出Top

14 楼sunxysong(寒羽)回复于 2005-08-17 09:37:52 得分 0

我试了试  
  case   DLL_PROCESS_ATTACH:  
                  ShowMe();  
                  break;  
  个这方法是可行的.多谢上面几位  
   
  还想多问一下,case   DLL_THREAD_ATTACH:中的语句是什么时候被执行的?  
  我在case   DLL_THREAD_ATTACH:中加了一个函数,但是在插入后并未被执行,请各位指教  
  Top

15 楼sunxysong(寒羽)回复于 2005-08-19 13:21:56 得分 0

自己再顶一下Top

16 楼sunxysong(寒羽)回复于 2005-08-28 19:51:30 得分 0

算了,结贴吧Top

相关问题

  • 200分求教: 关于在service.exe中插入dll的问题.
  • 高手请看 :关于插入dll和挂接api
  • 高手请看 :关于插入dll和挂接api
  • 如何在网页内插入一个dll?
  • 如何将dll插入到其他的线程中????
  • 如何向CSRSS.EXE进程插入一个DLL
  • 如何向CSRSS.EXE进程插入一个DLL 高手请进
  • 怎么往DLL的PP里插入些ICO?
  • 如何在asp.net页面中插入用vb写的 Dll !!! 谢谢
  • 把Tframe放入DLL中,在另一个程序的Form中插入

关键词

  • 函数
  • dll
  • vm
  • 远程
  • 注入
  • 执行
  • null
  • showme
  • 插入
  • 进程

得分解答快速导航

  • 帖主:sunxysong
  • surstar
  • nanfeng231
  • kugou123

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo