我在远程创建线程时,当创建的线程执行时(线程函数LoadLibrary(“dll.dll”),dll.dll代码是个死循环)为什么远程进程中其他的线程都没了响应。希望高手能解答。谢谢~~~~~~

解决方案 »

  1.   

    paste your code, or you can send your project to me using e-mail.
      

  2.   

    插入函数为
    BOOL WINAPI InjectLib(DWORD dwProcessId, PCSTR pszLibFile) {   BOOL fOk = FALSE; 
       HANDLE hProcess = NULL, hThread = NULL;
       PWSTR pszLibFileRemote = NULL;
          hProcess = OpenProcess(
             PROCESS_QUERY_INFORMATION |   // Required by Alpha
             PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
             PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
             PROCESS_VM_WRITE,             // For WriteProcessMemory
             FALSE, dwProcessId);
          if (hProcess == NULL) return fOk;
          int cch = 1 + lstrlen(pszLibFile);
          int cb  = cch * sizeof(CHAR);
          pszLibFileRemote = (PWSTR) 
             VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
          if (pszLibFileRemote == NULL) return fOk;      if (!WriteProcessMemory(hProcess, pszLibFileRemote, 
             (PVOID) pszLibFile, cb, NULL)) return fOk;
          PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
             GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
          if (pfnThreadRtn == NULL) return fOk;
          hThread = CreateRemoteThread(hProcess, NULL, 0, 
             pfnThreadRtn, pszLibFileRemote, 0, NULL);
          if (hThread == NULL) return fOk;      WaitForSingleObject(hThread, INFINITE);      fOk = TRUE; // Everything executed successfully   return(fOk);
    }
    dll的初始化代码为
    while(1)
    {
    sleep(100);
    }
    但不知道为什么远程进程只是执行dll的初始化代码,而远程进程的其他线程堵塞。请问高手这是为什么。
      

  3.   

    在  InjectLib 函数中有这句:
    WaitForSingleObject(hThread, INFINITE);
    这句会等待线程的结束,你写个死循环会导致一直等待
      

  4.   

    to zzz3265,
    我想wyz_wjp说的是远程进程,不是InjectLib所在的进程吧。to wyz_wjp:
    试试看在DLL中写代码另外创建一个线程作事情,不要在DllMain中死循环。Dll初始化(DLL_PROCESS_ATTACH, etc....)的时候会自动获得Loader Lock,一旦其他线程调用会获得LoadLock的API的话,这些线程就会被锁住。所以这种做法还是应该要尽量避免。
    此外请注意在DLLMain中创建的新线程会暂停执行直到DllMain结束执行,所以DllMain不能等待新的线程中的某个Event,不然又会死锁。
      

  5.   

    在DLL_PROCESS_ATTACH中可以用_beginthread来创建线程,那样,不管你作什么,都正常,我试过
      

  6.   

    LZ是在远程进程内部调用LoadLibary的.这是远程的LoadLibary是由主线程执行的,因为DllMain一直不结束,导致LoadLibary不返回,所以远程进程的主线程就不动了.