• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Хэндл

  • Автор темы Guest
  • Дата начала
G

Guest

Всем добрый вечер! Раньше я как-то этим не очень интересовался, но сейчас возник вопрос - если HANDLE - это указатель на void, то на что именно он указывает? И как можно создать свой хэндл (если это возможно) и связать с ним какие-либо данные. Спасибо за все ответы.
 
I

ierofant

Это нестандартный тип, напиши конкретную библиотеку из которой ты его берёшь.
 
G

grigsoft

ierofant, речь о Windows, видимо.
За handle скрыты внутренние структуры, о которых знать необязательно. Кое-чего описано у рихтера в последнем издании.
 
G

Guest

Кое-чего описано у рихтера в последнем издании.
Я не знаю, кто такой Рихтер. И где же скачать это последнее издание?
Речь о Windows, видимо.
Да, в данном случае речь о Windows.
За handle скрыты внутренние структуры.
А я могу скрыть свои структуры за handle?
 
G

grigsoft

- это библия для разработчиков под Win.

Скрыть свои? Кто ж мешает?
было:
C++:
struct CBook
{ 
char author[100];
char title[100];
int nPages;
BOOL bRead;
};
CBook * CreateBook(char* author, char* title);
void DeleteBook(CBook*);
void MarkBookAsRead(CBook* book);
стало:
C++:
HANDLE CreateBook(char* author, char* title);
void DeleteBook(HANDLE);
void MarkBookAsRead(HANDLE);
С той же самой целью - не дать пользователям библиотеки копаться во внутренностях твоей структуры.
НО - все это сделано для АПИ с его С-интерфейсом, С++ дает достаточно встроенных средств для той же цели:
C++:
struct CBook
{ 
CBook(char* author, char* title);
void MarkBookAsRead();
private:
char author[100];
char title[100];
int nPages;
BOOL bRead;
};

Так что смысла особого нет так извращаться.
 
G

Guest

Спасибо, grigsoft!
А как сделать что-то вроде регистраци класса окна:
C++:
WNDCLASS wc;
// Заполняем структуру...
wc.lpszClassName = "My Class"; // Задаём имя класса
RegisterClass (&wc); // Засунем класс в недра Windows.
HWND hwnd = CreateWindow ("My Class", ...); // А потом укажем имя класса, и Windows сам его найдёт.
Только со своей структурой? Тут уже задача гораздо сложнее.
С++ дает достаточно встроенных средств для той же цели
А если я на С пишу?
 
G

grigsoft

Хендл - это просто заглушка типа, не более того - он не помогает и не мешает программировать. А как это сделать, если бы CreateWindow возвращал просто указатель на структуру окно? Вот точто также. Или я не понял что требуется?
Ну для С - да, вполне себе метод. Но надо понимать что за ним стоит, для кода выше с хендлами будет:
C++:
// реализация
struct CBook
{ 
char author[100];
char title[100];
int nPages;
BOOL bRead;
};

HANDLE CreateBook(char* author, char* title)
{
CBook* pBook = new CBook();
//...
return (HANDLE)pBook;
}
void DeleteBook(HANDLE h)
{
CBook* pBook = (CBook*)h;
delete pBook;
}
void MarkBookAsRead(HANDLE h)
{
CBook* pBook = (CBook*)h;
if (pBook)
pBook->bRead = 1;
}
Для вас - это нормальная структура, для пользователя - просто хендл.

К слову, реально в Win handle для многих объектов не указывает напрямую на область памяти, а лишь нумерует объекты из специальной таблицы для процесса.
 
L

lazybiz

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

Партизан
HANDLE определен как:
C++:
typedef PVOID HANDLE;
C++:
typedef HANDLE HBITMAP;
C++:
typedef HANDLE HWND;
и т.д. и т.п..
Все остальные хэндлы определены по такому же принципу, т.е. они являются типом PVOID.
Тип PVOID, в свою очередь, определяется как:
C++:
typedef void * PVOID;
Т.е.: хэндл - это просто указатель на какой-то тип (обычно структура), и каждая функция знает указатель на что она получает (именно для этого тип HANDLE и разделили на несколько подхэндлов с разными названиями).
По-сути, названия типов хэндлов роли не играют никакой.

Я вот только что придумал свой хэндл:
C++:
typedef void * HPITYPROGRAMMER;

ierofant От тебя ждал большего.
grigsoft Какие классы!? Ты о чем вообще??

Даже мне за вас стыдно...
 
R

Rififi

Партизан

если HANDLE - это указатель на void, то на что именно он указывает?

хэндл - это уникальный идентификатор, по которому система получает доступ к недокументированным структурам, например используя функцию ObReferenceObjectByHandle

И как можно создать свой хэндл (если это возможно) и связать с ним какие-либо данные

для этого надо быть разработчиком ядра Windows
 
G

Guest

Или я не понял что требуется?
Видимо, да. Я, наверно, не очень понятно объяснил. Я же в функцию CreateWindow никакого указателя не посылал (только имя класса окна), но структуру WNDCLASS (по имени класса) в памяти эта функция нашла. Вот это мне и надо реализовать. Посмотрите код:
Код:
struct OBJECT
{
LPCTSTR lpszName;
int n1, n2;
}

void RegisterObject (OBJECT *pObj)
{
// Регистрируем объект...
}

HOBJ RealizeObject (LPCTSTR lpszObjName, ...)
{
// Реализуем объект и возвращаем его хэндл.
// Заметьте, что явный указатель на структуру в эту функцию не посылался.
}
// Функции RegisterObject и RealizeObject мне и надо реализовать!

void main (void)
{
OBJECT myObj;
myObj.lpszName = "My Object";
myObj.n1 = 100;
myObj.n2 = 1000;
RegisterObject (&myObj);
HOBJ hobj = RealizeObject ("My Object", ...); // Функция находит в памяти нашу структуру.
}
 
R

Rififi

Партизан

Функции RegisterObject и RealizeObject мне и надо реализовать!

это можно сделать с использованием любого ассоциативного контейнера, например std::map

для более углублённого изучения темы, гоогле по словам "Паттерны проектирования", "Порождающие паттерны" (фабрика и пр.)
 
G

Guest

гоогле по словам "Паттерны проектирования", "Порождающие паттерны" (фабрика и пр.)
Что-то я не нашёл ничего подходящего для меня. Может, сразу скажете ссылку на страницу, где можно получить нужную информацию?
 
R

Rififi

Партизан

Может, сразу скажете ссылку на страницу, где можно получить нужную информацию?

"мой" гоогле - такой же как у тебя.

link removed

link removed

 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!