Перехват Api-функций

Тема в разделе "WASM.WIN32", создана пользователем Coffein, 2 май 2007.

  1. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    Вот может пригодится исходник. Правда тут ZwQueryDirectoryFile перехватывается, но может поможет разобраться в перехвате...
     
  2. Coffein

    Coffein New Member

    Публикаций:
    0
    Регистрация:
    2 май 2007
    Сообщения:
    11
    Klayd, вот это помог, спасибо большое! Respect и уважуха!
     
  3. Coffein

    Coffein New Member

    Публикаций:
    0
    Регистрация:
    2 май 2007
    Сообщения:
    11
    Всем Привет!!! Koshak или кто нибуть еще, ПОМОГИТЕ! Попал в тупик, вот код дллки:
    Код (Text):
    1. library Hook;
    2.  
    3. uses
    4.   Windows, advApiHook,
    5.  
    6.    HSNtDef,
    7.  
    8.    NtDll;
    9.  
    10. {$R *.res}
    11.  
    12. const
    13.   MutexName='__API_HOOK';
    14.  
    15. var
    16. SH:HHOOK = 0;
    17.  
    18.   NtCreateFileNextHook: function (FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;
    19.                     ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock;
    20.                     AllocationSize: PLARGE_INTEGER;  FileAttributes, ShareAccess, CreateDisposition, CreateOptions: ULONG;
    21.                     EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall;
    22.   NtOpenFileNextHook: function (FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;  ObjectAttributes: POBJECT_ATTRIBUTES;
    23.                     IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
    24.  
    25. //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    26.  
    27. function NtCreateFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;
    28.   ObjectAttributes: POBJECT_ATTRIBUTES; IoStatusBlock: PIoStatusBlock;
    29.   AllocationSize: PLARGE_INTEGER;
    30.   FileAttributes, ShareAccess, CreateDisposition, CreateOptions: ULONG;
    31.   EaBuffer: PVOID; EaLength: ULONG): NTSTATUS; stdcall;
    32. var
    33.   res : Integer;
    34.   text : PUNICODE_STRING;
    35.   buf:_OFSTRUCT;
    36.   ff:hFile;
    37.   buffer :PChar;
    38.   rwd : DWORD;
    39.  
    40. begin
    41.   ff:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
    42.                nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
    43.  buffer:='NtCreateFile: ';
    44.  SetFilePointer(ff,0,0,FILE_END);
    45.  WriteFile(ff,buffer[0],length(buffer),rwd,nil);
    46.  text:= ObjectAttributes.ObjectName;
    47.  SetFilePointer(ff,0,0,FILE_END);
    48.  WriteFile(ff,PByte(text.Buffer)^,length(text.Buffer),rwd,nil);
    49.  CloseHandle(ff);
    50.  NtCreateFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, AllocationSize,
    51.                           FileAttributes, ShareAccess, CreateDisposition, CreateOptions, EaBuffer, EaLength);
    52. end;
    53.  
    54. function NtOpenFileHookProc(FileHandle: PHandle; const DesiredAccess: ACCESS_MASK;  ObjectAttributes: POBJECT_ATTRIBUTES;
    55.                     IoStatusBlock: PIoStatusBlock; const ShareAccess, OpenOptions: ULONG) : NTSTATUS; stdcall;
    56. var
    57.   res : Integer;
    58.   text : PUNICODE_STRING;
    59.   buf:_OFSTRUCT;
    60.   f:hFile;
    61.   buffer :PChar;
    62.   rwd : DWORD;
    63. begin
    64.   f:= CreateFile('C:\towrite.txt',GENERIC_READ or GENERIC_WRITE,0,
    65.                nil, OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
    66.   buffer:=#13+#10+'NtOpenFile: ';
    67.   SetFilePointer(f,0,0,FILE_END);
    68.   WriteFile(f,buffer[0],length(buffer),rwd,nil);
    69.   text:= ObjectAttributes.ObjectName;
    70.   SetFilePointer(f,0,0,FILE_END);
    71.   WriteFile(f,PByte(text.Buffer)^,length(text.Buffer),rwd,nil);
    72.   CloseHandle(f);
    73.   NtOpenFileNextHook(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions);
    74.   end;
    75.  
    76.  
    77.  
    78. function MsgProc(code:DWORD;wParam,lparam:DWORD):DWORD;stdcall;
    79. begin
    80.   CallNextHookEx(SH,code,wParam,lparam);
    81. end;
    82.  
    83. procedure SetWindowsHook(e:Boolean); stdcall;
    84. var
    85.   M:THandle;
    86. begin
    87.   if e then
    88.    begin
    89.     m:=CreateMutex(0,false,MutexName);
    90.     if m=0 then exit;
    91.     SH:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,HInstance,0);
    92.    end
    93.        else
    94.     UnhookWindowsHookEx(sh);
    95. end;
    96.  
    97. procedure HandleEvents(reason: integer)export;stdcall;
    98. begin
    99.   case reason of
    100.     DLL_PROCESS_ATTACH:
    101.       begin
    102.         SetWindowsHook(true);   //установка глобального хука
    103.         HookProc('ntdll.dll', 'NtCreateFile', @NtCreateFileHookProc, @NtCreateFileNextHook);//установка перехвата на NtCreateFile
    104.         //HookProc('ntdll.dll', 'NtOpenFile', @NtOpenFileHookProc, @NtOpenFileNextHook);
    105.       end;
    106.     DLL_PROCESS_DETACH:
    107.       begin
    108.         SetWindowsHook(false); //снимаю глобальный хук
    109.         UnhookCode(@NtCreateFileNextHook);//снимаю перехват NtCreateFile
    110.         //UnhookCode(@NtOpenFileNextHook);
    111.       end;
    112.   end;
    113. end;
    114.  
    115. begin
    116.   DllProc := @HandleEvents;
    117.   MessageBox(0, 'Запускаем дллку', 'start', MB_OK);
    118.   HandleEvents(DLL_PROCESS_ATTACH);
    119. 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;
    А винда такое ощущение что вызывает перехватываемую функцию постоянно, и получается так что ссылка на старую функцию все время перезаписывается на в новь отловленную. При этом если я хочу запустить какой нибуть экзешник или просмотреть текстовик, то вылазиет ошибка чтто, типа не правильно указаны парамметры. Посоветуйте как быть.
     
  4. Coffein

    Coffein New Member

    Публикаций:
    0
    Регистрация:
    2 май 2007
    Сообщения:
    11
    необходимый модуль
     
  5. Coffein

    Coffein New Member

    Публикаций:
    0
    Регистрация:
    2 май 2007
    Сообщения:
    11
    и еще один.