PsRemoveLoadImageNotifyRoutine

Тема в разделе "WASM.NT.KERNEL", создана пользователем agent007, 22 мар 2007.

  1. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    необходимо реализовать для win2k... глянул дизасм, там все просто впринципе, достаточно из массива, который можно получить из функции PsSetLoadImageNotifyRoutine удалить наш калбек... А вот в XP я как понял там двухсвязные списки... как добица чтобы дровина работала и под XP и под 2k? один способ вижу.... но он какойто нехороший... есть предложения?
     
  2. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    703
    бранчить ?;)
     
  3. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    agent007
    смотри на rootkits.ru софтину NotifyRoutines (а точнее сорсы на форуме)
     
  4. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    кривая реализация, на WIN2K3 тестили хоть? адреса переменных отличаются... В общем решил я свою проблему, т.к. поиск переменных по смещению в XP, 2k3 ведет к разным результатам, даже разный в разных SP... Решил не изобретать велосипед и сделал так :)
    Код (Text):
    1. NTSTATUS _PsRemoveLoadImageNotifyRoutine(IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine) {
    2.     ULONG i,uMajorVersion,uMinorVersion,uPsSetLoadImageNotifyRoutineVA,uPsRemoveLoadImageNotifyRoutineVA;
    3.     PVOID *PspLoadImageNotifyRoutine;
    4.     KERNEL_INFO KernelInfo;
    5.     // ïîëó÷àåì âåðñèþ âèíäû
    6.     PsGetVersion(&uMajorVersion,&uMinorVersion,NULL,NULL);
    7.     if((uMajorVersion == 5) && (uMinorVersion == 0)) {
    8.         // win2k
    9.         uPsSetLoadImageNotifyRoutineVA = *(PULONG) *(PULONG) ((ULONG) PsSetLoadImageNotifyRoutine + 2);
    10.         PspLoadImageNotifyRoutine = (PVOID *) (*(PULONG) (uPsSetLoadImageNotifyRoutineVA+8));
    11.         // èùåì íàø êàëáåê
    12.         for(i=0;i<PSP_MAX_LOAD_IMAGE_NOTIFY;i++) {
    13.             if(PspLoadImageNotifyRoutine[i] == NotifyRoutine) {
    14.                 PspLoadImageNotifyRoutine[i] = NULL;
    15.                 return STATUS_SUCCESS;
    16.             }
    17.         }
    18.     } else {
    19.         if(!NT_SUCCESS(GetKernelInfo(&KernelInfo))) return STATUS_UNSUCCESSFUL;
    20.         uPsRemoveLoadImageNotifyRoutineVA = GetProcRva(KernelInfo.uBase,"PsRemoveLoadImageNotifyRoutine");
    21.         if(!uPsRemoveLoadImageNotifyRoutineVA) {
    22.             myfree(KernelInfo.cModuleName);
    23.             return STATUS_UNSUCCESSFUL;
    24.         }
    25.         uPsRemoveLoadImageNotifyRoutineVA += KernelInfo.uBase;
    26.         __asm {
    27.             push    NotifyRoutine
    28.             call    uPsRemoveLoadImageNotifyRoutineVA
    29.         }
    30.         myfree(KernelInfo.cModuleName);
    31.         return STATUS_SUCCESS;
    32.     }
    33.     return STATUS_UNSUCCESSFUL;
    34. }