Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват Апи-функций доступа к файловой сиcтеме 
:(
    Опции темы
Coffein
Дата 17.6.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Всем Привет!!! ПОМОГИТЕ! Попал в тупик, вот код дллки:


Код

library Hook;

uses
  Windows, advApiHook,

   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;
var
  res : Integer;
  text : PUNICODE_STRING;
  buf:_OFSTRUCT;
  ff:hFile;
  buffer :PChar;
  rwd : DWORD;

begin
  ff:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
               nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
 buffer:='NtCreateFile: ';
 SetFilePointer(ff,0,0,FILE_END);
 WriteFile(ff,buffer[0],length(buffer),rwd,nil);
 text:= ObjectAttributes.ObjectName;
 SetFilePointer(ff,0,0,FILE_END);
 WriteFile(ff,PByte(text.Buffer)^,length(text.Buffer),rwd,nil);
 CloseHandle(ff);
 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;
var
  res : Integer;
  text : PUNICODE_STRING;
  buf:_OFSTRUCT;
  f:hFile;
  buffer :PChar;
  rwd : DWORD;
begin
  f:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
               nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
  buffer:=#13+#10+'NtOpenFile: ';
  SetFilePointer(f,0,0,FILE_END);
  WriteFile(f,buffer[0],length(buffer),rwd,nil);
  text:= ObjectAttributes.ObjectName;
  SetFilePointer(f,0,0,FILE_END);
  WriteFile(f,PByte(text.Buffer)^,length(text.Buffer),rwd,nil);
  CloseHandle(f);
  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
    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);//установка перехвата на NtCreateFile
        HookProc('ntdll.dll', 'NtOpenFile', @NtOpenFileHookProc, @NtOpenFileNextHook);
      end;
    DLL_PROCESS_DETACH:
      begin
        SetWindowsHook(false); //снимаю глобальный хук
        //UnhookCode(@NtCreateFileNextHook);//снимаю перехват NtCreateFile
        UnhookCode(@NtOpenFileNextHook);
      end;
  end;
end;

begin
  DllProc := @HandleEvents;
  MessageBox(0, 'Запускаем дллку', 'start', MB_OK);
  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;
А винда такое ощущение что вызывает перехватываемую функцию постоянно, и получается так что ссылка на старую функцию все время перезаписывается на в новь отловленную. При этом если я хочу запустить какой нибуть экзешник или просмотреть текстовик, то вылазиет ошибка чтто, типа не правильно указаны парамметры. Посоветуйте как быть.


Это сообщение отредактировал(а) Coffein - 18.6.2007, 17:22

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  DLL.rar 50,55 Kb
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 18.6.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



сорь конечно, но приведенный мусор кодом назвать сложно...
зачем куча закоменченного кода?
где ставится перехвать? где происходит вызов True-функций? почему в коде New функций происходит попытка "снять" перехват???

Это сообщение отредактировал(а) MetalFan - 18.6.2007, 10:06


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Coffein
Дата 18.6.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Цитата

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


Учел ваши замечания, прошу взгялнуть на исправления. ;)

Цитата

где ставится перехвать?


В коде отлично видно где, функция SetWindowsHook(она же снимает) ставит глобальный хук для того чтобы внедрять в каждый пользовательский процесс мою дллку. Что касается перехвата функции то он ставится функцией HookProc('ntdll.dll', 'NtCreateFile', @NtCreateFileHookProc, @NtCreateFileNextHook), где true -функция храниться в NtCreateFileNextHook, а новая - NtCreateFileHookProc. В NtCreateFileHookProc происходит некая обработка парамметров и запись результата в файл, а далее передается управление старой функции.

Цитата

 где происходит вызов True-функций?


В ОС происходит вызов, где ж еще. Так вот все дело в том, что есть мысль что функция обработчик не успевает сделать свою работу так как в файл записывается не полный текст. Как быть?
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 18.6.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



мм... да, я немного другую терминологию применил...
дело в том, что я называл New-функцией - ту функцию, котороя вызывается вместо перехваченной, а True-функция - это как раз та самая перехваченная функция. так это было в примере в известной статье Ms-Rem'а, на основе которой ты и делаешь перехват, как я понял.


Цитата(Coffein @  17.6.2007,  11:47 Найти цитируемый пост)
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;
var
  res : Integer;
  text : PUNICODE_STRING;
  buf:_OFSTRUCT;
  ff:hFile;
  buffer :PChar;
  rwd : DWORD;
begin
  ff:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
               nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);

тут могу предположить, что возникает мегарекурсия.... т.е. в итоге CreateFile вызывает Native-функцию NtCreateFile, которая "перехвачена" в этом коде...

Цитата(Coffein @  17.6.2007,  11:47 Найти цитируемый пост)
NtCreateFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize,
                          FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength);

а здесь на мой взгляд неплохо бы вернуть Result, возвращаемый True(NextHook) функцией....

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

Это сообщение отредактировал(а) MetalFan - 18.6.2007, 13:59


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
W4FhLF
Дата 18.6.2007, 15:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата(MetalFan @  18.6.2007,  13:56 Найти цитируемый пост)
тут могу предположить, что возникает мегарекурсия.... т.е. в итоге CreateFile вызывает Native-функцию NtCreateFile, которая "перехвачена" в этом коде...


+1, человек или не понимает смысла в своих же действиях или просто невнимателен.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Coffein
Дата 18.6.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Цитата

+1, человек или не понимает смысла в своих же действиях или просто невнимателен.


Больше склонен к "невнимателен", но в принципе если бы я понимал, уверен на 100 % такую тему на форуме не создавал! ;) Поэтому  я и хочу разобратся, надеясь на ваш опыт и знания. 

В коде ошибся, не тот хук закоментил. Я эксперементировал на NtOpenFile, но это я в миг исправил.

Цитата

а здесь на мой взгляд неплохо бы вернуть Result, возвращаемый True(NextHook) функцией....

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


Решительно согласен MetalFan, расскажи пожалуста поподробней как вернуть результат и каким образом сделать обработку ошибки, а то я не знаю как это реализовать.

Это сообщение отредактировал(а) Coffein - 18.6.2007, 17:29
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 18.6.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(Coffein @  18.6.2007,  17:21 Найти цитируемый пост)
как вернуть результат и каким образом сделать обработку ошибки

мда... здесь бы учебничек по делфи не помешал... 
ибо эти вопросы из раздела "для новичков".
рано тебе пока такими вещами, как перехвать апи, заниматься, имхо...



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Coffein
Дата 18.6.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



MetalFan прошу конечно меня извенить, но больно интересно за что ты заработал свой статус? С таким статусом сложно дать новечку нормальный совет. Или до того зазнался что даже помочь в лом. Беспорно книга лучше, чем ответы таких "опытных" программистов! Чисто мое мнение!

P.S. Извините.
PM MAIL WWW ICQ   Вверх
W4FhLF
Дата 18.6.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Код

result := NtCreateFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize,
                          FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength);



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Coffein
Дата 18.6.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



W4FhLF, спасибо тебе. 
Сделав изменения в коде  вот что получилось:
Код

function NtOpenFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;  ObjectAttributes: POBJECT_ATTRIBUTES;
                    IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
var
  res : Integer;
  text : PUNICODE_STRING;
  buf:_OFSTRUCT;
  f:hFile;
  buffer :PChar;
  rwd : DWORD;
begin
  try
    f:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
               nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
    buffer:=#13+#10+'NtOpenFile: ';
    SetFilePointer(f,0,0,FILE_END);
    WriteFile(f,buffer[0],length(buffer),rwd,nil);
    text:= ObjectAttributes.ObjectName;
    SetFilePointer(f,0,0,FILE_END);
    WriteFile(f,PByte(text.Buffer)^,length(text.Buffer),rwd,nil);
    CloseHandle(f);
    result:=NtOpenFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions);
  except
    UnhookCode(@NtOpenFileNextHook);
  end;
end;

Вот я получил результат работы функции, а что теперь делать? Для чего мне нужен был result?

Это сообщение отредактировал(а) Coffein - 18.6.2007, 20:48
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 18.6.2007, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(Coffein @  18.6.2007,  18:23 Найти цитируемый пост)
С таким статусом сложно дать новечку нормальный совет

для этого есть раздел форума "Для новичков"
Цитата(Coffein @  18.6.2007,  18:23 Найти цитируемый пост)
Беспорно книга лучше, чем ответы таких "опытных" программистов!

это ты зря... если ты не знаком с такими элементарными вещами, как обработка исключений и возврат значения функции, то такими вещами, как в этой теме, тебе заниматься 99,9% рано. и это тебе скажет любой опытный программист. smile 

added later мда. а ты так ничего и не понял. 

Это сообщение отредактировал(а) MetalFan - 18.6.2007, 20:54


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Coffein
Дата 18.6.2007, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



MetalFan спасибо за совет, я обязательно учту, надеюсь ты сильно не напрягался в помощи. Другой бы уже дельный совет дал, чем трындеть языком о пустом...

добавил поЗже
но все равно спасибо!

еще поЗже
Цитата

мда. а ты так ничего и не понял. 


А ты попробуй объяснить по другому, может получится,  я хватаю на лету ;)

Это сообщение отредактировал(а) Coffein - 19.6.2007, 00:32
PM MAIL WWW ICQ   Вверх
W4FhLF
Дата 19.6.2007, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата(Coffein @  18.6.2007,  20:44 Найти цитируемый пост)
Вот я получил результат работы функции, а что теперь делать? Для чего мне нужен был result?


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

Это сообщение отредактировал(а) W4FhLF - 19.6.2007, 06:31


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
MetalFan
Дата 19.6.2007, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



Цитата(Coffein @  18.6.2007,  22:51 Найти цитируемый пост)
Другой бы уже дельный совет дал

а тебе мало деальных советов? или ты читать не умеешь?
ладно, повторю:
1) у тебя получается рекурсивный вызов... в случае перехвата NtCreateFile
2) никак не анализируются результаты вызовов функций WinApi




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Coffein
Дата 19.6.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 9.4.2007

Репутация: нет
Всего: нет



Цитата

1) у тебя получается рекурсивный вызов... в случае перехвата NtCreateFile

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

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

Цитата

2) никак не анализируются результаты вызовов функций WinApi


Подскажи пожалуста, что нужно анализировать? Причем мне в дальнейшем нужно будет сверять путь и если он запрещен(по этому пути находится защищенный файл), я должен отправить приложению вызвавшему эту функцию значение INVALID_HANDLE_VALUE, но как это сделать тоже не знаю.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1006 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.