Microsoft Detours - DetourUpdateThread?

У меня есть несколько быстрых вопросов о Microsoft Detours Library. Я использовал его прежде (успешно), но у меня просто была мысль об этой функции:

ДЛИННЫЙ DetourUpdateThread (ОБРАБАТЫВАЮТ hThread);

Я считал в другом месте, что эта функция на самом деле приостановит поток, пока транзакция не завершится. Это кажется нечетным начиная с вызовов наиболее примера кода:

DetourUpdateThread (GetCurrentThread ());

Так или иначе по-видимому, эта функция "включает в список" потоки так, чтобы, когда транзакция фиксирует (и обходы сделаны), их указатели команд были изменены, если они лежат "в рамках переписанного кода или в целевой функции или в функции батута".

Мои вопросы:

Когда транзакция фиксирует, указатель команд текущего потока собирается быть в функции DetourTransactionCommit? Если так, почему мы должны потрудиться включать в список его, чтобы быть обновленными?

Кроме того, если включенные в список потоки приостановлены, как текущий поток может продолжить выполняться (учитывая, что наиболее пример кода называет DetourUpdateThread (GetCurrentThread ()) ;)?

Наконец, Вы могли приостановить все потоки за текущий процесс, избежав условий состязания (полагающий, что потоки могли становиться созданными и уничтоженными когда-либо)? Возможно, это сделано, когда транзакция начинается? Это позволило бы нам перечислять потоки более безопасно (поскольку кажется менее вероятным, что новые потоки могли быть созданы), хотя что относительно CreateRemoteThread ()?

Спасибо,

Paul

Для ссылки вот извлечение из простой выборки:

// DllMain function attaches and detaches the TimedSleep detour to the
// Sleep target function.  The Sleep target function is referred to
// through the TrueSleep target pointer.
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved)
{
    if (dwReason == DLL_PROCESS_ATTACH) {
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)TrueSleep, TimedSleep);
        DetourTransactionCommit();
    }
    else if (dwReason == DLL_PROCESS_DETACH) {
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)TrueSleep, TimedSleep);
        DetourTransactionCommit();
    }
    return TRUE;
}
6
задан pault543 14 April 2010 в 11:16
поделиться

1 ответ

Как досадно: Я забыл, что источник был доступен!

DetourUpdateThread молча игнорирует присоединение текущего потока. В противном случае данный поток будет приостановлен. Интересно, почему ВСЕ примеры кода в любом случае включают текущий поток! Это отвечает на первые 2 вопроса.

Что касается третьего вопроса: Я нашел другую библиотеку обхода, которая пытается приостановить все потоки, выполнив следующие действия:

  1. Получить снимок всех потоков

  2. Прокрутить снимок и приостановить потоки, которые мы еще не приостановлены.

  3. Если потоки были приостановлены, вернитесь к 1 (мы по-прежнему отслеживаем приостановленные потоки). Если ни один поток не был приостановлен, все готово.

Я думаю, предполагается, что если мы можем пройти через все потоки, и все они уже приостановлены (то есть до того, как мы сделали снимок), то больше потоков не может быть создано. Не уверен, что насчет CreateRemoteThread!

Правка: Re: CreateRemoteThread.

«Только один поток в процессе может быть в программе инициализации или отсоединения DLL одновременно». CreateRemoteThread «приводит к вызову точки входа каждой DLL в процессе». {{1 }} http://msdn.microsoft.com/en-us/library/ms682437%28VS.85%29.aspx

Новый поток не может начать выполнение, если вы используете функцию DllMain (пока новый поток еще не вызвал вызова точки входа каждой DLL в процессе). Таким образом, если вы применяете обходные пути в функции DllMain, вы можете просто быть в безопасности от состояния гонки, когда создается новый удаленный поток и его указатель инструкций находится внутри вашей переписанной целевой / трамплиновой функции.

Спасибо,

Пол

7
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: