Странности инжекта APC

Тема в разделе "WASM.NT.KERNEL", создана пользователем Yrees, 25 фев 2012.

  1. Yrees

    Yrees New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2011
    Сообщения:
    6
    Пытаюсь разобраться с инжектом с помощью APC, сам код содержащийся по pMappedCode загружает DLL с использованием LdrLoadDll, а в самой Dll простой MessageBox выбрасывает на DLL_ATTACH-е в DllMain функции. Работает, успешно инжектит, окошко MessageBox выкидывается, НО! Грабли какие-то. Почему-то срабатывает это все с задержкой большой, ЕСЛИ процесс висит в фоне, т.е. активен например другой, или хотябы не провести по нему курсором мыши. В случае когда я это заметил, испытания проводил на обычном виндовом калькуляторе, а до того на Internet Explorer-е. Получается, если в процессе выполняются какие-то действия, например в Internet explorer у меня всегда была открыта страница, и он при этом в том числе и сворачивался, в игре сапер проверил это был отсчет времени (самое простое что в голову пришло с одним тредом и игровым таймером которому пофиг активна задача или нет), то срабатывает моментально.
    Подскажите в чем может быть проблема? Как заставить срабатывать моментально даже в такой фигне как калькулятор в фоновом режиме? Я уже всю голову себе сломал, не могу допереть что это за мистика.

    Код (Text):
    1.     KeInitializeApc(
    2.         pKAPC,
    3.         (PKTHREAD)TargetThread,
    4.         OriginalApcEnvironment,
    5.         (PKKERNEL_ROUTINE)APCKernelRoutine,
    6.         NULL,
    7.         (PKNORMAL_ROUTINE) pMappedCode,    // Адрес в юзермоде
    8.         UserMode,
    9.         (PVOID)arg1        // Context
    10.     );
    11.  
    12.  
    13.     KeInsertQueueApc(pKAPC,
    14.                  (PVOID)arg2,                // Context 2.
    15.                  (PVOID)arg3,                // Context 3.
    16.                  0  );                       // Priority increment
    17.            
    18.     LARGE_INTEGER liTimeout = {0};
    19.     KeDelayExecutionThread (UserMode, TRUE, &liTimeout);
    Буду премного благодарен за дельные подсказки и советы. Спасибо.

    Дополнено в 14:53:
    Посмотрел Process Hacker-ом, состояние треда в это время Wait:WrUserRequest, попробовал сделать процессу Suspend и потом Resume, на Resume получается срабатыване. Может быть стОит как-то принудительно из драйвера процесс передернуть? По идее да, но все же хочется разобраться в приничне, и найти наиболее правильное решение.
     
  2. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Пока треда не войдёт в alertable состояние апк не будет доставлено.
    http://www.opening-windows.com/techart_windows_vista_apc_internals.htm