Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Закрытие процесса [D7, WinXP]


Страницы:   1 2 3 4 5

Alex870 ©   (2005-06-21 13:46:00) 

Подскажите пожалуйста, можно ли перехватить закрытие процесса моего приложения, выполнить какие-либо действия, а потом завершить процесс. Приложение у меня без формы:
program MyProg;
uses
Windows, messages;

var
M : tagMSG;

begin
while GetMessage( M, HInstance, 0, 0) do
   begin
    TranslateMessage(M);
    DispatchMessage(M);
   end;
end.

Если нет, подскажите, может создание формы поможет? Спасибо


MS-MEN   (2005-06-23 09:40:00) [21]

> Digitman ©   (23.06.05 09:31) [69]

Я лишь воспользовался идеей и создал свой драйвер
но все равно придерживаюсь ASSEMBLER это лучше
и многое адаптировано под  этот язык и вообще
Assembler как раз для этого и создано!


MS-MEN   (2005-06-23 09:35:00) [22]

Это не я открыл а просто хорошие люди подумали и посторались
http://rsdn.ru/article/delphi/kmdelphi.xml


Digitman   (2005-06-23 09:31:00) [23]


> Вот драйвер на DELPHI


т.е., как я понял, ты открыл Америку, умудрившись в Делфи версий выше 3-й собрать исп.модуль WDM-драйвера, одним нажатием Ctrl-F9, при том что дельфийские сборщики этих версий попросту не умеют строить образы WDM-драйверов, а объектные файлы, генерируемые дельфийскими компиляторами, несовместимы по формату с теми с которыми работает мелкомягкий линкер, заведомо умеющий строить эти образы ?)


MS-MEN   (2005-06-23 09:17:00) [24]

Пример второй.

unit Demo;

interface

{$DEFINE DEBUG}

{$INCLUDE Driver.inc}
{$INCLUDE Ntoskrnl.inc}

type
Pfar_jmp = ^far_jmp;
far_jmp=packed record
PuhsOp: byte;
PushArg: pointer;
RetOp: byte;
end;

PProtected = ^TProtected;
TProtected = packed record
 //Protected
 PrArray:array[0..255] of dword;
 PrCount:dword;
 //True
 TrArray:array[0..15] of dword;
 TrCount:dword;
end;

function DriverEntry(
 const DriverObject : PDRIVER_OBJECT;
 const RegistryPath : PUNICODE_STRING
 ) : NTStatus; stdcall;

var
 //Far Jmp
 JmpNtOpenProcess:PFar_Jmp;
 //Old Code
 OldNtOpenProcess:Far_Jmp;
 ProtProc:PProtected;
 NewNtOpenProcessAdr:pointer;
 Protect:TProtected;

implementation

{$INCLUDE Functions.inc}

const
MapingName:PWideChar = '\BaseNamedObjects\ProtectedProcesses';

{$IFDEF DEBUG}
 Procedure DeinstallHooks;
 begin
   //Снимаем перехватчик NtOpenProcess
   asm cli end;
   JmpNtOpenProcess.PuhsOp:=OldNtOpenProcess.PuhsOp;
   JmpNtOpenProcess.PushArg:=OldNtOpenProcess.PushArg;
   JmpNtOpenProcess.RetOp:=OldNtOpenProcess.RetOp;
   asm sti end;
 end;

 Procedure ADriverUnload(
             const DriverObject : PDRIVER_OBJECT
             ); stdcall;
 const
  LinkName   : PWideChar = '\DosDevices\WinHunterSecurity';
 var
  ULinkName:TUnicodeString;
 begin
 //Удаляем символическую ссылку
 RtlInitUnicodeString(@ULinkName,LinkName);
 IoDeleteSymbolicLink(@ULinkName);
 //удаляем устройство
 IoDeleteDevice(DriverObject.DeviceObject);
 //Снимаем перехваты
 DeinstallHooks;
 DbgPrint('Драйвер выгружен');
 end;
{$ENDIF}

