Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.68 MB
Время: 0.039 c
11-1111908939
Serr
2005-03-27 11:35
2005.11.20
Вопрос по базам


3-1129108339
msguns
2005-10-12 13:12
2005.11.20
ADO+Access. Как в параметре задать NULL


14-1130330178
Megabyte
2005-10-26 16:36
2005.11.20
Чужой код


14-1130303971
Ega23
2005-10-26 09:19
2005.11.20
С днем рождения! 26 октября


2-1131051786
StasStas
2005-11-04 00:03
2005.11.20
Не сделать элементарную вещь ...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский