Вопрос Фикс Static TLS

Пользователь
Статус
Оффлайн
Регистрация
12 Июн 2019
Сообщения
873
Реакции[?]
127
Поинты[?]
1K
Нужен фикс static TLS в ммап инжекте. Два способа которые я знаю, юзать флаг msvc /Zc:threadSafeInit (не всегда правильно фиксит на стадии компиляции) или достать по паттерну из ntdll.dll ф-цию LdrpHandleTlsData и мануально вызывать перед DllMain.
1. Какие практики ООП лучше использовать для фикса с флагом?
2. Где можно посмотреть правильную реализацию инжекта с LdrpHandleTlsData под Win 11 (паттерны я достал)?
Спасибо.
 
Начинающий
Статус
Оффлайн
Регистрация
26 Авг 2023
Сообщения
15
Реакции[?]
3
Поинты[?]
3K
По сигнатуре искать функцию LdrpHandleTlsData практика конечно не из лучших, каждый раз следить за релизами новых билдов и т.п..
По этому могу посоветовать просто пропарсить PDB ntdll (
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Сам пример вызова LdrpHandleTlsData с использованием выше упомянутой библиотеки:

C++:
using pLdrpHandleTlsData = DWORD(*)(PLDR_DATA_TABLE_ENTRY);

const std::string ntdllPath = R"(C:\Windows\System32\ntdll.dll)";

std::string pdbPath;
const auto result = SymbolLoader::Initialize( ntdllPath, std::getenv( "TEMP" ), pdbPath, true );

if (result == 0)
{
    const SymbolParser symbolParser{ pdbPath };
    const auto ldrpHandleTlsDataOffset = symbolParser.GetSymbolRva( "LdrpHandleTlsData" );

    std::printf( "LdrpHandleTlsData offset: %X\n", ldrpHandleTlsDataOffset );

    if (ldrpHandleTlsDataOffset)
    {
        const auto ntdllBase = GetModuleHandleA( "ntdll" );
        if (ntdllBase)
        {
            const auto fnLdrpHandleTlsData = reinterpret_cast<pLdrpHandleTlsData>(reinterpret_cast<uintptr_t>(ntdllBase) + ldrpHandleTlsDataOffset);
   
            LDR_DATA_TABLE_ENTRY ldrDataTableEntry{ };
            ldrDataTableEntry.DllBase = dllBase;
            fnLdrpHandleTlsData( &ldrDataTableEntry );
        }
    }
}
Пожалуйста.
 
Последнее редактирование:
Сверху Снизу