Проблемы с поиском абсолютных путей для DLL, использующих Python - pefile, win32api, win32con, wintypes, windll - PullRequest
0 голосов
/ 10 февраля 2019

Это часть гораздо большего, очень сложного усилия, которое я сократил только до самого необходимого.Я использую Python, и цель здесь состоит в том, чтобы перечислить все библиотеки DLL и найти абсолютный путь для них, который я затем могу передать в pefile, чтобы тем самым загрузить его.

То, что я придумал с частичными работами и частичноне.В некоторых случаях он просто находит адрес для Python.exe или вообще не может ничего найти.В других случаях это работает отлично.Я ищу идеи о том, как правильно найти абсолютный путь для этих библиотек с помощью этой техники ... или даже сделать что-то совершенно другое.Может быть, мне нужно импортировать что-то еще?

Вот что я придумал:

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. некоторые ничего не могли найти (МАР);3. для ряда похожих DLL в конце, он дал ucrtbase.dll.Буду признателен за любую помощь по любому из них, так как я хочу, чтобы он мог найти ВСЕ DLL.

Нет особой причины, по которой я включаю IDA, за исключением того, что он дал три уникальных ошибки, и это было большечем другие, которые я проверял.

Я думал о поиске dll на жестком диске, если он не найден, но это может привести к проблемам с DLL-библиотеками с одинаковыми именами.Кроме того, у аналитика может быть нечто, называемое общей библиотекой DLL, но на самом деле это артефакт вредоносного ПО, который можно найти только при поиске на жестком диске.Наконец, необходимость поиска может немного замедлить его.Но я открыт для любых творческих идей.

1 Ответ

0 голосов
/ 10 февраля 2019

Я вижу по крайней мере две проблемы с вашим кодом:

  1. Цитирование документации для LoadLibraryEx и флага LOAD_LIBRARY_AS_DATAFILE:

Следовательно, вы не можете вызывать такие функции, как GetModuleFileName, GetModuleHandle или GetProcAddress

Поэтому ваш код с неопределенным поведением не может работать или возвращать значимые результаты.

Вы пытаетесь статически решить что-то, что динамически выполняется системой.Когда загрузчик Windows загружает модуль и затем проверяет IAT, чтобы найти импортированные модули, он затем вводит довольно сложный механизм, называемый Порядок поиска в библиотеке динамических ссылок , который зависит от библиотеки динамических ссылок.Порядок поиска (выделено Dynamic ).

Обратите внимание, что вы, вероятно, также пропустите импорт отложенной загрузки или простые вызовы LoadLibrary из программы.

Лучше всего будет точно воспроизвести, что система делает, чтобы получитьточно такие же результаты.

...