使用Python文件、win32api、win32con、wintypes和wind查找dll的绝对路径时出现问题

2024-06-01 03:04:37 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个更大的,非常复杂的工作的一部分,我已经削减到只是基本的。我使用的是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)。对于最后的一些类似DLL,它给出了ucrtbase.dll. 任何这些帮助将不胜感激,因为我希望它能够找到所有DLL。你知道吗

我之所以把IDA包括进来,并没有什么特别的原因,只是它给出了三个独特的错误,这比我测试的其他错误都多。你知道吗

我曾考虑过,如果找不到dll,就在硬盘上搜索,但如果dll的名称相同,可能会出现问题。此外,分析员可能有一个名为公共DLL的东西,但实际上是一个恶意软件工件,只需搜索硬盘就可以找到。最后,不得不搜索可能会减慢它相当多。但我愿意接受任何有创意的想法。你知道吗


Tags: importapil1windowsexewinmsdll
1条回答
网友
1楼 · 发布于 2024-06-01 03:04:37

我发现你的代码至少有两个问题:

  1. 引用^{}文档和LOAD_LIBRARY_AS_DATAFILE标志:

Therefore, you cannot call functions like GetModuleFileName, GetModuleHandle or GetProcAddress

因此,您的代码有一个未定义的行为不能保证工作或返回有意义的结果。你知道吗

  1. 您试图静态地解决由系统动态完成的问题。当Windows的加载程序加载一个模块,然后检查IAT以找到导入的模块时,它会进入一个非常复杂的机制Dynamic-Link Library Search Order,该机制依赖于Dynamic-Link Library Search Order(重点是动态的)。你知道吗

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

你最好的办法是完全复制系统所做的,以获得完全相同的结果。你知道吗

相关问题 更多 >