使用Python为DLL查找绝对路径时出现问题-pefile,win32api,win32con,wintypes,windll

时间:2019-02-10 00:48:27

标签: python portable-executable absolute-path

这是一项更大,非常复杂的工作的一部分,我仅介绍了要点。我正在使用Python,这里的目标是枚举所有DLL并找到它们的绝对路径,然后我可以将其馈入pefile,从而进行加载。

我想出的东西部分起作用,部分不起作用。在某些情况下,它无法找到Python.exe的地址,或者根本找不到任何内容。其他时候,它运行完美。我正在寻找有关如何通过这种技术正确找到这些dll的绝对路径的想法,甚至可以做一些完全不同的事情。我可能还需要导入其他内容吗?

这是我想出的:

import pefile
import win32api
import win32con
from ctypes import windll
from ctypes import wintypes
import sys
import os
peName= sys.argv[1] 
pe = pefile.PE(peName)
PE_DLLS = []

def getDLLs():
    global PE_DLLS
    for entry in pe.DIRECTORY_ENTRY_IMPORT:
        print entry.dll
        PE_DLLS.append(entry.dll)

def extractDLL(dllName):

    # Part of this loadlibrary comes from: https://www.programcreek.com/python/example/53932/ctypes.wintypes.HANDLE
    print dllName
    try:
        dllHandle = win32api.LoadLibraryEx(dllName, 0, win32con.LOAD_LIBRARY_AS_DATAFILE)
        windll.kernel32.GetModuleHandleW.restype = wintypes.HMODULE
        windll.kernel32.GetModuleHandleW.argtypes = [wintypes.LPCWSTR]
        windll.kernel32.GetModuleFileNameW.restype = wintypes.DWORD
        windll.kernel32.GetModuleFileNameW.argtypes = [wintypes.HANDLE, wintypes.LPWSTR, wintypes.DWORD]
        h_module_base = windll.kernel32.GetModuleHandleW(dllName)
        module_path = wintypes.create_unicode_buffer(255)
        windll.kernel32.GetModuleFileNameW(h_module_base, module_path, 255)
        pe = pefile.PE(module_path.value)
        win32api.FreeLibrary(dllHandle)

        print "\t*" + module_path.value

    except:
        print "\t*" + dllName + " could not be found."
        pass
i = 0
getDLLs()
for dll in PE_DLLS:
    extractDLL(PE_DLLS[i])
    i +=1

当我使用IDA之类的文件执行它时,我得到以下信息:

USER32.dll
        *C:\WINDOWS\System32\USER32.dll
ADVAPI32.dll
        *C:\WINDOWS\System32\ADVAPI32.dll
WSOCK32.dll
        *C:\Python27\python.exe
SHELL32.dll
        *C:\WINDOWS\System32\SHELL32.dll
IDA.dll
        *IDA.dll could not be found.
Qt5PrintSupport.dll
        *C:\Python27\python.exe
Qt5Widgets.dll
        *C:\Python27\python.exe
Qt5Gui.dll
        *C:\Python27\python.exe
Qt5Core.dll
        *C:\Python27\python.exe
MSVCP140.dll
        *C:\Python27\python.exe
ole32.dll
        *C:\WINDOWS\System32\ole32.dll
OLEAUT32.dll
        *C:\WINDOWS\System32\OLEAUT32.dll
KERNEL32.dll
        *C:\WINDOWS\System32\KERNEL32.DLL
VCRUNTIME140.dll
        *C:\Python27\python.exe
api-ms-win-crt-convert-l1-1-0.dll
        *C:\WINDOWS\System32\ucrtbase.dll
api-ms-win-crt-math-l1-1-0.dll
        *C:\WINDOWS\System32\ucrtbase.dll
api-ms-win-crt-string-l1-1-0.dll
        *C:\WINDOWS\System32\ucrtbase.dll
api-ms-win-crt-runtime-l1-1-0.dll
        *C:\WINDOWS\System32\ucrtbase.dll
api-ms-win-crt-utility-l1-1-0.dll
        *C:\WINDOWS\System32\ucrtbase.dll
api-ms-win-crt-stdio-l1-1-0.dll
        *C:\WINDOWS\System32\ucrtbase.dll
api-ms-win-crt-time-l1-1-0.dll
        *C:\WINDOWS\System32\ucrtbase.dll
api-ms-win-crt-heap-l1-1-0.dll
        *C:\WINDOWS\System32\ucrtbase.dll
api-ms-win-crt-locale-l1-1-0.dll
        *C:\WINDOWS\System32\ucrtbase.dll

观察以下问题:1.一些出现在Python.exe中; 2.有些人什么也找不到(IDA); 3.最后,对于许多类似的DLL,它提供了ucrtbase.dll。对这些方面的任何帮助将不胜感激,因为我希望它能够找到所有DLL。

我加入IDA并没有特别的原因,除了它给出了三个独特的错误,而且它比我测试过的其他错误还多。

我曾想过要在硬盘上搜索一个dll(如果找不到),但这可能会导致同名DLL出现问题。此外,分析人员可能有一个名称为通用DLL的东西,但实际上是恶意软件产物,可以在搜索硬盘时发现。最后,必须搜索可能会使搜索速度大大降低。但是我愿意接受任何创意。

1 个答案:

答案 0 :(得分:0)

我至少可以看到您的代码有两个问题:

  1. 引用LoadLibraryExLOAD_LIBRARY_AS_DATAFILE标志的文档:
  

因此,您不能调用诸如GetModuleFileName,   GetModuleHandle或GetProcAddress

因此,不能保证您的代码有未定义的行为,否则不能保证能返回有意义的结果。

  1. 您正在尝试静态解决系统动态完成的事情。当Windows的加载程序加载模块,然后检查IAT以找到导入的模块时,它会输入一个称为Dynamic-Link Library Search Order的相当复杂的机制,该机制取决于Dynamic-Link Library Search Order(强调动态)。

请注意,您可能还会错过延迟加载导入或从程序对LoadLibrary的简单调用。

您最好的选择是完全复制系统所做的操作以获得完全相同的结果。