определение процесса, к-рый вызывает похученную функцию

Тема в разделе "WASM.BEGINNERS", создана пользователем RUStx88, 3 сен 2010.

  1. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    словом весь вопрос в заголовке темы, вот более конкретно

    есть драйвер, к-рый хучит функции ядра ZwWriteProcessMemory, ZwOpenProcess и т.п.

    по параметру, к-рый входит в тело этой функции (IN PHANDLE ProcessHandle), можно узнать какой процесс пытаются открыть или в какой процесс хотят проинжектиться, это я знаю как

    а нужно узнать PID процесса, к-рый вызвал эти функции, ну никак не могу понять в какую сторону смотреть
    как-то же узнают фаеры, кто пытается залезть в реестр, кто вписаться в какой процесс

    (прежде чем задать здесь вопрос, гуглю не меньше дня, но увы((((, поэтому прошу подсказки)
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    IoGetCurrentProcess()
     
  3. Clerk

    Clerk Забанен

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

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    n0name, Clerk, огромное вам спасибо))), это то, что нужно!!!
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    RUStx88
    Хороший прот наверно получится :)
     
  6. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    Clerk

    буагага ))) а так пока выполняет свои функции и то, что в него заложено на твердую 4

    Clerk
    еще пара вопросов - не линкуется дров под х64, ругается на ассемблерные вставки
    Код (Text):
    1.   __asm {
    2.     cli
    3.     push eax
    4.     mov eax, cr0
    5.     mov g_Cr0, eax
    6.     and eax, not 10000h
    7.     mov cr0, eax
    8.     pop eax
    9.   }
    10.   (ZWWRITEVIRTUALMEMORY)(KeServiceDescriptorTable->ServiceTableBase[proc]) = NewZwWriteVirtualMemory;
    11.   //(ZWOPENPROCESS)(KeServiceDescriptorTable->ServiceTableBase[temp]) = NewZwOpenProcess;
    12.   //(ZWTERMINATEPROCESS)(KeServiceDescriptorTable->ServiceTableBase[temp2]) = NewZwTerminateProcess;
    13.   __asm {
    14.     push eax
    15.     mov eax, g_Cr0
    16.     mov cr0, eax
    17.     pop eax
    18.     sti
    19.   }
    как это исправить?
     
  7. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    RUStx88
    убрать ассемблерные вставки, т.к. они не поддерживаются в х64.
     
  8. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    а система тогда даст изменить адреса??? в х32 это ассемблерная вставка сбрасывает бит только на чтение и соответственно разрешает запись, потом это дело опять восстанавливается

    вот и спрашиваю, какизбавиться от ассемблерной вставки? просто убрать я так думаю это вообще не вариант, имхо)))
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    RUStx88
    Может это поможет - http://msdn.microsoft.com/ru-ru/library/ewd38ezs.aspx
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ассемблер нужно выносить в .asm-файлы.
     
  11. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    от ассемблерных вставок удалось избавиться таким образом
    Код (Text):
    1. PMDL  g_pmdlSystemCall;
    2. PVOID *MappedSystemCallTable;
    3. // установка хука
    4.   proc = *((USHORT*)(functionAddr + 1));
    5.   // запоминаем настоящий адрес функции
    6.   OldZwWriteVirtualMemory = ((ZWWRITEVIRTUALMEMORY)KeServiceDescriptorTable->ServiceTableBase[proc]);
    7.   g_pmdlSystemCall = MmCreateMdl(NULL, KeServiceDescriptorTable->ServiceTableBase, KeServiceDescriptorTable->NumberOfServices * 4);
    8.   if (!g_pmdlSystemCall)
    9.     return STATUS_UNSUCCESSFUL;
    10.   MmBuildMdlForNonPagedPool(g_pmdlSystemCall);
    11.   g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
    12.   MappedSystemCallTable = (PVOID*)MmMapLockedPages(g_pmdlSystemCall, KernelMode);
    13.   (PVOID)InterlockedExchange((PLONG)&MappedSystemCallTable[proc], (LONG)NewZwWriteVirtualMemory);
    14.  
    15. // анхук
    16.   InterlockedExchange((PLONG)&MappedSystemCallTable[proc], (LONG)OldZwWriteVirtualMemory);
    17.   InterlockedExchange((PLONG)&MappedSystemCallTable[proc2], (LONG)OldZwOpenProcess);
    18.   if (g_pmdlSystemCall) {
    19.     MmUnmapLockedPages(MappedSystemCallTable, g_pmdlSystemCall);
    20.     IoFreeMdl(g_pmdlSystemCall);
    21.   }
     
  12. RUStx88

    RUStx88 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2010
    Сообщения:
    25
    но теперь другая трабла - не линкуется опять под х64, ругаясь на KeServiceDescriptorTable

    объявляется это дело так

    Код (Text):
    1. typedef struct ServiceDescriptorEntry {
    2.   unsigned int *ServiceTableBase;
    3.   unsigned int *ServiceCounterTableBase;
    4.   unsigned int NumberOfServices;
    5.   unsigned char *ParamTableBase;
    6. } ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;
    7.  
    8. extern PServiceDescriptorTableEntry KeServiceDescriptorTable;
    плиз, в чем трабла, как исправить
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    в x64 эта переменная не экспортируется.
     
  14. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    KeAddSystemServiceTable обращается к KeServiceDescriptorTable, можно оттуда взять ее адрес.