//проверка наличия процесса в списке доверенных
Function IsTruePresent(const PID:dword):boolean;
var
r:dword;
begin
Result:=false;
for r:=0 to Protect.TrCount do
if PID = Protect.TrArray[r] then
  begin
  Result:=true;
  exit;
  end;
end;

Function TrueNtOpenProcess(phProcess:PDWORD;
                         AccessMask:DWORD;
                         ObjectAttributes:PObjectAttributes;
                         ClientID:PClientID):NTStatus;
begin
//Снимаем перехватчик
asm cli end;
 JmpNtOpenProcess.PuhsOp:=OldNtOpenProcess.PuhsOp;
 JmpNtOpenProcess.PushArg:=OldNtOpenProcess.PushArg;
 JmpNtOpenProcess.RetOp:=OldNtOpenProcess.RetOp;
asm sti end;
//Вызываем функцию
result:=NtOpenProcess(phProcess,AccessMask,
                      ObjectAttributes,ClientID);
//Устанавливаем перехватчик
asm cli end;
 JmpNtOpenProcess.PuhsOp:=$68;
 JmpNtOpenProcess.RetOp:=$c3;
 JmpNtOpenProcess.PushArg:=NewNtOpenProcessAdr;
asm sti end;
end;

Function NewNtOpenProcess(phProcess:PDWORD;
                         AccessMask:DWORD;
                         ObjectAttributes:PObjectAttributes;
                         ClientID:PClientID):NTStatus;stdcall;
var
r:dword;
CurrentProcess:dword;
begin
CurrentProcess:=PsGetCurrentProcessId;
//Проверяем запрещен ли доступ по маске
if (AccessMask <> PROCESS_QUERY_INFORMATION) and
//не открывается ли текущий процесс
  (ClientID.UniqueProcess <> CurrentProcess) and
//Разрешить открытие системой
  (CurrentProcess <> 4)// and
//нет ли процесса в списке доверенных
 // not IsTruePresent(CurrentProcess)
  then
  for r:=0 to Protect.PrCount+1 do
    if ClientID.UniqueProcess=Protect.PrArray[r] then //защищаемый процесс
     begin
     phProcess^:=0;
     Result:=STATUS_ACCESS_DENIED; //отказано в доступе
      {$IFDEF DEBUG}
       DbgPrint('OpenProcess Blocked');
      {$ENDIF}
     exit;
     end;
{$IFDEF DEBUG}
 DbgPrint('OpenProcess');
{$ENDIF}
//открыть процесс
Result:=TrueNtOpenProcess(phProcess,AccessMask,ObjectAttributes,ClientID);
end;

Procedure SinchronizeMapping;
var
hMapping:dword;
begin
//открываем маппинг
 hMapping:=OpenFileMapping(SECTION_MAP_READ,MapingName);
 if hMapping<>INVALID_HANDLE_VALUE then
    begin
     {$IFDEF DEBUG}
       DbgPrint('Маппинг открыт');
     {$ENDIF}
    ProtProc:=MapViewOfFileEx(hMapping,SECTION_MAP_READ, 0, 0,
                         255,pointer($7FFFFFFF));
    if ProtProc<>nil then
       begin
        {$IFDEF DEBUG}
          DbgPrint('Маппинг присоединен');
        {$ENDIF}
        //синхронизируем
       CopyMem(ProtProc,@Protect,SizeOf(TProtected));
       //Размапитть
       ZwUnmapViewOfSection(INVALID_HANDLE_VALUE,ProtProc);
       end;
    NtClose(hMapping);
    end;
end;

Function Create(
         DeviceObject:PDEVICE_OBJECT;
         Irp : PIRP
         ):NTStatus;stdcall;
begin
irp.IoStatus.Status:=STATUS_SUCCESS;
irp.IoStatus.Information:=0;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
result :=STATUS_SUCCESS;
//обновляем списки процессов
SinchronizeMapping;
{$IFDEF DEBUG}
 DbgPrint('Updated');
{$ENDIF}
end;

Function Control(
         DeviceObject:PDEVICE_OBJECT;
         Irp : PIRP
         ):NTStatus;stdcall;
