HANDLE rmtThread=CreateRemoteThread(hProcess,NULL,0,startAddr,buf,0,NULL);
这个创建的远程线程无法成功。
PTHREAD_START_ROUTINE startAddr= (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle( TEXT("kernel32")), "LoadLibraryA");
这个也没有错误。
buf是dll的绝对路径名,并且在目标进程空间中申请了内存,为什么走到创建远程线程时就会失败呢?

解决方案 »

  1.   

    CreateRemoteThread()返回值是多少.
    最好贴全代码。
      

  2.   

    DWORD pid=GetProcessID("calc.exe"); HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid );
    if(hProcess==NULL)
    {
    AfxMessageBox("打开目标进程失败!");
    return 0;
    } AfxMessageBox("打开目标进程成功!");
    char * path="D:\\dll.dll"; DWORD sz=strlen(path)+1; 
    LPVOID buf=VirtualAllocEx(hProcess, NULL,sz,MEM_COMMIT,PAGE_READWRITE); 
    if ( NULL == buf)
    {
    CloseHandle( hProcess );
     // 失败处理
    AfxMessageBox(_T("NULL == lpBuf"));
    return 0;
    }
    DWORD dwWritten;
    if ( WriteProcessMemory( hProcess, buf, (LPVOID)path, sz, &dwWritten ) )
     {
    // 要写入字节数与实际写入字节数不相等,仍属失败
     if ( dwWritten != sz )
     {
     VirtualFreeEx( hProcess, buf, sz, MEM_DECOMMIT );
     CloseHandle( hProcess );
     // 失败处理
     AfxMessageBox(_T("要写入字节数与实际写入字节数不相等"));
      return 0;
     }
         HMODULE  hkernel   = GetModuleHandle( TEXT("kernel32")); 
      if(hkernel==NULL)
      {
    AfxMessageBox("打开kernel错误!");
    return 0;
      }
      PTHREAD_START_ROUTINE startAddr= (PTHREAD_START_ROUTINE)GetProcAddress(hkernel, "LoadLibraryA");
      if(startAddr==NULL)
      {
    AfxMessageBox("入口地址错误!");
    return 0;
      }
      HANDLE rmtThread=CreateRemoteThread(hProcess,NULL,0,startAddr,buf,0,NULL);
           if(NULL==rmtThread)
      {
    AfxMessageBox("远程线程创建失败!");
    return 0;
      }
          WaitForSingleObject(rmtThread,INFINITE);
      AfxMessageBox("远程注入成功!");
          VirtualFreeEx(hProcess,buf,sz,MEM_DECOMMIT);
          CloseHandle(rmtThread);
      CloseHandle(hProcess);
          return 0;
    }  
    这个是代码 就执行到创建远程线程那就失败了,创建不了~
      

  3.   

    代码没发现问题,我执行了一遍,成功的。能够返回远程线程的句柄。你调用一下GetLastError看看错误原因啊
      

  4.   


    我在朋友的xp系统下运行也成功了,我的系统是win7,是不是win7和这个不兼容啊!求解释~
      

  5.   

    Win7是不能随便CreateRemoteThread的,会返回一个ERROR_NOT_ENOUGH_MEMORY。MS描述: 
    Terminal Services isolates each terminal session by design. Therefore,  
    CreateRemoteThread fails if the target process is in a different session 
    than the calling process. 
    .text:7C81059E                 call    ds:CsrClientCallServer 
    .text:7C8105A4                 mov     eax, [ebp-0BCh] 
    .text:7C8105A4 
    .text:7C8105AA 
    .text:7C8105AA loc_7C8105AA:  CODE XREF: CreateRemoteThread+2A7A2j 
    .text:7C8105AA                 mov     [ebp-3ACh], eax; 
    .text:7C8105AA 
    .text:7C8105B0 
    .text:7C8105B0 loc_7C8105B0:  CODE XREF: CreateRemoteThread+1B3A9j 
    .text:7C8105B0                                          CreateRemoteThread+2A78Dj 
    .text:7C8105B0                 cmp     [ebp-3ACh], ebx//这里发生了跳转,引起CreateRemoteThread失败。 
    .text:7C8105B6                 jl      loc_7C83ABD3
    看到了么,Win7在CreateRemoteThread里面调用了CsrClientCallServer,然后判断是否创建远程线程。具体原理比较有难度,不知道你有没有兴趣仔细研究。建议你看下看雪的解决办法,解决要驱动的。
    http://bbs.pediy.com/showthread.php?t=101469
      

  6.   

    通俗的没有呃总之就是Windows不允许随便CreateRemoteThread了。你必须修改Windows代码或者写自己的CreateRemoteThread才行。如果驱动底层什么不会的话建议先放弃吧。这个难度有点大了。
      

  7.   

    这个不是《windows核心编程》22章中的代码么?
    我也用过,在我的电脑上(win7)没问题。
    还是看看Getlasterror看看吧