由于DLL弹出导致意外/强制终止进程

时间:2014-11-15 16:35:23

标签: python winapi dll

我使用CreateRemoteThread函数将我写入的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。 我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:3)

在名为kernel32.dll的{​​{1}}中,FreeLibraryA只有FreeLibrary没有任何功能,因此您对GetProcAddress的调用将返回null。