var
data:pdword;
Control:PIO_STACK_LOCATION_CONTROL;
begin
irp.IoStatus.Status:=STATUS_SUCCESS;
irp.IoStatus.Information:=4;
data:=irp.AssociatedIrp.SystemBuffer;
//Control:=irp.Tail.Overlay.CurrentStackLocation;

DbgPrint(pchar(chr(data^)));
result :=STATUS_SUCCESS;
//data:=irp.CurrentStackLocation
//if data^=10 then DbgPrint('OK');
{$IFDEF DEBUG}
 DbgPrint('Writed');
{$ENDIF}
IoCompleteRequest(Irp,IO_NO_INCREMENT);
end;

Procedure SetHook;
begin
  NewNtOpenProcessAdr:=@NewNtOpenProcess;
 //Получаем адрес NtOpenProcess
 JmpNtOpenProcess:=GetRealPtr(@NtOpenProcess);
 //сохраняем старый код
 OldNtOpenProcess.PuhsOp:=JmpNtOpenProcess.PuhsOp;
 OldNtOpenProcess.PushArg:=JmpNtOpenProcess.PushArg;
 OldNtOpenProcess.RetOp:=JmpNtOpenProcess.RetOp;
 //Устанавливаем перехватчик
 asm cli end;
 JmpNtOpenProcess.PuhsOp:=$68;
 JmpNtOpenProcess.RetOp:=$c3;
 JmpNtOpenProcess.PushArg:=NewNtOpenProcessAdr;
 asm sti end;
end;

function DriverEntry;
const
 DeviceName : PWideChar = '\Device\WinHunterSecurity';
 LinkName   : PWideChar = '\DosDevices\WinHunterSecurity';
var
UDeviceName:TUnicodeString;
ULinkName:TUnicodeString;
Device:PDEVICE_OBJECT;
begin
 //Очищаем структуру
 ZeroMem(@Protect,SizeOf(TProtected));
 {$IFDEF DEBUG}
   DriverObject^.DriverUnload := @ADriverUnload;
 {$ENDIF}
 DriverObject^.MajorFunction[IRP_MJ_CREATE] := @Create;
 DriverObject^.MajorFunction[IRP_MJ_DEVICE_CONTROL] := @Control;
  {$IFDEF DEBUG}
    DbgPrint('Драйвер загрузился');
  {$ENDIF}

 //создаем устройство
 RtlInitUnicodeString(@UDeviceName,DeviceName);
 if IoCreateDevice(DriverObject,16,@UDeviceName,
                FILE_DEVICE_NULL,0,true,Device) = STATUS_SUCCESS then
    begin
    Device.Flags :=  DO_DIRECT_IO;
     {$IFDEF DEBUG}
       DbgPrint('Device Created');
     {$ENDIF}
    // создаем символическую ссылку
    RtlInitUnicodeString(@ULinkName,LinkName);
    if IoCreateSymbolicLink(@ULinkName,@UDeviceName) = STATUS_SUCCESS then
       begin
         {$IFDEF DEBUG}
           DbgPrint('LinkCreated');
         {$ENDIF}
         SinchronizeMapping;
       //Устанавливаем перехват
       SetHook;
       end;
    end;
Result := STATUS_SUCCESS;
end;

end.


MS-MEN   (2005-06-23 09:13:00) [25]

Кстати для VisualBasic это не трудно перевести
так как VB это почти и даже тот-же DELPHI.


MS-MEN   (2005-06-23 09:11:00) [26]

Достали :( ;)

Вот драйвер на DELPHI который я делал для своего Firewall

unit Demo;

interface

{$I bcDDK_Root.inc}
{$I bcDDK_Io.inc}

