2014-11-15 66 views
0

我注入了一個使用CreateRemoteThread函數寫入另一個進程的DLL,它工作的很好。 但當我嘗試彈出DLL使用相同的方法,它會導致進程終止,我不明白爲什麼。由於dll彈出造成的意外/強制終止進程

下面是我寫彈出DLL功能:

def EjectDLL(processId, dllPath): 
    hThread = None 

    hProcess = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD, 
            False, processId) 
    if hProcess == None: 
     CleanUp(hProcess, None, hThread) 
     return False 

    for module in EnumProcessModules(processId): 
     if module[0].lower() == dllPath.lower(): 
      threadRtn = kernel32.GetProcAddress(kernel32.GetModuleHandleA("kernel32.dll"), "FreeLibraryA") 
      if threadRtn == None: 
       break 

      hThread = kernel32.CreateRemoteThread(hProcess, None, 0, threadRtn, module[1], 0, None) 
      if hThread == None: 
       break 

      kernel32.WaitForSingleObject(hThread, INFINITE)  #wait for remote thread to finish 

      CleanUp(hProcess, None, hThread) 
      return True 

    CleanUp(hProcess, None, hThread) 
    return False 

EnumProcessModules生成一個元組,其中所述第一索引是模塊和第二指標的路徑是模塊的HMODULE。 我的代碼有什麼問題嗎?

回答

3

kernel32.dll沒有功能叫FreeLibraryA,只有FreeLibrary,所以你對GetProcAddress的調用返回null。

+0

謝謝,我沒有注意到我添加了A.因爲每個win32應用程序都必須有kernel32.dll,並且系統將此dll映射到每個進程中的相同地址,所以使用GetModuleHandle時不會出現任何問題。 – PieThon