Стандартный брейкпоинт на OEP не гарантирует перехват первой инструкции: системный загрузчик Windows вызывает функции из директории
IMAGE_DIRECTORY_ENTRY_TLS задолго до передачи управления на AddressOfEntryPoint.При старте процесса вызов
ntdll!LdrpInitializeProcess инициирует ntdll!LdrpCallTlsInitializers. Загрузчик находит массив указателей через поле AddressOfCallBacks в структуре IMAGE_TLS_DIRECTORY и поочерёдно выполняет зарегистрированные коллбэки с причиной DLL_PROCESS_ATTACH.В MSVC массив создаётся без явных API-вызовов через атрибут слияния секций
#pragma section(".CRT$XLB", read). На этапе линковки адреса сортируются по алфавиту и упаковываются в .rdata с NULL-терминатором на конце.На практике это даёт малвари окно для скрытого выполнения: коллбэк напрямую читает флаг
BeingDebugged в структуре PEB или зануляет отладочные регистры Dr0–Dr7 через SetThreadContext. Если отладчик обнаружен, процесс тихо завершается через ExitProcess, так и не дойдя до main().Статически наличие коллбэков проверяется через
dumpbin /tls <binary> или парсинг секций в PE-bear. Чтобы поймать выполнение динамически, в x64dbg нужно заранее выставить флаг TLS Callbacks в меню Options -> Preferences -> Events.🔗 blog.poxek
🌚 @poxek | 🌚 @poxek_ai | 📲MAX