CONST
     
     ProjectName = 'ProcHunter';
     ProjectDescription = 'ProcessHunter';

     DriverNameString = '\Device\'+ProjectName;
     DeviceNameString = '\DosDevices\'+ProjectName;
     EventNameString  = '\BaseNamedObjects\'+ProjectName;
     UserModeDeviceName = '\\.\Global\'+ProjectName;
     UserModeEventName = 'Global\'+ProjectName;

     IOCTL_PSHUNT_GET_HOOKINFO   =
     (IOCTL_UNKNOWN_BASE shl 16) or
     ((FILE_READ_ACCESS) shl 14) or
     ($800 shl 2) or
     (METHOD_BUFFERED);

TYPE
     PProcessHookInfo = ^TProcessHookInfo;

     TProcessHookInfo = record
     ParentId : Cardinal;
     ProcessId : Cardinal;
     Create : LongBool;
    end;

function DriverEntry(
                    const DriverObject : PDRIVER_OBJECT;
                    const RegistryPath : PUNICODE_STRING
                    ) : NTStatus; stdcall;

implementation

{$I bcDDK_Debug.inc}
{$I bcDDK_NtStatus.inc}
{$I bcDDK_Rtl.inc}
{$I bcDDK_IoMacros.inc}
{$I bcDDK_Ps.inc}
{$I bcDDK_Zw.inc}
{$I bcDDK_Ke.inc}
{$I bcDDK_Mm.inc}
{$I bcDDK_BCore.inc}

var // strings
   DriverName    : UNICODE_STRING;
   DeviceName    : UNICODE_STRING;
   EventName     : UNICODE_STRING;
   // internal fields
   DeviceObject  : PDEVICE_OBJECT;
   NotifyEvent   : THandle;
   NotifyPKEVENT : PKEVENT;
   // interface variables
   ProcHookInfo  : TProcessHookInfo;

procedure CREATE_PROCESS_HOOK(const Parent : THandle;const Process :
THandle;const Create : DDKBoolean); stdcall;
begin
  ProcHookInfo.ParentId:=Parent;
  ProcHookInfo.ProcessId:=Process;
  ProcHookInfo.Create:=Create;
  KeSetEvent(NotifyPKEVENT,0,False);
  KeClearEvent(NotifyPKEVENT);
end;

procedure ADriverUnload
(const DriverObject : PDRIVER_OBJECT); stdcall;
begin
// -4. Stop Process Hooking
  PsSetCreateProcessNotifyRoutine(CREATE_PROCESS_HOOK,True);
// -3. Close Notify Event
  ZwClose(NotifyEvent);
// -2. Delete Symbolic Link
  IoDeleteSymbolicLink(@DeviceName);
// -1. Delete Device
  IoDeleteDevice(DeviceObject);
end;

function PSHuntCreateCloseDispatch(
        const DeviceObject : PDEVICE_OBJECT;
        const Irp : PIRP) : NTSTATUS; stdcall;
begin
  Irp^.IoStatus.ISBUnion.Status:=STATUS_SUCCESS;
  Irp^.IoStatus.Information:=0;
  IoCompleteRequest(Irp,IO_NO_INCREMENT);
  Result:=STATUS_SUCCESS;
end;

function PSHuntIOCTLDispatch(
        const DeviceObject : PDEVICE_OBJECT;
        const dIrp : PIRP) : NTSTATUS; stdcall;
var IRPStack : PIO_STACK_LOCATION;
BEGIN
 IRPStack:=IoGetCurrentIrpStackLocation(dIrp);
 CASE IRPStack^.Parameters.DeviceIoControl.IoControlCode OF
 IOCTL_PSHUNT_GET_HOOKINFO :
 BEGIN
 if  (IRPStack^.Parameters.DeviceIoControl.OutputBufferLength>=SizeOf(TProcessHookInfo))
 and (dIrp.AssociatedIrp.SystemBuffer<>nil) then
 BEGIN
 // load
 TProcessHookInfo(dIrp.AssociatedIrp.SystemBuffer^):=ProcHookInfo;
 dIrp.IoStatus.Information:=SizeOf(TProcessHookInfo);
 // report
 Result:=STATUS_SUCCESS;
 END
 else Result:=STATUS_UNSUCCESSFUL;
 END;
 ELSE Result:=STATUS_NOT_IMPLEMENTED;
