Перехват API-вызовов через таблицу экспорта

Тема в разделе "WASM.WIN32", создана пользователем blockhead, 21 фев 2007.

  1. blockhead

    blockhead New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2007
    Сообщения:
    11
    Задача — перехватить несколько функций из kernel32.dll. Это все необходимо в масштабах всей системы. Хотелось бы локализовать перехват в одном месте т.е. непосредственно в источнике путем изменения таблицы экспотра kernel32.dll. Вопрос - возможно такое или нет ? Нужен простой ответ - стоит заморачиваться или это невозможно ?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    нет, потому что есть такая вещь, как виртуальное адресное пространство.
    допустим, ты в kernel32.dll заменишь CreateFileA, допустим, на адрес 11223344 (на самом деле там стоят RVA, но не суть). В одном процессе по этому адресу может быть память, а в другом - нет, потому что адрес виртуальный.
    Во-вторых, в таблице экспорта стоят RVA точек входа

    Чтобы глобально все перехватить, нужно в каждом процессе подменить таблицу импорта. + отслеживать создание новых процессов. за примером бегом в журнал Хакер за март 2005 года (кажется), статья горла "Программа-невидимка"
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    blockhead
    А почему нет, всё реально. Сплайсинг довольно удобно здесь использовать, в принципе можно и экспорт менять, но это более геморно.

    Great
    Ему же вроде не надо глобально.
    На 98 глобально можно.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Booster
    =)

    98-я со своим разделяемым системным пространством давно пылится на сдшках у меня в шкафу. ее уже не юзает почти никто :) кстати там придется извратиться, потому что адрес-то опять же виртуальный. придется грузить свой хукер в разделяемую область


    Самое удобное - это сплайсинг. Никакого геморроя. Подмена импорта тихо курит в сторонке.
    Ну а про подмену SDT я вообще молчу...
     
  5. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> Это все необходимо в масштабах всей системы
    дык какие проблемы, проинжектится во все процессы, + перехватывать CreateProcess для инжекта в те которые будут запускаться (могу дать сорец если нужно)
    а вообще если уж нужен глобалный перехват то написать драйвер который будет хукать нужные системные сервисы куда проще и надёжнее
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    вот и я про то же +) ну хотя это не проще тем, кто драйверов ядра никогда не писал.
     
  7. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    из ядра засплайси - будет сразу и для всех
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1. // Disable Write-Protection on kernel pages
    2. DWORD DisableWP()
    3. {__asm{
    4.     mov ebx, cr0
    5.     mov eax, ebx
    6.     and ebx, 0xFFFEFFFF
    7.     mov cr0, ebx
    8. }}
    9.  
    10. // Restore old CR0 register
    11. void RestoreWP(DWORD OldCR0)
    12. {__asm{
    13.     mov eax, [OldCR0]
    14.     mov cr0, eax
    15. }}
    16.  
    17.  
    18. NTSTATUS SetKernelSplicingHook(PVOID pfnDst, PVOID pfnHook, BYTE buffer[5])
    19. {
    20.     __try
    21.     {
    22.         // Backup
    23.         RtlCopyMemory(buffer, pfnDst, 5);
    24.  
    25.         // Disable WriteProtection (WP)
    26.         DWORD dwOldCR0 = DisableWP();
    27.  
    28.         // Write JMP
    29.         DWORD offset = (DWORD) pfnHook - (DWORD) pfnDst - 5;
    30.         *(BYTE*)pfnDst = 0xE9; // JMP FAR
    31.         *(DWORD*)((DWORD)pfnDst+1) = offset;
    32.  
    33.         // Restore old CR0 register
    34.         RestoreWP(dwOldCR0);
    35.  
    36.         return STATUS_SUCCESS;
    37.     }
    38.     __except(EXCEPTION_EXECUTE_HANDLER)
    39.     {
    40.         return GetExceptionCode();
    41.     }
    42. }
    43.  
    44. NTSTATUS UnsetKernelSplicingHook(PVOID pfnDst, BYTE buffer[5])
    45. {
    46.     __try
    47.     {
    48.         // Disable WriteProtection (WP)
    49.         DWORD dwOldCR0 = DisableWP();
    50.  
    51.         // Restore
    52.         RtlCopyMemory(pfnDst, buffer, 5);
    53.  
    54.         // Restore old CR0 register
    55.         RestoreWP(dwOldCR0);
    56.  
    57.         return STATUS_SUCCESS;
    58.     }
    59.     __except(EXCEPTION_EXECUTE_HANDLER)
    60.     {
    61.         return GetExceptionCode();
    62.     }
    63. }
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    А прерывания кто будет отрубать?
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Пушкин, конечно )

    зы. сегодня я дико уставший. несу бред. лучше мне ничего не постить =\
     
  11. blockhead

    blockhead New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2007
    Сообщения:
    11
    Всем спасибо, особенно за оперативность )). Буду хапать создание процесса и загружать библиотеку на уровне ядра.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    наверное, все таки драйвер +)