Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Функция не перехватываеться


Автор: Friackazoid 1.10.2006, 16:37
вот код dll'ки
Код

#include <wdm.h>
#include "stdafx.h"
#include "detours.h"
#include "serii.h"
#pragma comment(lib,"ntdll.lib");

//-----------------------------------описания используемых структур---------------------------

typedef  DWORD  ACCESS_MASK;
typedef void *PVoid;
typedef DWORD NTSTATUS;

typedef struct _IO_STATUS_BLOCK {
    union {
        DWORD Status;
        PVOID Pointer;
    };
    ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

typedef struct _UNICODE_STRING 
{
  USHORT Length;
  USHORT MaximumLength;
  LPWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef struct _OBJECT_ATTRIBUTES 
{   ULONG Length;
    HANDLE RootDirectory;
    PUNICODE_STRING ObjectName;
    ULONG Attributes;
    PVOID SecurityDescriptor;        
    PVOID SecurityQualityOfService;  
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;


//--------------------------------------объявление используемых функций--------------------------
//функция перехватчик
NTSTATUS __stdcall ZwCreateFileDetour(OUT PHANDLE  FileHandle,
                                        IN ACCESS_MASK  DesiredAccess,
                                        IN POBJECT_ATTRIBUTES  ObjectAttributes,
                                        OUT PIO_STATUS_BLOCK  IoStatusBlock,
                                        IN PLARGE_INTEGER  AllocationSize  OPTIONAL,
                                        IN ULONG  FileAttributes,
                                        IN ULONG  ShareAccess,
                                        IN ULONG  CreateDisposition,
                                        IN ULONG  CreateOptions,
                                        IN PVOID  EaBuffer  OPTIONAL,
                                        IN ULONG  EaLength);


typedef NTSTATUS (ZwCreateFileMy) (OUT PHANDLE ,
                                    IN ACCESS_MASK,
                                    IN POBJECT_ATTRIBUTES,
                                    OUT PIO_STATUS_BLOCK,
                                    IN PLARGE_INTEGER,
                                    IN ULONG,
                                    IN ULONG,
                                    IN ULONG,
                                    IN ULONG,
                                    IN PVOID,
                                    IN ULONG);
HINSTANCE hModule=::LoadLibrary("ntdll.dll");
ZwCreateFileMy *ZwCreateFile=(ZwCreateFileMy*)::GetProcAddress((HMODULE)hModule,"ZwCreateFile");
//-----------------------------------------------------------------------------------------------

DETOUR_TRAMPOLINE (NTSTATUS __stdcall ZwCreateFileTrampoline (PHANDLE,ACCESS_MASK, POBJECT_ATTRIBUTES,    
                                                            PIO_STATUS_BLOCK,PLARGE_INTEGER, 
                                                            ULONG, ULONG,ULONG , ULONG, PVOID,    
                                                            ULONG),CreateFile);


//-------------------------------------запустим бодягу-------------------------------


DllExport void RunStop (bool flag)
{
    MessageBox(NULL,"Библа загружена","alert",MB_OK);
    if (flag)        
        DetourFunctionWithTrampoline((PBYTE)ZwCreateFileTrampoline, (PBYTE)ZwCreateFileDetour);
    else    
        DetourRemove ( (PBYTE)ZwCreateFileTrampoline, (PBYTE)ZwCreateFileDetour);
}

//------------------------------------------------------------------------------------------------

//-----------------------------------перехватчик-------------------------------------------------
NTSTATUS CALLBACK ZwCreateFileDetour(OUT PHANDLE  FileHandle,
                                        IN ACCESS_MASK  DesiredAccess,
                                        IN POBJECT_ATTRIBUTES  ObjectAttributes,
                                        OUT PIO_STATUS_BLOCK  IoStatusBlock,
                                        IN PLARGE_INTEGER  AllocationSize  OPTIONAL,
                                        IN ULONG  FileAttributes,
                                        IN ULONG  ShareAccess,
                                        IN ULONG  CreateDisposition,
                                        IN ULONG  CreateOptions,
                                        IN PVOID  EaBuffer  OPTIONAL,
                                        IN ULONG  EaLength)
{
    MessageBox(NULL,"А ты уверен, что тебе надо открывать этот файл","Hello, master",MB_YESNO);
    return ZwCreateFileTrampoline(FileHandle, DesiredAccess, ObjectAttributes,IoStatusBlock,
                                        AllocationSize  OPTIONAL, FileAttributes,
                                        ShareAccess, CreateDisposition, CreateOptions,
                                        EaBuffer  OPTIONAL, EaLength);
}

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved)
{    
    return TRUE;
}
//-----------------------------------------------------------------------------------------------

/*******************************************The End*********************************************/


Библиотека загружаеться. Но функция не перехватываеться. Или я неправильно что-то делаю? ZwCreateFile ведь происходит когда создаеться или открываеться файл?

Автор: 586 1.10.2006, 20:32
Перехватывай NtCreateFile

Автор: Friackazoid 1.10.2006, 21:15
Аааа.... smile  smile 
я щас буду кричать нечеловеческим голосом.
Я целую неделю боролась с дурацкой ошибкой линковки, победить ее удалось, только путем передачи детуру указателя на функцию, с предварительным получением ее адреса.
Теперь делаю то же самое только с NtCreateFile 
Код

typedef NTSTATUS (NtCreateFileMy) (OUT PHANDLE ,
                                    IN ACCESS_MASK,
                                    IN POBJECT_ATTRIBUTES,
                                    OUT PIO_STATUS_BLOCK,
                                    IN PLARGE_INTEGER,
                                    IN ULONG,
                                    IN ULONG,
                                    IN ULONG,
                                    IN ULONG,
                                    IN PVOID,
                                    IN ULONG);
HINSTANCE hModule=::LoadLibrary("ntdll.dll");
NtCreateFileMy *NtCreateFile=(NtCreateFileMy*)::GetProcAddress((HMODULE)hModule,"NtCreateFile");
//-----------------------------------------------------------------------------------------------

DETOUR_TRAMPOLINE (NTSTATUS NtCreateFileTrampoline (PHANDLE,ACCESS_MASK, POBJECT_ATTRIBUTES,    
                                                            PIO_STATUS_BLOCK,PLARGE_INTEGER, 
                                                            ULONG, ULONG,ULONG , ULONG, PVOID,    
                                                            ULONG),NtCreateFile);


Но опять начинает выдаваться эта дурацкая ошибка линковки

Код

Serii error LNK2019: unresolved external symbol "unsigned long __stdcall NtCreateFileDetour(void * *,unsigned long,struct _OBJECT_ATTRIBUTES *,struct _IO_STATUS_BLOCK *,union _LARGE_INTEGER *,unsigned long,unsigned long,unsigned long,unsigned long,void *,unsigned long)" (?NtCreateFileDetour@@YGKPAPAXKPAU_OBJECT_ATTRIBUTES@@PAU_IO_STATUS_BLOCK@@PAT_LARGE_INTEGER@@KKKKPAXK@Z) referenced in function _RunStop

 smile 

Автор: sOckets 1.10.2006, 21:18
Либы забыла прилинковать. smile

Автор: Friackazoid 2.10.2006, 17:05
Ту ошибку я устранила, но NtCreateFile также не перехватываеться  smile 

Автор: 586 2.10.2006, 17:32
Замени ещё LoadLibrary на GetModuleHandle, поскольку библиотека ntdll загружена всегда.

Автор: Damarus 3.10.2006, 08:19
Friackazoid, может это поможет: http://wasm.ru/article.php?article=tracknapi.

Автор: Damarus 3.10.2006, 23:22
Friackazoid, а ты NtCreateFile какую перехватываешь smile Из ntdll.dll или из ntoskrnl.exe. ИМХО вторую проще и лучше.

Автор: Friackazoid 4.10.2006, 11:30
Damarus, 

я из ntdll.dll. А из ntoskrnl.exe перехватывать точно также? Тоесть получить ее хендел найти адрес адрес функции и передать в detour?

Автор: Damarus 4.10.2006, 11:36
Цитата(Friackazoid @  4.10.2006,  12:30 Найти цитируемый пост)
 А из ntoskrnl.exe перехватывать точно также? Тоесть получить ее хендел найти адрес адрес функции и передать в detour?

Нет. Для этого нужно писать драйвер.

PS. По ссылке выше об этом написано.

Добавлено @ 11:46 
Цитата(Friackazoid @  1.10.2006,  17:37 Найти цитируемый пост)
typedef NTSTATUS (ZwCreateFileMy) (OUT PHANDLE ,
                                    IN ACCESS_MASK,
                                    IN POBJECT_ATTRIBUTES,
                                    OUT PIO_STATUS_BLOCK,
                                    IN PLARGE_INTEGER,
                                    IN ULONG,
                                    IN ULONG,
                                    IN ULONG,
                                    IN ULONG,
                                    IN PVOID,
                                    IN ULONG);

Здесь так:
Код
typedef NTSTATUS (NTAPI ZwCreateFileMy) (OUT PHANDLE ,
                                    IN ACCESS_MASK,
                                    IN POBJECT_ATTRIBUTES,
                                    OUT PIO_STATUS_BLOCK,
                                    IN PLARGE_INTEGER,
                                    IN ULONG,
                                    IN ULONG,
                                    IN ULONG,
                                    IN ULONG,
                                    IN PVOID,
                                    IN ULONG);


Автор: Friackazoid 7.10.2006, 22:25
Решила все таки писать драйвер. Исходники взяла из книги Солдатова "Написание драйверов для Windows" Скомпилировать пытаюсь утилитой BUILD из DDK 2000. Но при компилячии хоть чекед хоть фри никакаих ошибок не выдаеться а файла скомпиленноого нет может что в макефайле не так  
Код

!INCLUDE $(NTMAKEENV)makefile.def


Или в соурсе
Код

TARGETNAME=DSerii // имя компилируемого драйвера
TARGETPATH=obj // директория, в которой будут размещены промежуточные файлы
TARGETTYPE=DRIVER // тип компилируемого проекта
#DRIVERTYPE=WDM // При компиляции WDM драйвера эту строку нужно раскомментировать, а в заголовочном файле Driver.h вместо // ntddk.h подключить wdm.h
SOURCES=DrivSerii.c // главный файл сорцов

Автор: Damarus 8.10.2006, 20:12
Friackazoid, вывод build.exe и код драйвера в студию.

Автор: Friackazoid 8.10.2006, 23:28
вывод буилда при -sz
Код

BUILD: object root set to: ==> objfre
BUILD: /i switch ignored
BUILD: Compile and Link for i386
BUILD: DONE


вывод при просто буилд 
Код

BUILD: object root set to: ==> objfre
BUILD: /i switch ignored
BUILD: Compile and Link for i386
BUILD: DONE
BUILD: Loading C:\NTDDK\build.dat
BUILD: Computiong Include file dependencies
BUILD: Done


а сам код прикрепляю по гуманным соображениеям что бы не флудить

Автор: sOckets 9.10.2006, 10:32
Friackazoid, слушай как ты их "тестишь" ? Через Soft Ice ? сорри за оффтоп.

Автор: Damarus 10.10.2006, 08:01
Friackazoid, makefile:
Код
!INCLUDE $(NTMAKEENV)\makefile.def

Автор: Damarus 10.10.2006, 09:19
Вот пример перехвата NtCreateFile:

Добавлено @ 09:20 
Работает только в XP.

Автор: Friackazoid 10.10.2006, 14:37
Спасибо огромное  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)