Задача — перехватить несколько функций из kernel32.dll. Это все необходимо в масштабах всей системы. Хотелось бы локализовать перехват в одном месте т.е. непосредственно в источнике путем изменения таблицы экспотра kernel32.dll. Вопрос - возможно такое или нет ? Нужен простой ответ - стоит заморачиваться или это невозможно ?
нет, потому что есть такая вещь, как виртуальное адресное пространство. допустим, ты в kernel32.dll заменишь CreateFileA, допустим, на адрес 11223344 (на самом деле там стоят RVA, но не суть). В одном процессе по этому адресу может быть память, а в другом - нет, потому что адрес виртуальный. Во-вторых, в таблице экспорта стоят RVA точек входа Чтобы глобально все перехватить, нужно в каждом процессе подменить таблицу импорта. + отслеживать создание новых процессов. за примером бегом в журнал Хакер за март 2005 года (кажется), статья горла "Программа-невидимка"
blockhead А почему нет, всё реально. Сплайсинг довольно удобно здесь использовать, в принципе можно и экспорт менять, но это более геморно. Great Ему же вроде не надо глобально. На 98 глобально можно.
Booster =) 98-я со своим разделяемым системным пространством давно пылится на сдшках у меня в шкафу. ее уже не юзает почти никто кстати там придется извратиться, потому что адрес-то опять же виртуальный. придется грузить свой хукер в разделяемую область Самое удобное - это сплайсинг. Никакого геморроя. Подмена импорта тихо курит в сторонке. Ну а про подмену SDT я вообще молчу...
>> Это все необходимо в масштабах всей системы дык какие проблемы, проинжектится во все процессы, + перехватывать CreateProcess для инжекта в те которые будут запускаться (могу дать сорец если нужно) а вообще если уж нужен глобалный перехват то написать драйвер который будет хукать нужные системные сервисы куда проще и надёжнее
Код (Text): // Disable Write-Protection on kernel pages DWORD DisableWP() {__asm{ mov ebx, cr0 mov eax, ebx and ebx, 0xFFFEFFFF mov cr0, ebx }} // Restore old CR0 register void RestoreWP(DWORD OldCR0) {__asm{ mov eax, [OldCR0] mov cr0, eax }} NTSTATUS SetKernelSplicingHook(PVOID pfnDst, PVOID pfnHook, BYTE buffer[5]) { __try { // Backup RtlCopyMemory(buffer, pfnDst, 5); // Disable WriteProtection (WP) DWORD dwOldCR0 = DisableWP(); // Write JMP DWORD offset = (DWORD) pfnHook - (DWORD) pfnDst - 5; *(BYTE*)pfnDst = 0xE9; // JMP FAR *(DWORD*)((DWORD)pfnDst+1) = offset; // Restore old CR0 register RestoreWP(dwOldCR0); return STATUS_SUCCESS; } __except(EXCEPTION_EXECUTE_HANDLER) { return GetExceptionCode(); } } NTSTATUS UnsetKernelSplicingHook(PVOID pfnDst, BYTE buffer[5]) { __try { // Disable WriteProtection (WP) DWORD dwOldCR0 = DisableWP(); // Restore RtlCopyMemory(pfnDst, buffer, 5); // Restore old CR0 register RestoreWP(dwOldCR0); return STATUS_SUCCESS; } __except(EXCEPTION_EXECUTE_HANDLER) { return GetExceptionCode(); } }
Всем спасибо, особенно за оперативность )). Буду хапать создание процесса и загружать библиотеку на уровне ядра.