Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Контроль за процессом

6.8K
09 марта 2007 года
Coffein
46 / / 07.03.2005
Добрый день! Помогите в следующем вопросе:

с помощью каких функций можно осуществить контроль за процессом. Т.е. например мне нужно запретить обращение какого то процесса к папке, файлу или какому либо другому ресурсу.
18K
09 марта 2007 года
max_br
34 / / 10.12.2006
Через стандартные ф-и никак.
Торлько при помощи API Hook.
Перехватываеш то чем он обращаеться и делаеш с ним что тебе надо.
261
09 марта 2007 года
ahilles
1.5K / / 03.11.2005
т.е. он хотел сказать что в обработчике перехватываемой функции, смотришь если допустим функции передан в качестве параметра путь к запрещённому файлу, то возвращаешь INVALIDE_HANDLE_VALUE
6.8K
09 марта 2007 года
Coffein
46 / / 07.03.2005
Цитата: ahilles
т.е. он хотел сказать что в обработчике перехватываемой функции, смотришь если допустим функции передан в качестве параметра путь к запрещённому файлу, то возвращаешь INVALIDE_HANDLE_VALUE



ahilles, а пример какой-нибуть функции подскажи пожалуста. У меня есть примерчик Фленова по перехвату пороля, но что то лажа, там рассматривается не та функция.

334
09 марта 2007 года
HexEdit
809 / / 27.07.2006
Перехватываешь CreateFileA/CreateFileW... Либо NtCreateFile/ZwCreateFile
ну и дальше как сказал ahilles,
[quote=ahilles]смотришь если допустим функции передан в качестве параметра путь к запрещённому файлу, то возвращаешь INVALIDE_HANDLE_VALUE[/quote]
18K
09 марта 2007 года
max_br
34 / / 10.12.2006
если пример перехвата, то вот так для коннекта запретить соединение с каким либо адресом (переделать для другой ф-и проблем думаю не составит)

Код:
#include "APIHook.h"
.....
static int (WINAPI*TrueConnect)(SOCKET s,const SOCKADDR_IN* name,int namelen);
.....
int __stdcall Hconnect(SOCKET s,const SOCKADDR_IN* name,int namelen)
{
  if(name->.sin_addr.s_addr == inet_addr("12.34.56.78")) return -1;
  return TrueConnect(s,name,namelen);
}
.....
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   if (reason==DLL_PROCESS_ATTACH)
   {
     // лутше всего добавить проверку на тему точно ли ет тот процесс
       TrueConnect = (int(__stdcall*)(unsigned int,const struct sockaddr FAR*,int))SetAPIHookByName("wsock32.dll","connect",Hconnect);
    };
  ....
}
.....


загружаеш свою длл-ку в интересующий тебя процесс

использовал свою библиотечку, возможно она местами корявая.
6.8K
09 марта 2007 года
Coffein
46 / / 07.03.2005
Цитата: max_br
если пример перехвата, то вот так для коннекта запретить соединение с каким либо адресом (переделать для другой ф-и проблем думаю не составит)
загружаеш свою длл-ку в интересующий тебя процесс

использовал свою библиотечку, возможно она местами корявая.



Спасибо большое! Дальше разбирусь. Ну а если что, я думаю поможите! ;)

6.8K
08 апреля 2007 года
Coffein
46 / / 07.03.2005
Поздравляю с Праздником светлой Пасхи! Христос Воскресе!

Подскажите пожалуста, при нажатии кнопки мыши генерируется событие HC_ACTION, а какое событие генирируется при двойном нажатии?
6.8K
08 апреля 2007 года
Coffein
46 / / 07.03.2005
Помогите пожалуйста решить следующий вопрос:

необходимо перехватить событие открытия или копирования некоторого файла(папки). Подскажите какое именно событие нужно ждать и какие парамметры проверять.
261
09 апреля 2007 года
ahilles
1.5K / / 03.11.2005
тебе надо перехватывать функцию createfile в соответствующем процессе
4.6K
09 апреля 2007 года
Tokolist
268 / / 22.03.2007
Можно использовать для папок

 
Код:
FindFirstChangeNotification
FindNextChangeNotification
FindCloseChangeNotification


Для реестра

 
Код:
RegNotifyChangeKeyValue
6.8K
27 апреля 2007 года
Coffein
46 / / 07.03.2005
Долго мучаясь накидал следующее:
Код:
library Hook;

