这是一项更大,非常复杂的工作的一部分,我仅介绍了要点。我正在使用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的东西,但实际上是恶意软件产物,可以在搜索硬盘时发现。最后,必须搜索可能会使搜索速度大大降低。但是我愿意接受任何创意。
答案 0 :(得分:0)
我至少可以看到您的代码有两个问题:
LoadLibraryEx
和LOAD_LIBRARY_AS_DATAFILE
标志的文档:因此,您不能调用诸如GetModuleFileName, GetModuleHandle或GetProcAddress
因此,不能保证您的代码有未定义的行为,否则不能保证能返回有意义的结果。
请注意,您可能还会错过延迟加载导入或从程序对LoadLibrary的简单调用。
您最好的选择是完全复制系统所做的操作以获得完全相同的结果。