Помогите снять защиту памяти процесса от записи

Тема в разделе "WASM.WIN32", создана пользователем gloomyraven, 28 мар 2010.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    вряд ли он будет маленьким... снятия перехвата реализовывать придется...
     
  2. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    да чё там его снимать, 2 варианта:
    1) SSDT хук - снять легко, сравниваем сдт в файле и в памяти
    2) инлайн патчинг - тоже самое, сравниваем инструкции в ф-ции в памяти и с оригиналом в файле
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Twister
    Какой есчо бакдор. Это отладочный функционал, разумеется он разный в версиях. На XP работает. Легальный способ изменять ядерную память это дров, если комуто не подходит используйте эксплоиты.
    Rel
    Чтобы из ядра писать в память никакие перехваты снимать не нужно. Переключить адресное пространство или напрямую физическую память юзать.
     
  4. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Ты хоть как его назови, но суть от этого не изменится - это дыра в безопасности, вполне осознанно созданная разработчиками. Лично для меня чистой воды бакдор, так же как и физикалмемори :)
     
  5. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    PhysicalMemory начиная с Win 2k3 SP1 для r3 отменяется =)
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    да... но если автор не может обойти перехват одной функции в ринг3, у него наверняка возникнут проблемы с тем, что ты сказал... никого не хочу обидеть, но, мне кажется, тогда уж проще перехват снимать))))

    спасибо, Кеп!
     
  7. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    А то, всегда готов!
    Ты же видел у меня в подписи К.О. - Капитан Очевидность ;)
     
  8. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    t
    именно так и было сделано, драйвер и вправду не маленький получился
    Код (Text):
    1. NTSTATUS Ioctl_WriteProcess( IN PIRP pIrp, IN ULONG ulMethod)
    2. {
    3.     PIO_STACK_LOCATION pStack;
    4.     ULONG ulInputLen;
    5.     ULONG ulOutputLen;
    6.     PPACKET_WRITE pPacketWrite;
    7.     void *pvDestVA;
    8.     unsigned int destPID;
    9.     unsigned int dwSize;
    10.     unsigned char *pchBuff = NULL;
    11.     ULONG ulWritten;
    12.     NTSTATUS ns;
    13.  
    14.     PMDL pMdl =NULL;
    15.     PKPROCESS pKProcess;
    16.     HANDLE hProcess;
    17.     OBJECT_ATTRIBUTES oaProcess;
    18.     void *pvDestSystemVA;
    19.     CLIENT_ID clientID;
    20.  
    21.     PAGED_CODE();
    22.    
    23.     // TODO
    24.     pStack = IoGetCurrentIrpStackLocation(pIrp);
    25.  
    26.     //__asm int 3h;
    27.     //__asm nop;
    28.     //__asm int 3h;
    29.     DbgPrint("[IoControlWrite]");
    30.  
    31.     if (ulMethod != METHOD_BUFFERED)
    32.     {
    33.         DbgPrint("[Ioctl_WriteProcess] failed: u must use METHOD_BUFFERED!!!\n");
    34.         return STATUS_INVALID_PARAMETER;
    35.     }
    36.  
    37.     pPacketWrite = (PPACKET_WRITE)(pIrp->AssociatedIrp.SystemBuffer);
    38.     DbgPrint("[Ioctl_WriteProcess]: METHOD_BUFFERED\n");
    39.    
    40.     ulInputLen = pStack->Parameters.DeviceIoControl.InputBufferLength;
    41.     ulOutputLen = pStack->Parameters.DeviceIoControl.OutputBufferLength;
    42.     if (ulOutputLen < sizeof(unsigned int))
    43.         return STATUS_INVALID_BLOCK_LENGTH;
    44.  
    45.     if (ulInputLen != sizeof(PACKET_WRITE))
    46.         return STATUS_INVALID_BLOCK_LENGTH;
    47.  
    48.  
    49.     dwSize = pPacketWrite->size;
    50.     if (dwSize>PACKET_WRITE__MAX_ADD_LEN)
    51.         return STATUS_INVALID_PARAMETER;
    52.    
    53.  
    54.     pchBuff = (unsigned char*)(pPacketWrite->buff);
    55.    
    56.     pvDestVA = pPacketWrite->pvDestVA;
    57.     if ((ULONG_PTR)pvDestVA >= (ULONG)0x7fff0000)
    58.         return STATUS_INVALID_PARAMETER;
    59.    
    60.  
    61.     // открываем процесс в правами PROCESS_VM_WRITE | PROCESS_SUSPEND_RESUME
    62.     memset(&oaProcess, 0, sizeof(OBJECT_ATTRIBUTES));
    63.     oaProcess.Length = sizeof(OBJECT_ATTRIBUTES);
    64.     oaProcess.ObjectName =NULL; // Так как указан clientID, определяем в NULL
    65.     destPID = pPacketWrite->destPID;
    66.     clientID.UniqueProcess = (HANDLE)destPID;
    67.     clientID.UniqueThread =0;
    68.     InitializeObjectAttributes(&oaProcess, NULL, 0, NULL, NULL);
    69.     ns = pfOrigZwOpenProcess(
    70.             &hProcess,
    71.             PROCESS_VM_WRITE | PROCESS_SUSPEND_RESUME,
    72.             &oaProcess,
    73.             &clientID);
    74.     if (!NT_SUCCESS(ns))
    75.     {
    76.         DbgPrint("[Ioctl_WriteProcess] cann't open process by pid{%d} error{%x}\n", destPID, ns);
    77.         return ns;
    78.     }
    79.     else
    80.     {
    81.         ns = ObReferenceObjectByHandle(
    82.                     hProcess,
    83.                     PROCESS_VM_WRITE,
    84.                     *PsProcessType,
    85.                     KernelMode,
    86.                     &pKProcess,
    87.                     NULL);
    88.         if (!NT_SUCCESS(ns))
    89.         {
    90.             DbgPrint("[Ioctl_WriteProcess] failed: cann't resolve PKPROCESS for {%d} error {%x}\n", destPID, ns);
    91.         }
    92.         else
    93.         {
    94.             KeAttachProcess(pKProcess);
    95.             // проверяем доступность целевого адреса на запись
    96.             __try
    97.             {
    98.                 ProbeForWrite(pvDestVA, dwSize, sizeof(unsigned char));
    99.             }
    100.             __except(EXCEPTION_EXECUTE_HANDLER)
    101.             {
    102.                 DbgPrint("[Ioctl_WriteProcess] failed: user-mode address {0x%p} not valid\n", pvDestVA);
    103.                 KeDetachProcess();
    104.                 ObDereferenceObject(pKProcess);
    105.                 ZwClose(hProcess);
    106.                 return STATUS_INVALID_ADDRESS;
    107.             }
    108.             // мапим User-mode страницу в ядро
    109.             pMdl = MmCreateMdl(NULL, pvDestVA, (ULONG)dwSize);
    110.             if (NULL==pMdl)
    111.             {
    112.                 DbgPrint("[Ioctl_WriteProcess] failed: cann't create MDL for {%x} in process {%d}\n", pvDestVA, destPID);
    113.             }
    114.             else
    115.             {
    116.                 MmBuildMdlForNonPagedPool(pMdl);
    117.                 pMdl->MdlFlags |= MDL_MAPPED_TO_SYSTEM_VA;
    118.                 pvDestSystemVA = MmMapLockedPages(pMdl, KernelMode);
    119.                 if (NULL ==pvDestSystemVA)
    120.                 {
    121.                     DbgPrint("[Ioctl_WriteProcess] failed: cann't map process VM into kernel\n");
    122.                 } //,tp nhelf yt dsnfobim
    123.                 else
    124.                 {
    125.                     DbgPrint("[Ioctl_WriteProcess] info: process page {%x} mapped into kernel VM {%x}\n", pvDestVA, pvDestSystemVA);
    126.                     __try
    127.                     {
    128.                         memcpy(pvDestSystemVA, pchBuff, dwSize);
    129.                     }
    130.                     __except(EXCEPTION_EXECUTE_HANDLER)
    131.                     {
    132.                         DbgPrint("[IoCtl_WriteProcess] failed: exception has ocurred in during write\n");
    133.                     }
    134.                     MmUnmapLockedPages(pvDestSystemVA, pMdl);
    135.                 }
    136.                 IoFreeMdl(pMdl);
    137.             }
    138.  
    139.             KeDetachProcess();
    140.             ObDereferenceObject(pKProcess);
    141.         }
    142.         ZwClose(hProcess);
    143.     }
    144.     return ns;
    145. }
    Так все работает, но я не знаю как исключить одновременную запись в процесс моим драйвером, процессом, в который пишем, и другими драйверами в системе. сервиса zwSuspendProcess в winXP нету, есть в win7
     
  9. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    я просто сначала запаниковал ))))))
     
  10. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Заинжектились бы в процесс и локально бы записали что хотели, зачем Вам столько гемора с удаленной записью?
     
  11. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Защищающий драйвер перехватывает в SSDT zwOpenProcess, szWriteVirtualMemory -> из юзер мода нормальным способом не записать. Остается либо снимать хуки с SSDT, либо из драйвера писать в физическую память
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    я вам выше написал два нормальных способа...
     
  13. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Rel
    Которые нормально не работают и являются говном.
     
  14. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    дак че, с моим дриверов плохая идея? ведь работает, только вопрос в синхронизации записи (up)
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    смотря откуда рука растут и есть ли голова на плечах...
     
  16. Clerk

    Clerk Забанен

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