![]() |
|
|Ѳорум| |
Комментарии к статье «Перехват API функций в Windows NT (часть 1). Основы перехвата.» |
|
ssx /2005-05-16 11:51:26/
аттачи не качаются... :(
/2005-05-16 21:20:41/
Поправлено.
/2005-05-17 13:08:11/
я может не очень внимательно читал, но не нашел своего любимого способа - патчинг SDT, описанного у Шрайбера. Для приличия можно было бы просто упомянуть
/2005-05-18 01:59:48/
Windows до 20000 года врят ли дотянет, а так - интересно...
/2005-05-18 14:36:29/
В статье про перехват Native API из драйвера
http://wasm.ru/print.php?article=apihook_3 есть такой фрагмент: VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { ULONG CR0Reg; DPRINT("Driver unloaded"); //снимаем перехват __asm { cli // запрещаем прерывания mov eax, cr0 mov CR0Reg,eax and eax,0xFFFEFFFF // сбросить WP bit mov cr0, eax } NTCALL(OpenProcId) = TrueNtOpenProcess; __asm { mov eax, CR0Reg mov cr0, eax // востановить содержимое CR0 sti // разрешаем прерывания } return; } так вот, что дает запрет прервыаний??? Ведь на момент попытки выгрузки драйвера любой из потоков может уже находиться в теле обработчика внутри драйвера. Или я что-то не так понял?
/2005-05-18 16:50:57/
В статье про перехват Native API из драйвера
http://wasm.ru/print.php?article=apihook_3 есть такой фрагмент: VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { ULONG CR0Reg; DPRINT("Driver unloaded"); //снимаем перехват __asm { cli // запрещаем прерывания mov eax, cr0 mov CR0Reg,eax and eax,0xFFFEFFFF // сбросить WP bit mov cr0, eax } NTCALL(OpenProcId) = TrueNtOpenProcess; __asm { mov eax, CR0Reg mov cr0, eax // востановить содержимое CR0 sti // разрешаем прерывания } return; } так вот, что дает запрет прервыаний??? Ведь на момент попытки выгрузки драйвера любой из потоков может уже находиться в теле обработчика внутри драйвера. Или я что-то не так понял?
/2005-05-18 16:52:28/
Запрет прерываний нужен для того, чтобы поток не прерваля и никуда не убежал с сброшенным WP битом.
Ну а ситуация с потоком внутри обработчика возможна, для ее предотвращения можно копировать обработчик в другую область памяти и не освобождать ее, или просто не выгружать драйвер. А лучше не ставить хуки слишком часто, раз поставил и все. В любом случае безглючное решение этой проблемы простым не будет, так как придется проверять контексты всех потоков и не убирать перехват до тех пор, пока хоть один из них находится внутри обработчика.
/2005-05-21 15:54:47/
Про сплаисинг.
Зачем приостонавливать потоки? Например я реализовал перехват ф-ий так: Откопировал, первые 3-4 инструкции в свой буфер. При вызове ф-ии пробегаю по буферу и делаю джамп на адрес ф-ии + жлинна этих ф-ий. И нет гемора с приостановкои потоков. Единственная заноза, это перенастроика относительных колов.
/2005-08-19 14:55:06/
мож я не прав а нельзя ли записать в межсекционное пространство kernel32.dll или ntdll.dll код обработчика ведь они вроде маппятся по одинаковым адресам во все процессы и тады не нада будет инжектить dll в каждый процесс
/2005-08-19 16:01:55/
мож я не прав а нельзя ли записать в межсекционное пространство kernel32.dll или ntdll.dll код обработчика ведь они вроде маппятся по одинаковым адресам во все процессы и тады не нада будет инжектить dll в каждый процесс
/2005-11-19 13:47:12/
Вопрос, а вот по пути AppInit_Dlls моя библиотека будет подгружена после того как в процесс загрузятся все библиотеки или после того как загрузится user32.dll ?
/2006-04-15 23:41:04/
В куске кода
Function NewZwQuerySystemInformation(ASystemInformationClass: dword; ASystemInformation: Pointer; ASystemInformationLength: dword; AReturnLength: PCardinal): NTStatus; stdcall; var Info, Prev: PSYSTEM_PROCESSES; begin Result := TrueZwQuerySystemInformation(ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength); if (ASystemInformationClass = SystemProcessesAndThreadsInformation) and (Result = STATUS_SUCCESS) then begin Info := ASystemInformation; while(Info^.NextEntryDelta > 0) do begin Prev := Info; Info := pointer(dword(Info) + Info^.NextEntryDelta); if lstrcmpiw(Info^.ProcessName.Buffer, 'winlogon.exe') = 0 then Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta; end; end; end; Надо немного по другому Function NewZwQuerySystemInformation(ASystemInformationClass: dword; ASystemInformation: Pointer; ASystemInformationLength: dword; AReturnLength: PCardinal): NTStatus; stdcall; var Info, Prev: PSYSTEM_PROCESSES; begin Result := TrueZwQuerySystemInformation(ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength); if (ASystemInformationClass = SystemProcessesAndThreadsInformation) and (Result = STATUS_SUCCESS) then begin Info := ASystemInformation; while(Info^.NextEntryDelta > 0) do begin Prev := Info; Info := pointer(dword(Info) + Info^.NextEntryDelta); if lstrcmpiw(Info^.ProcessName.Buffer, 'winlogon.exe') = 0 then if Info^.NextEntryDelta=0 then Prev^.NextEntryDelta:=0 else Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta; end; end; end; end; Потому что, если скрываемый процесс последний в списке, то Info^.NextEntryDelta=0 и строка Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta; ничего не делает
/2006-07-18 23:27:47/
Извините за наивный вопрос, но почему недостаточно сплайсинга, выполненного из одного процесса? Ведь, например, user32.dll подгружается ко всем процессам одна и та же, но при изменении ее в одном процессе она остается неизменной в другом.
/2006-09-27 23:32:41/
В приаттаченной программе ProcHide есть такая строка: LoadLibrary('hide.dll');
Но когда такую строку пропишешь в сервисе, то почему-то никакие другие процессы не удается скрыть... :-( Теперь некоторые ответы на предыдущие вопросы: Мне удавалось подменять один раз нужную подпрограмму (ничего я не инжектил) И другие проги ТОЖЕ выполняли мой код. Скажу по-точнее: Я "перегрузил" MessageBoxA в моей программе. Вместо этой функции на диске С: создавался файл. Так вот! Когда в Тотале выбираешь "О программе...", то на диске С: тоже создавался файл. А коду-то всего ничего: procedure SetHook; begin PtrZwq := GetProcAddress(GetModuleHandle('User32.dll'), 'MessageBoxA'); ReadProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes); JmpZwq.PuhsOp := $68; JmpZwq.PushArg := @FuckingMessageBoxA; JmpZwq.RetOp := $C3; WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @JmpZwq, SizeOf(far_jmp), Bytes); end; Правда Тотал немного подключивал... - не хотел тот файл удалять. Но через "Мой компьютер" удалялось!
/2007-01-05 10:15:11/
IMHO:
1. Вместо приостановки потоков стоит использовать средства синхронизации, например CriticalSection 2. Защищать критической секцией нужно также вызов оригинальной (True...) ф-ции
/2007-09-14 17:18:34/
По поводу проги Logon- при попытке замещения этой DLL-кой MSGina.dll, и перезагрузке, возникает сообщение вида "Невозможно загрузить DLL mslogon.dll пользовательского интерфейса входа". Из исходников компилил,- тоже самое.
/2008-07-22 22:36:03/
test
/2008-07-22 22:37:45/
function NewZwResumeThread(ThreadHandle: THandle;
PreviousSuspendCount: pdword); stdcall; функция не возвращаемая значения - это процедура, так должно быть: procedure NewZwResumeThread(ThreadHandle: THandle; PreviousSuspendCount: pdword); stdcall;
/2008-12-16 00:04:58/
При попытке скомпилить hide.dpr в дельфе вылезает ошибка:
NativeAPI.dcu not found Гуглил, ничего не нашёл, подскажите как проблему решить
Введите логин и пароль, под которыми вы зарегистрированы на θоруме WASM.RU. |