uses
  Windows,
  advApiHook;

{$R *.res}

const
  MutexName='__API_HOOK';

var
SH:HHOOK = 0;

  CopyFileNextHook: function (lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL; stdcall;

//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

function CopyFileHookProc(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL; stdcall;
begin
  MessageBox(0, 'Функция: CopyFile', 'Позволить ?', MB_YESNO or MB_ICONQUESTION);
end;

function MsgProc(code:DWORD;wParam,lparam:DWORD):DWORD;stdcall;
begin
  CallNextHookEx(SH,code,wParam,lparam);
end;

procedure SetWindowsHook(e:Boolean); stdcall;
var
  M:THandle;
begin
  if e then
   begin
    m:=CreateMutex(0,false,MutexName);
    if m=0 then exit;
    SH:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,HInstance,0);
   end
       else
    UnhookWindowsHookEx(sh);
end;

procedure HandleEvents(reason: integer);
begin
  case reason of
    DLL_PROCESS_ATTACH:
      begin
        SetWindowsHook(true);
        HookProc('kernel32.dll', 'CopyFileW', @CopyFileHookProc, @CopyFileNextHook);
      end;
    DLL_PROCESS_DETACH:
      begin
        SetWindowsHook(false);  
        UnhookCode(@CopyFileNextHook);
      end;
  end;
end;

   //     HandleEvents(DLL_PROCESS_DETACH);

begin
  DllProc := @HandleEvents;
  MessageBox(0, 'Запускаем дллку', 'Позволить ?', MB_YESNO or MB_ICONQUESTION);
  HandleEvents(DLL_PROCESS_ATTACH);
///  CopyFile('C:\test.txt','C:\test1.txt',true);
end.
end.


ВСе вроде бы как работает, перехватывает функцию CopyFileA()(создал свое приложение, которое вызывает эту функцию), да то ка проблема в том что в Винде почему то копирование не перехватывает. Не пойму почему, может винда чем то другим пользуется, или дллка не цепляется к explorer'у? ПОдскажите в чем касяк?
261
28 апреля 2007 года
ahilles
1.5K / / 03.11.2005
копировать можно через другие функции или просто через CreateFile Readfile/Writefile
6.8K
30 апреля 2007 года
Coffein
46 / / 07.03.2005
Цитата: ahilles
копировать можно через другие функции или просто через CreateFile Readfile/Writefile



ahilles, пробывал как ты посоветовал, перехватывал функцию CreateFile, других приложений перехватывает, а в винде нет.

4.6K
01 мая 2007 года
Tokolist
268 / / 22.03.2007
Цитата: Coffein
ahilles, пробывал как ты посоветовал, перехватывал функцию CreateFile, других приложений перехватывает, а в винде нет.



99% что Эксплорер использует функцию SHFileOperation

334
01 мая 2007 года
HexEdit
809 / / 27.07.2006
А, как вариант, попробовать перехватывать NtCreateFile, ... и т. д. в R0 ?
261
01 мая 2007 года
ahilles
1.5K / / 03.11.2005
это тоже вариант, в любом вслучае любой user mode код который работает с файлами вызовет NtCreateFile, но у неё больше параметров и для начинающего это будет сложно
6.8K
01 мая 2007 года
Coffein
46 / / 07.03.2005
Меня трудности не пугают, было бы у кого поспрашать. Подскажите что знаете, что могло бы помочь осуществить перехват в Винде Api-функций.
6.8K
02 мая 2007 года
Coffein
46 / / 07.03.2005
Цитата: Tokolist
99% что Эксплорер использует функцию SHFileOperation



Пробывал ее перехватывать, но результат такой же, на меня ноль эмоций =(

6.8K
02 мая 2007 года
Coffein
46 / / 07.03.2005
А может кто подсказать где можно скачать файлы модулей, которые описывают структуры и функции библиотеки ntdll.dll для Дельфи?
334
02 мая 2007 года
HexEdit
809 / / 27.07.2006
Цитата: Coffein
А может кто подсказать где можно скачать файлы модулей, которые описывают структуры и функции библиотеки ntdll.dll для Дельфи?


Уже было, юзай поиск )
http://forum.codenet.ru/showthread.php?t=34320

6.8K
02 мая 2007 года
Coffein
46 / / 07.03.2005
Спасибо, скачал!
6.8K
18 июня 2007 года
Coffein
46 / / 07.03.2005
Цитата: ahilles
т.е. он хотел сказать что в обработчике перехватываемой функции, смотришь если допустим функции передан в качестве параметра путь к запрещённому файлу, то возвращаешь INVALIDE_HANDLE_VALUE



Я перехватил функцию

NtOpenFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK; ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;

Как мне определить к какому файлу произошло обращение.

261
18 июня 2007 года
ahilles
1.5K / / 03.11.2005
ObjectAttributes.ObjectName Но там формате PUnicodeString
а точнее ObjectAttributes.ObjectName.Buffer
6.8K
19 июня 2007 года
Coffein
46 / / 07.03.2005
Точно, а как же мне вернуть INVALIDE_HANDLE_VALUE, если проверка не успешна?
261
19 июня 2007 года
ahilles
1.5K / / 03.11.2005
обработчик примерно будет такой (delphi)
 
Код:
function NewNtCreateFile(....)....
begin
  if <проверка> then
    result:=OldNtCreateFile(......);
     else
    begin
     result:=SEVERITY_ERROR; ///(3 или $C0000000, точно не помню)
     FileHandle^:=INVALID_HANDLE_VALUE;//(-1)
     exit;
    end;

но это врядли верно, но должно пойти
6.8K
20 июня 2007 года
Coffein
46 / / 07.03.2005
Спасибо ahilles, вот что получилось. Прошу взгянуть и указать на скрытую ошибку. Программа работает, но часто вылазиет сообщение об ошибке по какому то адресу.

Код:
library Hook;

uses
  Windows, advApiHook,
  NTSTATUSDEFS,
  HSNtDef,
  NtDll;

{$R *.res}

const
  MutexName='__API_HOOK';

var
SH:HHOOK = 0;
  NtCreateFileNextHook: function (FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;
                    ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock;
                    AllocationSize: PLARGE_INTEGER;  FileAttributes, ShareAccess, CreateDisposition, CreateOptions: ULONG;
                    EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall;
  NtOpenFileNextHook: function (FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;  ObjectAttributes: POBJECT_ATTRIBUTES;
                    IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;

////////////////////////////////////////////////////////////////////////////////

{*
function NtCreateFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;
  ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock;
  AllocationSize: PLARGE_INTEGER;
  FileAttributes, ShareAccess, CreateDisposition, CreateOptions: ULONG;
  EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall;

begin
end;
  *}
function NtOpenFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;  ObjectAttributes: POBJECT_ATTRIBUTES;
                    IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
var
  res : NTSTATUS;
  err : Integer;
  text : PUNICODE_STRING;
  f:hFile;
  buffer,st :string;
  rwd : DWORD;
begin
  res:=NtOpenFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions);
  if res = STATUS_SUCCESS then begin
//--
    err:=GetLastError;
    f:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
               nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
    if f <> INVALID_HANDLE_VALUE then begin
      try
        buffer:=#13+#10+'NtOpenFile: ';
        SetFilePointer(f,0,0,FILE_END);
        WriteFile(f,buffer[1],length(buffer),rwd,nil);
        text:= ObjectAttributes.ObjectName;
        st := WideCharToString(text.Buffer);
        WriteFile(f,st[1],length(st),rwd,nil);
      finally
        CloseHandle(f);
        SetLastError(err);
      end;
    end;
//--

    if (st = 'C:\test.txt') then begin
      CloseHandle(FileHandle^);
      FileHandle^:=INVALID_HANDLE_VALUE;
      res:=STATUS_OBJECT_NAME_NOT_FOUND;
    end;
  end;
  result:=res;
end;

function MsgProc(code:DWORD;wParam,lparam:DWORD):DWORD;stdcall;
begin
  CallNextHookEx(SH,code,wParam,lparam);
end;

procedure SetWindowsHook(e:Boolean); stdcall;
var
  M:THandle;
begin
  if e then
   begin
    m:=CreateMutex(0,false,MutexName);
    if m=0 then exit;
    SH:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,HInstance,0);
   end
       else
    UnhookWindowsHookEx(sh);
end;

procedure HandleEvents(reason: integer)export;stdcall;
begin
  case reason of
    DLL_PROCESS_ATTACH:
      begin
        SetWindowsHook(true);
        //HookProc('ntdll.dll', 'NtCreateFile', @NtCreateFileHookProc, @NtCreateFileNextHook);
        HookProc('ntdll.dll', 'NtOpenFile', @NtOpenFileHookProc, @NtOpenFileNextHook);
      end;
    DLL_PROCESS_DETACH:
      begin
        SetWindowsHook(false);
        //UnhookCode(@NtCreateFileNextHook);
        UnhookCode(@NtOpenFileNextHook);
      end;
  end;
end;

begin
  DllProc := @HandleEvents;
  MessageBox(0, 'Запускаем дллку', 'Позволить ?', MB_YESNO or MB_ICONQUESTION);
  HandleEvents(DLL_PROCESS_ATTACH);
end.
261
21 июня 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: Coffein

Код:
function NtOpenFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;  ObjectAttributes: POBJECT_ATTRIBUTES;
                    IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
var
  res : NTSTATUS;
  err : Integer;
  text : PUNICODE_STRING;
  f:hFile;
  buffer,st :string;
  rwd : DWORD;
begin
  res:=NtOpenFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions);
  if res = STATUS_SUCCESS then begin
//--
    err:=GetLastError;
    f:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
               nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
    if f <> INVALID_HANDLE_VALUE then begin
      try
..........
      finally
.....
      end;
    end;
//--

    if (st = 'C:\test.txt') then begin
      CloseHandle(FileHandle^);
      FileHandle^:=INVALID_HANDLE_VALUE;
      res:=STATUS_OBJECT_NAME_NOT_FOUND;
    end;
  end;
  result:=res;
end;


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

 
Код:
if (st = 'C:\test.txt') then begin
      CloseHandle(FileHandle^);
      FileHandle^:=INVALID_HANDLE_VALUE;
      res:=STATUS_OBJECT_NAME_NOT_FOUND;
    end;

этот код на надо в самое начало
6.8K
22 июня 2007 года
Coffein
46 / / 07.03.2005
Цитата: ahilles
перехватом NtOpenFile невозможно получить контроль над процессом.


это так, просто сразу с реализацией контроля над процессом не получилось. Поэтому стал эксперементировать просто на перехвате, в частности NtOpenFile, и записи результата в лог. Но это не суть важно, как и ниже следующий код

 
Код:
if (st = 'C:\test.txt') then begin
      CloseHandle(FileHandle^);
      FileHandle^:=INVALID_HANDLE_VALUE;
      res:=STATUS_OBJECT_NAME_NOT_FOUND;
    end;


Просто осталась одна проблема - "это ошибка по адресу ...". Не могу понять, в чем причина. Помоги разобраться.
257
22 июня 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=Coffein]Просто осталась одна проблема - "это ошибка по адресу ...". Не могу понять, в чем причина.[/quote]
приложи архив с проектом. какую версию advApiHook используешь? не пробовал ли ты вместо NTSTATUSDEFS, HSNtDef, NtDll использовать NativeAPI от того же Ms-Rem'а? используется ли в каком-либо из юнитов SysUtils? и напоследок: что у тебя за машинка, какая ОС, наличие заплаток и т.д. - подробней плиз.
261
22 июня 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: kosfiz
не пробовал ли ты вместо NTSTATUSDEFS, HSNtDef, NtDll использовать NativeAPI от того же Ms-Rem'а?


извините на лирическое отступление: а где их можно скачать?

6.8K
22 июня 2007 года
Coffein
46 / / 07.03.2005
Цитата: kosfiz
приложи архив с проектом. какую версию advApiHook используешь?



Какая версия advApiHook я не знаю ... скачал с какого то сайта.

Цитата:

не пробовал ли ты вместо NTSTATUSDEFS, HSNtDef, NtDll использовать NativeAPI от того же Ms-Rem'а? используется ли в каком-либо из юнитов SysUtils?


Как раз их и использую. SysUtils ни где не использую.

Цитата:

и напоследок: что у тебя за машинка, какая ОС, наличие заплаток и т.д. - подробней плиз.



проц Athlon XP 1700+, озу 256, ОС Windows XP SP2 больше ничего.

Архив прикрепил.

257
24 июня 2007 года
kosfiz
1.6K / / 18.09.2005
Цитата: ahilles
извините на лирическое отступление: а где их можно скачать?


ну вообще можно воспользоваться поиском по форуму, т.к. я где-то уже ссылку давал или сходить сюда http://kladovka.net.ru/index.cgi?pid=dir&rid=8&ppn=2

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

6.8K
25 июня 2007 года
Coffein
46 / / 07.03.2005
Окей, жду коментариев.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог