Windows Assembly Site |Новости| |О проекте| |Неофиту| |Эѳир| |Ссылки| |Ѳорум|

Комментарии к статье «Перехват API функций в Windows NT (часть 1). Основы перехвата.»

· Статьи
· Исходники
· Инструменты
· Документация

Статьи:
· Низкоуровневое программирование для дZенствующих
· Уроки Iczelion'а
· COM и OOP
· DirectX/OpenGL
· Секреты Win32
· Оптимизация
· Компиляторы
· Защита от отладки
· Вирусология
· Безопасность
· Сеть
· Программерский дZен
· Форматы файлов
· Процессоры
· Диски, приводы и электроника
· BIOS/CMOS
· DOS навсегда!
· Исследование программ
· Защищенный режим
· Алгоритмы
· Консоли и КПК
· Байт-код
· Linux/Unix
· Assembler.Ru
· Разное

ssx /2005-05-16 11:51:26/
аттачи не качаются... :(
Aquila /2005-05-16 21:20:41/
Поправлено.
Broken Sword /2005-05-17 13:08:11/
я может не очень внимательно читал, но не нашел своего любимого способа - патчинг SDT, описанного у Шрайбера. Для приличия можно было бы просто упомянуть
Tim Sobolev /2005-05-18 01:59:48/
Windows до 20000 года врят ли дотянет, а так - интересно...
Wolfgang /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;
}

так вот, что дает запрет прервыаний??? Ведь на момент попытки выгрузки драйвера любой из потоков может уже находиться в теле обработчика внутри драйвера. Или я что-то не так понял?
Wolfgang /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;
}

так вот, что дает запрет прервыаний??? Ведь на момент попытки выгрузки драйвера любой из потоков может уже находиться в теле обработчика внутри драйвера. Или я что-то не так понял?
Ms Rem /2005-05-18 16:52:28/
Запрет прерываний нужен для того, чтобы поток не прерваля и никуда не убежал с сброшенным WP битом.
Ну а ситуация с потоком внутри обработчика возможна, для ее предотвращения можно копировать обработчик в другую область памяти и не освобождать ее, или просто не выгружать драйвер. А лучше не ставить хуки слишком часто, раз поставил и все. В любом случае безглючное решение этой проблемы простым не будет, так как придется проверять контексты всех потоков и не убирать перехват до тех пор, пока хоть один из них находится внутри обработчика.
SammIk /2005-05-21 15:54:47/
Про сплаисинг.
Зачем приостонавливать потоки?
Например я реализовал перехват ф-ий так:
Откопировал, первые 3-4 инструкции в свой буфер.
При вызове ф-ии пробегаю по буферу и делаю джамп на
адрес ф-ии + жлинна этих ф-ий.
И нет гемора с приостановкои потоков.
Единственная заноза, это перенастроика относительных колов.
vurdalak /2005-08-19 14:55:06/
мож я не прав а нельзя ли записать в межсекционное пространство kernel32.dll или ntdll.dll код обработчика ведь они вроде маппятся по одинаковым адресам во все процессы и тады не нада будет инжектить dll в каждый процесс
vurdalak /2005-08-19 16:01:55/
мож я не прав а нельзя ли записать в межсекционное пространство kernel32.dll или ntdll.dll код обработчика ведь они вроде маппятся по одинаковым адресам во все процессы и тады не нада будет инжектить dll в каждый процесс
Codeblight /2005-11-19 13:47:12/
Вопрос, а вот по пути AppInit_Dlls моя библиотека будет подгружена после того как в процесс загрузятся все библиотеки или после того как загрузится user32.dll ?
Ender /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; ничего не делает
maxdiver /2006-07-18 23:27:47/
Извините за наивный вопрос, но почему недостаточно сплайсинга, выполненного из одного процесса? Ведь, например, user32.dll подгружается ко всем процессам одна и та же, но при изменении ее в одном процессе она остается неизменной в другом.
wp2 /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;

Правда Тотал немного подключивал... - не хотел тот файл удалять. Но через "Мой компьютер" удалялось!
AVS /2007-01-05 10:15:11/
IMHO:
1. Вместо приостановки потоков стоит использовать средства синхронизации, например CriticalSection
2. Защищать критической секцией нужно также вызов оригинальной (True...) ф-ции
Andronick /2007-09-14 17:18:34/
По поводу проги Logon- при попытке замещения этой DLL-кой MSGina.dll, и перезагрузке, возникает сообщение вида "Невозможно загрузить DLL mslogon.dll пользовательского интерфейса входа". Из исходников компилил,- тоже самое.
jCronuz /2008-07-22 22:36:03/
test
jCronuz /2008-07-22 22:37:45/
function NewZwResumeThread(ThreadHandle: THandle;
PreviousSuspendCount: pdword); stdcall;

функция не возвращаемая значения - это процедура, так должно быть:

procedure NewZwResumeThread(ThreadHandle: THandle;
PreviousSuspendCount: pdword); stdcall;
Specialistik /2008-12-16 00:04:58/
При попытке скомпилить hide.dpr в дельфе вылезает ошибка:
NativeAPI.dcu not found
Гуглил, ничего не нашёл, подскажите как проблему решить

Логин:

Пароль:

Введите логин и пароль, под которыми вы зарегистрированы на θоруме WASM.RU.
Enter your login and password which you are using on WASM Θorum.





© 2002-2009 wasm.ru - all rights reserved and reversed