Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция не перехватываеться, библиотека detour 
:(
    Опции темы
Friackazoid
Дата 1.10.2006, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вот код 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 ведь происходит когда создаеться или открываеться файл?
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
586
Дата 1.10.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Перехватывай NtCreateFile
PM   Вверх
Friackazoid
Дата 1.10.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Аааа.... 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 
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
sOckets
Дата 1.10.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

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



Либы забыла прилинковать. smile


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Friackazoid
Дата 2.10.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ту ошибку я устранила, но NtCreateFile также не перехватываеться  smile 
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
586
Дата 2.10.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Замени ещё LoadLibrary на GetModuleHandle, поскольку библиотека ntdll загружена всегда.
PM   Вверх
Damarus
Дата 3.10.2006, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Friackazoid, может это поможет: Слежение за вызовом функций Native API.
PM MAIL ICQ Jabber   Вверх
Damarus
Дата 3.10.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



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

Это сообщение отредактировал(а) Damarus - 4.10.2006, 02:06
PM MAIL ICQ Jabber   Вверх
Friackazoid
Дата 4.10.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Damarus

я из ntdll.dll. А из ntoskrnl.exe перехватывать точно также? Тоесть получить ее хендел найти адрес адрес функции и передать в detour?
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
Damarus
Дата 4.10.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Цитата(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);



Это сообщение отредактировал(а) Damarus - 4.10.2006, 11:47
PM MAIL ICQ Jabber   Вверх
Friackazoid
Дата 7.10.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решила все таки писать драйвер. Исходники взяла из книги Солдатова "Написание драйверов для 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 // главный файл сорцов

--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
Damarus
Дата 8.10.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Friackazoid, вывод build.exe и код драйвера в студию.
PM MAIL ICQ Jabber   Вверх
Friackazoid
Дата 8.10.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вывод буилда при -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


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

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  DrivSerii.c 9,71 Kb
--------------------
Даже если тебя съели, то все равно есть два выхода.42Team блог
PM MAIL WWW ICQ GTalk   Вверх
sOckets
Дата 9.10.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

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



Friackazoid, слушай как ты их "тестишь" ? Через Soft Ice ? сорри за оффтоп.


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Damarus
Дата 10.10.2006, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

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



Friackazoid, makefile:
Код
!INCLUDE $(NTMAKEENV)\makefile.def

PM MAIL ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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