Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Закрытие процесса   Найти похожие ветки 

 
KosilkA ©   (2005-06-22 11:10) [40]


> Например, Process Explorer, показывающий много всего увлекательного
> без драйверов.

Это от SysInternals который? Если зайти в диспетчер устройств>Вид>Показывать скрытые устройства то можно увидеть "PROCEXP", интересно что это? И с regmon"ом такая-же история=)


 
Alex870   (2005-06-22 11:29) [41]


> Перехватывай ф-ций ядра, таким образом, не кто (ламер) не
> сможет
> снять процесс, а также если есть опыт по защите то и профилю
>
> будет лень :)

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


 
MS-MEN ©   (2005-06-22 11:32) [42]

> Игорь Шевченко

Это можно и без системных вызовов решить просто надо знать ф-ций.

Например NativeAPI в них 80%  ф-ций которые можно использовать
как в третям кольце, так и в нулевом это  лишь для WinNT платформ.

А что ты хочешь предложить вместо перехвата? Как ты собираешься
узнать, что процесс завершается методом Terminate Process? А если
на уровне нулевого кольца грохну? То даже перехват Win / Native –API
не помогут.

В - общем, другим способом решить это не возможно.

Я ещё раз говорю применение драйверов это означает что
Что над программой работали профессионалы. (Если это
касается системы) А применение WinAPI или коротко API
это только для третьего кольца.

> kaZaNoVa ©   (22.06.05 01:22) [28]
> DEBUG не помогла:(

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

{ убивание процесса отладочным методом }
Function DebugKillProcess(ProcessId: dword): boolean;
var
pHandle: dword;
myPID: dword;
HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
r: dword;
begin
Result := false;
myPID := GetCurrentProcessId();
if not EnableDebugPrivilege() then Exit;
//подключаемся к системе отладки и получаем DebugObject
if DbgUiConnectToDbg() <> STATUS_SUCCESS then Exit;
pHandle := OpenProcessEx(ProcessId);
//включаем отладку процесса
if DbgUiDebugActiveProcess(pHandle) <> STATUS_SUCCESS then Exit;
//надо найти полученный DebugObject
HandlesInfo := GetInfoTable(SystemHandleInformation);
if HandlesInfo = nil then Exit;
for r := 0 to HandlesInfo^.NumberOfHandles do
 if (HandlesInfo^.Information[r].ProcessId = myPID) and
    (HandlesInfo^.Information[r].ObjectTypeNumber = $8)  //DebugObject
    then begin
      //закрываем DebugObject, что приводит к уничтожению отлаживаемого процесса
      CloseHandle(HandlesInfo^.Information[r].Handle);
      Result := true;
      break;
    end;
VirtualFree(HandlesInfo, 0, MEM_RELEASE);
end;


 
MS-MEN ©   (2005-06-22 11:39) [43]

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

Извини, наверное, не так понял :(  Я думал ты собираешься
защитить от завершение.

Тогда можно просто создать маленьки на ASM или API
монитор вот и все.

:) Мозги Игорь Шевченко заморочил тоже мой извинение.


 
Игорь Шевченко ©   (2005-06-22 13:50) [44]

MS-MEN ©   (22.06.05 11:32) [42]


> Я ещё раз говорю применение драйверов это означает что
> Что над программой работали профессионалы.


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

KosilkA ©   (22.06.05 11:10) [40]

А ты не от администратора запусти. Удивись.


 
alpet ©   (2005-06-22 13:57) [45]

А чем вариант в [35] не устраивает? Или мульти-процессный подход сложным кажется? Помоему там единственная сложность - правильная отработка после завершения убитого процесса, которую к тому-же можно упростить, расшарив между процессами регион памяти. Во всяком случае второй процесс в этом случае сможет скинуть в файл данные которые не успел обработать второй процесс и записать в лог о не нормальном завершении.


 
kaZaNoVa ©   (2005-06-22 14:01) [46]

Игорь Шевченко ©   (22.06.05 10:50) [39]

> Например, Process Explorer, показывающий много всего
> увлекательного без драйверов.

я когда-то запускал Process Explorer без прав админа, он намного меньше информации показывал:(
(например вкладка Perfomance процесса - вообще нет инфы), имхо вывод - Process Explorer может нормально работать и выдавать всю информацию только с правами админа..


 
BiN ©   (2005-06-22 14:07) [47]

Alex870   (21.06.05 13:46)

Единственно верный ответ тебе уже дали в [33]. Остальное - от лукавого.


 
Alex870   (2005-06-22 15:14) [48]

Спасибо всем!
Наверно [35] это единственный правильный подход к решению проблемы. Я думаю что на этом обсуждение можно закрыть, а то это скоро перейдет в категорию "потрепаться". Еще раз всем спасибо!


 
Игорь Шевченко ©   (2005-06-22 15:20) [49]


> Наверно [35] это единственный правильный подход к решению
> проблемы


[35] тебе не поможет, в твоем случае, так как все, что гарантирует этот способ - это повторный запуск, а вовсе не перехват завершения и выполнение некоторых действий перед завершением.


 
Alex870   (2005-06-22 15:32) [50]


> [35] тебе не поможет, в твоем случае, так как все, что гарантирует
> этот способ - это повторный запуск, а вовсе не перехват
> завершения и выполнение некоторых действий перед завершением

Я же писал, что мне нужно оставить запись в логе при закрытии процесса (время, кем, инфа о трафике). Как ведет логи Kerio Winroute я не знаю, но там это реализовано (хотя winroute это служба).


 
alpet ©   (2005-06-22 15:40) [51]

Игорь Шевченко ©   (22.06.05 15:20) [49]

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


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

alpet ©   (22.06.05 15:40) [51]

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


 
Alex870   (2005-06-22 16:22) [53]


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

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


 
MS-MEN ©   (2005-06-22 16:47) [54]

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

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


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

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

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


 
MS-MEN ©   (2005-06-22 17:51) [56]

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

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

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

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

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


 
Alexander Panov ©   (2005-06-22 17:53) [57]

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


Снобизм?;)

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

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


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

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


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


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

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


 
MS-MEN ©   (2005-06-22 19:47) [59]

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

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


 
Alexander Panov ©   (2005-06-22 20:41) [60]

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


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


 
Kerk ©   (2005-06-22 20:56) [61]

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


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


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

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


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


Мне можно.


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


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

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

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


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


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


 
MS-MEN ©   (2005-06-22 23:19) [63]

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

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

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


 
Kerk ©   (2005-06-22 23:22) [64]

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

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


 
Digitman ©   (2005-06-23 08:54) [65]

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

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


> MS-MEN


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


 
MS-MEN ©   (2005-06-23 09:11) [66]

Достали :( ;)

Вот драйвер на 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.


 
MS-MEN ©   (2005-06-23 09:13) [67]

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


 
MS-MEN ©   (2005-06-23 09:17) [68]

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

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.


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


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


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


 
MS-MEN ©   (2005-06-23 09:35) [70]

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


 
MS-MEN ©   (2005-06-23 09:40) [71]

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

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


 
Kerk ©   (2005-06-23 09:43) [72]

MS-MEN ©   (23.06.05 9:40) [71]
но все равно придерживаюсь ASSEMBLER


Полтора-два года назад наверно так же бы сказал.
Сейчас повзрослел. :o)


 
Digitman ©   (2005-06-23 10:06) [73]


> MS-MEN ©   (23.06.05 09:35) [70]
> Это не я открыл а просто хорошие люди подумали и посторались


так там же черным по белому написано (цитирую) :

Delphi версии выше 3 создают несовместимый с Intel OMF формат, хотя и внешне похожий
..

Опция, позволяющая сгенерировать объектный файл, в компиляторах Borland есть, но из-за внесенных Borland изменений формата такие объектные файлы понимают лишь компиляторы самой Borland, а сборщик Microsoft не распознаёт их как корректные


и это проверено, и это так и есть на самом деле, по кр.мере вплоть до Д7)


 
MS-MEN ©   (2005-06-23 10:21) [74]

Давно бы так. )


 
Digitman ©   (2005-06-23 10:34) [75]

вот именно)

ну так и как же ты умудрился написать WDM-драйвер в Делфи вервии выше тройки ?)


 
MS-MEN ©   (2005-06-23 10:41) [76]

>Digitman
>вот именно)
>ну так и как же ты умудрился написать WDM-драйвер в Делфи >вервии выше тройки ?)

ну так и как же ты умудрился написать WDM-драйвер
Что ты тормозишь? Я тебе ещё раз говорю это SYS драйвер!

Где ты видел что бы я писал выше тройки? компилятор у меня 3 :D


 
Digitman ©   (2005-06-23 11:12) [77]


>  ещё раз говорю это SYS драйвер


> Что ты тормозишь?


вот ты про свой SYS шарманку завел)

причем здесь расширение имени файла-то ?)

файл исп.модуля драйвера вправе иметь произвольное расширение (просто по дифолту НТ-драйверы режима ядра принято именовать с расширением SYS), но сам бин.образ драйвера обязан соответствовать одной из поддерживаемых системой моделей)


> Где ты видел что бы я писал выше тройки?


а где ты об этом упомянул ранее ?)

ты тычешь и тычешь в статью, будто ее никто кроме тебя не читал)..

и ежу понятно что в 3-ке было кое-что допустимо в этом плане, в отличие от старших версий !) ...

Но ! Даже в 3-йке создать НТ-драйвер режима ядра нельзя БЕЗ привлечения стороннего линкера) ... А уж когда привлечен нештатный для Делфи-среды инструментарий, утверждение о том что ты "создал драйвер в Делфи" липовое - все равно так или иначе ты сходил на поклон к Майкрософту и взял у него сборщик для означенной цели)


 
MS-MEN ©   (2005-06-23 12:14) [78]

Я тебя не понял.

Знаешь если ты такой умный так сам и разберись!

Зачем я код драйвера выложил :(

Закрыто.


 
Digitman ©   (2005-06-23 12:27) [79]


> Зачем я код драйвера выложил


а шут тебя знает) ... мож ты пуп земли зондируешь) .. нет бы просто ссылку привести в кач-ве своего imho))

затем, вероятно, чтобы подтвердить диагноз ИШ)

вся эта марахайка твоя, разумеется, компилируется без проблем, и речь не об этом)

и это, кстать, не столь интересно, сколь твои заявы насчет VB) ...


 
Koresh   (2005-06-23 15:13) [80]

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

Хы, Вы то как писали на своем Delphi, так и останетесь, а здесь через пару лет поменяют систему- и ты не у дел.
Но "лучше 30 лет питаться свежей кровью, чем 300 лет падалью."



Страницы: 1 2 3 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.69 MB
Время: 0.06 c
14-1130314880
Opilki_Inside
2005-10-26 12:21
2005.11.20
Написание Help a


1-1130395821
VG
2005-10-27 10:50
2005.11.20
Диараммы в отчетах


14-1130000776
Дельфятник
2005-10-22 21:06
2005.11.20
Подскажите, пожалуйста, как устанавливать dpk-файлы в Delphi.


1-1130422795
френк
2005-10-27 18:19
2005.11.20
Как отловить закрытие TPopupMenu?


3-1128941214
alex_1234
2005-10-10 14:46
2005.11.20
ADO, dBASE, create table: ошибка синтаксиса при определении поля.