END;
IoCompleteRequest(dIrp,IO_NO_INCREMENT);
END;

function DriverEntry;
begin
// 1. Create and initialize device object
RtlInitUnicodeString(DriverName,DriverNameString);
Result:=IoCreateDevice(
                       DriverObject,
                       0,
                       @DriverName,
                       FILE_DEVICE_UNKNOWN,
                       0,
                       False,
                       DeviceObject
                       );
if (Result=STATUS_SUCCESS) then
 BEGIN
  // 2. Create and initialize symbolic link
  RtlInitUnicodeString(DeviceName,DeviceNameString);
  Result:=IoCreateSymbolicLink(@DeviceName,@DriverName);
  if (Result=STATUS_SUCCESS) then
   BEGIN
    // 3. Create Notification Event
    RtlInitUnicodeString(EventName,EventNameString);
    NotifyPKEVENT:=IoCreateNotificationEvent(@EventName,@NotifyEvent);
    if (NotifyPKEVENT<>nil) then
     BEGIN
      KeClearEvent(NotifyPKEVENT);
      // 4. Establish Process Hooking
      Result:=PsSetCreateProcessNotifyRoutine(CREATE_PROCESS_HOOK,False);
      if (Result=STATUS_SUCCESS) then
       BEGIN
        // 5.1. Initialize Internal Structures
        // 5.2. Initialize Event Handlers
        DriverObject^.DriverUnload:=ADriverUnload;
        DriverObject^.MajorFunction[IRP_MJ_CREATE]:=PSHuntCreateCloseDispatch;
        DriverObject^.MajorFunction[IRP_MJ_CLOSE]:=PSHuntCreateCloseDispatch;

DriverObject^.MajorFunction[IRP_MJ_DEVICE_CONTROL]:=PSHuntIOCTLDispatch;
       END;
      if (Result<>STATUS_SUCCESS) then ZwClose(NotifyEvent);
     END
      else Result:=STATUS_UNSUCCESSFUL;
    // 3.c. check and cleanup
    if (Result<>STATUS_SUCCESS) then IoDeleteSymbolicLink(@DeviceName);
   END;
  // 2.c. check and cleanup
  if (Result<>STATUS_SUCCESS) then IoDeleteDevice(DeviceObject);
 END;
end;

end.


Digitman   (2005-06-23 08:54:00) [27]

про драйвер на VB мне тоже прелюбопытно было бы узнать)

я бы еще и на драйвер на Делфи (Д3 - не в счет) с удовольствием подивился)


> MS-MEN


не сподобишься ли продемонстрировать ? хотя бы скелет ?)


Kerk   (2005-06-22 23:22:00) [28]

MS-MEN ©   (22.06.05 23:19) [63]

Так пример драйвера на VB будет?


MS-MEN   (2005-06-22 23:19:00) [29]

> Игорь Шевченко
Я не чего против не имею просто знание драйверов это
говорит о том что ты дествительнно углубленно знаешь.

Перехват я каснул только и за того что тема заставила сказаьть.

И вообще ты модер закрой эту тему..! Хватит пальцы нагинать ;)


Игорь Шевченко   (2005-06-22 22:43:00) [30]

MS-MEN ©   (22.06.05 19:47) [59]


>  Тебе не кажется что ты сам пальцы загибаешь?


Мне можно.


>  Тебе автор нормальнно сказал прочти статью нормальнно
>  там нет не каких жестких перехватов. Он лишь показывает
>  как работать с сис. ф-ями в нулевом кольце что жестко
>  относится к драйверам.


Да я ее читал. Я читать умею. Я и примеры смотрел. И не увидел, на какой хрен такие драйверы вообще пишут, кроме как показать свою немерянную крутость.

А что до драйверов, позволяющих пользователюработать с функциями ядра, так их еще в 2000 году Свен Шрайбер описал, так что бинома Ньютона тут нету. При этом, заметь, Свен пальцы не гнул, какой он крутой, а приводил реальные примеры, когда такую функциональность можно использовать. А у автора (читай - у тебя) все исключительно на скрытие/неснятие и прочую хрень нацелено.

Alexander Panov ©   (22.06.05 20:41) [60]


> ВОобще, снобизм - характерная черта системщиков еще с
> незапамятных времен ЕС ЭВМ.


А за наезд за системщиков ответить ? Ты учти, я не один, я Коншина позову :)


Kerk   (2005-06-22 20:56:00) [31]

MS-MEN ©   (22.06.05 17:51) [56]
ASM/ VB/VC/DELPHI


Ну-ка, ну-ка...


Alexander Panov   (2005-06-22 20:41:00) [32]

MS-MEN ©   (22.06.05 19:47) [59]
Вот приставь себе, не знаю.


Ну тогда, как я понимаю, ты и сравнить не можешь.
Ограниченность ни к чему хорошему не приводит.
ВОобще, снобизм - характерная черта системщиков еще с незапамятных времен ЕС ЭВМ.


MS-MEN   (2005-06-22 19:47:00) [33]

> Игорь Шевченко [56]
 Тебе не кажется что ты сам пальцы загибаешь?
 
 Тебе автор нормальнно сказал прочти статью нормальнно
 там нет не каких жестких перехватов. Он лишь показывает
 как работать с сис. ф-ями в нулевом кольце что жестко
 относится к драйверам.

> Alexander Panov
 Вот приставь себе, не знаю.


Игорь Шевченко   (2005-06-22 18:02:00) [34]

MS-MEN ©   (22.06.05 17:51) [56]


> Люди просто так не будут создавать драйвера, поверь мне.


Они будут создавать драйвера для скрытия/неснятия процессов, упиваться собственной крутостью и гнуть пальцы, что есть силы.

Лучше закончи архитектурный институт или изобрети самодвижущееся пресс-папье, толку будет гораздо больше, чем от скрытых процессов, поверь.


Alexander Panov   (2005-06-22 17:53:00) [35]

MS-MEN ©   (22.06.05 17:51) [56]
а знание системы это больше
чем ваше ООП программирование и не каждый возьмется за это.


Снобизм?;)

Спор ни о чем.
Знание каждой области необходимо и системному, и прикладному программисту. Но разной степени глубины.

Ты знаешь ООП?


MS-MEN   (2005-06-22 17:51:00) [36]

> Игорь Шевченко
> Только то, что не стоит выдавать за профессионализм
> использование драйверов.

Ладно, будем считать, по-твоему.

Каждый знающий Assembler и умет работать с системой
то я бы сказал, что это не для начинающих.

Люди просто так не будут создавать драйвера, поверь мне.

Я, например, могу создавать драйвера на ASM/VB/VC/DELPHI
так как системный программист, а знание системы это больше
чем ваше ООП программирование и не каждый возьмется за это.


Игорь Шевченко   (2005-06-22 17:12:00) [37]

MS-MEN ©   (22.06.05 16:47) [54]

Только то, что не стоит выдавать за профессионализм использование драйверов.


MS-MEN   (2005-06-22 16:47:00) [38]

> Игорь Шевченко
> Пальцы не гни, ладно ?
> А то пишешь слова с ошибками, а пальцы гнешь.

И что ты хочешь мне этим сказать?


Alex870   (2005-06-22 16:22:00) [39]


> Это, конечно, тоже способ, но при этом можно в лог записать
> только факт завершения наблюдаемого процесса, но не действия,
> предшествующие завершению. Поэтому я присоединяюсь к [33]

Дело в том, что при определении трафика я использую IPHelper, т.е. драйвером Windows, поэтому потеря результатов работы программы меня не пугает - их просто нет, всю информацию можно получить с помощью драйвера и после завершения основного модуля.


Игорь Шевченко   (2005-06-22 16:04:00) [40]

alpet ©   (22.06.05 15:40) [51]

Это, конечно, тоже способ, но при этом можно в лог записать только факт завершения наблюдаемого процесса, но не действия, предшествующие завершению. Поэтому я присоединяюсь к [33]


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо