none
注入dll时,手动复制dll成功,为什么用copyfile,执行出现问题了。 RRS feed

  • 问题

  • /*char currentdir[128];
     char *lpsz;
     ::GetCurrentDirectory(128,currentdir);
     char strdll[]="\\Dnfy.dll";
        strcat(currentdir,strdll);
     lpsz=currentdir;
     lpsz=rtrim(lpsz);
     ::CopyFile(lpsz,"C:\\Dnfy.dll",FALSE);*/

     DWORD proID;
        proID=FindTarget("explore.exe");//宿主为桌面进程
     char lpszDll[]="C:\\Dnfy.dll";
        if(proID==0)
     {
      MessageBox(NULL,"没有发现目标进程","尝试失败",MB_OK);
      return 0;
     }

    当我手工复制dll到C目录下时,注入成功,执行正常。当加上如下时,执行时错误
    /*char currentdir[128];
     char *lpsz;
     ::GetCurrentDirectory(128,currentdir);
     char strdll[]="\\Dnfy.dll";
        strcat(currentdir,strdll);
     lpsz=currentdir;
     lpsz=rtrim(lpsz); //删除结尾空格。
     ::CopyFile(lpsz,"C:\\Dnfy.dll",FALSE);*/

    出现引用内存错误。怎么回事。

    哪位老师指点我。QQ280706417

    2009年12月16日 2:52

答案

  • 你这样,你在 ::CopyFile(lpsz,"C:\\Dnfy.dll",FALSE); 代码后面加一行代码 DWORD dwError = ::GetLastError();

    对于dwError 的值,可以用Visual Sudio 自带的工具 errlook.exe 找到错误提示。这个工具在 VS安装路径\Common7\Tools 目录下。

    如果返回值是2,我猜你是在VS 的Debug模式下发生这个情况的。 因为一般来说,对于VC++的程序Debug模式下的应用程序目录是VC++ 项目文件夹,而不是VC++项目文件夹\debug或者Release,于是也就找不到你指定路径下的那个DLL文件了。

    调试一下你的程序,在CopyFile函数上设一个断点,Quick Watch lpsz 变量,将lpsz变量的路径在我的电脑中打开,看看那个路径下是否存在你需要拷贝的那个DLL.
    2009年12月17日 10:14
    版主

全部回复

  • 代码应该没啥问题,但是我猜你用的操作系统是Vista 或者Windows 7 吧?

    因为UAC 的关系,需要程序在管理员权限下运行时,才可以对C 盘的文件做创建、修改、删除。
    2009年12月17日 7:19
    版主
  • 我用的是windows xp系统

    2009年12月17日 8:21
  • 你这样,你在 ::CopyFile(lpsz,"C:\\Dnfy.dll",FALSE); 代码后面加一行代码 DWORD dwError = ::GetLastError();

    对于dwError 的值,可以用Visual Sudio 自带的工具 errlook.exe 找到错误提示。这个工具在 VS安装路径\Common7\Tools 目录下。

    如果返回值是2,我猜你是在VS 的Debug模式下发生这个情况的。 因为一般来说,对于VC++的程序Debug模式下的应用程序目录是VC++ 项目文件夹,而不是VC++项目文件夹\debug或者Release,于是也就找不到你指定路径下的那个DLL文件了。

    调试一下你的程序,在CopyFile函数上设一个断点,Quick Watch lpsz 变量,将lpsz变量的路径在我的电脑中打开,看看那个路径下是否存在你需要拷贝的那个DLL.
    2009年12月17日 10:14
    版主
  • Thanksyou very much.
    2009年12月18日 1:13