Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2007, 12:28   #1
Coffein
 
Регистрация: 17.06.2007
Сообщений: 3
По умолчанию Перехват Апи-функций доступа к файловой сиcтеме

Всем Привет!!! ПОМОГИТЕ! Попал в тупик, вот код дллки:
Код:
library Hook;
uses
  Windows, advApiHook,
   HSNtDef,
   NtDll;
{$R *.res}
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
  NtCreateFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize,
                          FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength);
end;
 
function NtOpenFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;  ObjectAttributes: POBJECT_ATTRIBUTES;
                    IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
begin

  NtOpenFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions);
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
    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.
Получается вот какая штука, когда ее запускаешь она подгружается ко всем процессам и начинает перехватывать NtOpenFile. Но дело в том что я ссылку на старую функцию сохраняю сюда:
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;
А винда такое ощущение что вызывает перехватываемую функцию постоянно, и получается так что ссылка на старую функцию все время перезаписывается на в новь отловленную. При этом если я хочу запустить какой нибуть экзешник или просмотреть текстовик, то вылазиет ошибка чтто, типа не правильно указаны парамметры. Посоветуйте как быть.
Вложения
Тип файла: rar DLL.rar (50.5 Кб, 32 просмотров)
http://z.alko-net.ru/ - ZBlog. Блог о программировании и не только.
Coffein вне форума Ответить с цитированием
Старый 17.06.2007, 15:53   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

функция NtOpenFile это оболочка вокруг функции NtCreateFile, она в любом случае вызовет NtCreateFile, перехватывая NtCreateFile ты перехватываешь NtOpenFile.
но проблема кажется не в этом, всё равно сначала убери перехват NtOpenFile потом отпишись прошла ли проблема.
проблема кажется в том что твою процедурку SetWindowsHook надо вызывать только один раз, а она в твоём случае будет вызываться каждый раз когда DLL загрузилась в новый процесс. проблему можно решить через Mutex'ы.

Последний раз редактировалось rpy3uH; 17.06.2007 в 15:59.
rpy3uH вне форума Ответить с цитированием
Старый 18.06.2007, 19:13   #3
Coffein
 
Регистрация: 17.06.2007
Сообщений: 3
По умолчанию

Изменил перехват на NtCreateFile, добавил Mutex.
rpy3uH, скажи вот если я функцию NtCreateFile подменл на NtCreateFileHookProc. А в NtCreateFileNextHook сохранил старую, то если я внутри NtCreateFileHookProc вызову NtCreateFileNextHook, то должна выполнится функция того приложения которое ее вызвало или нет.
http://z.alko-net.ru/ - ZBlog. Блог о программировании и не только.
Coffein вне форума Ответить с цитированием
Старый 18.06.2007, 20:27   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

да, при вызове NtCreateFileNextHook ты вызываешь оригинальную функцию
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсер файловой системы FAT32 svennick Общие вопросы C/C++ 4 26.03.2008 23:26
драйвер виртуальной файловой системы OrdJONY Свободное общение 2 29.12.2007 18:06
Создание обьектов файловой системы через делфи BETONOMESHALKA Общие вопросы Delphi 2 26.12.2007 22:17
Перехват API функций satana Win Api 4 21.08.2007 20:12