Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 22 Мар 2026
- Сообщения
- 8
- Реакции
- 2
Вероятно вы видели как в мапперах таблица импортов выглядит, но как её получить автоматически, а не вручную все выписывать?
Воопервых нам нужен дамп с импортами (если у дампа нету IAT попробуйте через Scylla пофиксить, вводите ЭнтриПоинт нажимайте IAT Autosearch, потом get imports, потом на Dump и Fix Dump (Не нажимайте на Pe rebuild оно не надо))
Установите библиотеку pefile (pip install pefile)
Сам код:
также вам понадобиться base_address чтобы выводился адрес который используеться в дампе. (пример есть адрес 0x7fff80002040 а сама dll используеть call на 0x180002040, поэтому надо из 0x7fff80002040 вычесть 0x7ffe00000000 и мы получим валидный адрес для кола)
Воопервых нам нужен дамп с импортами (если у дампа нету IAT попробуйте через Scylla пофиксить, вводите ЭнтриПоинт нажимайте IAT Autosearch, потом get imports, потом на Dump и Fix Dump (Не нажимайте на Pe rebuild оно не надо))
Установите библиотеку pefile (pip install pefile)
Сам код:
parser.py:
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 и мы получим валидный адрес для кола)