PsSetLoadImageNotifyRoutine и выделение памяти

Тема в разделе "WASM.NT.KERNEL", создана пользователем XshStasX, 15 окт 2010.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Установил нотификатор на загрузку DLL в процесс(PsSetLoadImageNotifyRoutine).

    Далее пытаюсь выделить кусок памяти при загрузке длл.
    не понятно почему ZwAllocateVirtualMemory подвисает( не отдает управление) а с ней и вся система виснет...

    В чем тут проблема ?..

    Код (Text):
    1. VOID ProcNotify(
    2.     __in PUNICODE_STRING FullImageName,
    3.     __in HANDLE ProcessId,                // pid into which image is being mapped
    4.     __in PIMAGE_INFO ImageInfo
    5.     )
    6. {
    7.  
    8.   AllocMemInProcess(1024,hProcess);
    9.  
    10.  
    11. };
    12.  
    13. PVOID AllocMemInProcess(ULONG size,HANDLE hProcess){
    14.  
    15.     NTSTATUS    status      =   0;
    16.     PVOID       base        =   NULL;
    17.  
    18.    
    19.     LARGE_INTEGER       isize           =   {0};
    20.     CLIENT_ID           id              =   {0};
    21.     OBJECT_ATTRIBUTES   ObjAttr         =   {0};
    22.     HANDLE              hOpenProcess    =    0;
    23.     LONG                ZeroBits        =    0;
    24.  
    25.     id.UniqueProcess            = hProcess;
    26.     isize.QuadPart              = size;
    27.  
    28.    
    29.     status = ZwOpenProcess(&hOpenProcess,
    30.         PROCESS_ALL_ACCESS,
    31.         &ObjAttr,
    32.         &id
    33.         );
    34.  
    35.     if (! NT_SUCCESS(status))
    36.         return NULL;
    37.    
    38.     status = ZwAllocateVirtualMemory(hOpenProcess,
    39.         &base,  
    40.         ZeroBits,  
    41.         &size,
    42.         MEM_COMMIT,
    43.         PAGE_EXECUTE_READWRITE);
    44.  
    45.    
    46.  
    47.     ZwClose(hOpenProcess);
    48.  
    49.     if (! NT_SUCCESS(status)){
    50.         return NULL;
    51.     };
    52.    
    53.     return base;
    54. };
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Так нельзя делать в принципе, будет дедлок. Расскажи больше о задаче, зачем выделяешь память и т.д. Тогда сможем посоветовать что-то более конкретное.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    Специально для вас создан топик про овощи, я там всё разрулил.
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Clerk
    Когда-то называл его лучшим кибер-другом, а теперь нападки, ай не хорошо
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    JCronuz
    Небыло такого, ну или я не помню. Не нравятся мне его решения:
    После описания необходимости аллокации памяти последует ответ: APC юзайте, можно тред создать UM и из него юзать.. и это учитывая асинхронность апк.)
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это про меня? Не помню такого, мы и не общались-то никогда напрямую.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    По сабжу что можите сказать, ваше мнение интересно.
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    С другой стороны, это ведь хорошо. Должны быть и альтернативные мнения. Чтобы был выбор решений. И сейчас пока он есть.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    Не, на самом деле я даже и не думал над проблемой освобождения мьютекса, меня интересует общее решение. У вас видимо сказать по сабжу нечего, пичаль.
     
  11. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Внедрить нужную длл в АП процесса.

    пока что есть несколько вариантов:

    1. проверить ZwCreateSection может через нее выйдет.
    2. Создать дополнительный(PsCreateSystemThread) поток который будет открывать процесс и выделять память.
    3. следовать совету клерка, и делать бектрейс(идея очень интересная проблема в том что подобным не занимался еще ни разу, в инете статей еще не нашол на тему анализка стека или бектрейса).
     
  12. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В какой именно момент необходимо внедрить эту .dll? Это зависит от того, что именно предполагается делать в этой .dll? Например, требуется ли там перехватывать какие-либо API-функции?

    Не выйдет, там та же проблема в итоге.

    Пока непонятно, подойдёт ли тебе этот вариант. Ответь на вопросы выше.

    Да, тема не для новичков. Но со временем разберёшься, не волнуйся. Вопрос в том, нужно ли это тебе именно сейчас? Мне кажется, нет.
     
  13. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    В целом момент не особо принципиален.

    В целом можно и без потоков обойтись память ведь можно получить в нотификации о создании процесса, а в нотификации о подгрузке длл можно поставить апс.

    А можно с процессом ассоциировать какой то указатель ?..
     
  14. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
  15. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Тогда я вообще не понимаю, зачем нотификатор, если можно тупо запустить ядерный поток, когда надо, и не париться.

    Нет, так не надо делать. Память можно выделить там же в APC, при чём, как в ядре, так и вне его.

    Ну так а в чём проблема? Создай карту на базе примитивов списков и обновляй её в нотификаторе или когда там надо.
     
  16. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    А как выделить память под саму APC ?...
    ведь apc нужен как я понимаю юзермодный, который сделает вызов LdrLoadDll
    Я ведь не могу передать юзермодной apc управление на адресс больше 0x7fffffff

    Надо от самого начала и до конца.

    облом делать вручную списки )...
     
  17. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    У пользовательской APC есть две функции. Одна выполняется в режиме ядра (KernelRoutine), другая в режиме пользователя (NormalRoutine). При чём ядерная выполняется всегда строго перед пользовательской. Соответственно, в ядерной можешь уже звать и ZwAllocateVirtualMemory(), и всё остальное, что тебе там нужно, никаких блокировок не будет.

    Что значит "от самого начала"? Не вводи людей в заблуждение, описывай задачу сразу чётко, ясно и подробно.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    x64
    Вы уверены что поток не освободит блокировку апк(RundownProtection) до возврата на нужное место(KiServiceExit()) и ядерная апк не будет развёрнута при приходе рандомного прерывания ?
     
  19. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    это бред, тогда уже позно было...что имел ввиду хз
     
  20. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Clerk
    ты о чем ?..
    А что будет если в момент когда будет вызвана АРС проц. произойдет прерывание ?
    Обработается прерывании и нам отдадут управление ?