Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд Парсинг импортов из dll для маппера

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
22 Мар 2026
Сообщения
8
Реакции
2
Вероятно вы видели как в мапперах таблица импортов выглядит, но как её получить автоматически, а не вручную все выписывать?
1774718105214.png

Воопервых нам нужен дамп с импортами (если у дампа нету IAT попробуйте через Scylla пофиксить, вводите ЭнтриПоинт нажимайте IAT Autosearch, потом get imports, потом на Dump и Fix Dump (Не нажимайте на Pe rebuild оно не надо))

Установите библиотеку pefile (pip install pefile)
Сам код:
parser.py:
Expand Collapse Copy
import pefile
from collections import defaultdict

def get_import_calls(dll_path):
    pe = pefile.PE(dll_path)
    imports_by_dll = defaultdict(list)

    if not hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'):
        return imports_by_dll

    for entry in pe.DIRECTORY_ENTRY_IMPORT:
        try:
            dll_name = entry.dll.decode()
        except:
            continue

        for imp in entry.imports:
            if not imp.name:
                continue
            try:
                func_name = imp.name.decode()
            except:
                continue

            if func_name.lower() == "*invalid*" or dll_name.lower() == "*invalid*":
                continue

            iat_address = imp.address
            imports_by_dll[dll_name].append((iat_address, func_name))

    return imports_by_dll

def format_cpp_vector(imports_by_dll, base_address=0x7ffe00000000):
    lines = []
    lines.append('std::vector<std::tuple<uintptr_t, std::string, std::string>> g_aImports =')
    lines.append('{')

    for dll, funcs in imports_by_dll.items():
        if not funcs or dll.lower() == "*invalid*":
            continue

        lines.append(f'    // {dll}')
        for addr, func_name in sorted(funcs, key=lambda x: x[0]):
            adjusted_addr = addr - base_address
            lines.append(f'    {{ 0x{adjusted_addr:016X}, "{dll}", "{func_name}" }},')

    lines.append('};')
    return "\n".join(lines)

if __name__ == "__main__":
    dll_path = input("enter dll path: ")
    imports_by_dll = get_import_calls(dll_path)
    cpp_output = format_cpp_vector(imports_by_dll)
    print(cpp_output)

также вам понадобиться base_address чтобы выводился адрес который используеться в дампе. (пример есть адрес 0x7fff80002040 а сама dll используеть call на 0x180002040, поэтому надо из 0x7fff80002040 вычесть 0x7ffe00000000 и мы получим валидный адрес для кола)
 
Назад
Сверху Снизу