Пишем hvnc 2.0

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
6,642
Реакции
23
Доброго времени суток форумчане, давно не виделись :)

В данной статье будет описана найденный мной интересный вектор эксплуатации MDI.


N-ное время назад я решил реализовать собственную версию HVNC (скрытое управление рабочим столом).


Но код от Zeus и его производных конечно же оставлял желать лучшего.
Банально ничего не работало.

Коротко о том, как работает HVNC.
1. Создается виртуальный рабочий стол через WinAPI: CreateDesktop() / OpenDesktop().
Quote​
Заметка:​
Получить Handle текущего рабочего стола можно вот так:​
GetThreadDesktop(GetCurrentThreadId())​
Чтобы использовать его в будущем.​

2. Получается HDC рабочего стола.
3. С помощью WinAPI: bitblt() мы можем делать скриншот виртуального рабочего стола.
Весьма изящный и довольно простой механизм.
Но есть минус - каждая антивирусная компания знает о нем и довольно легко детектят.


Минус #2 связан с механизмом отрисовки объектов в Windows:
Quote​
Если у нас есть приложение, форма или часть формы которого находятся за пределами​
отображаемой части рабочего стола, т.е. например на фоновом, созданном нами, рабочем столе, то​
она не отрисовывается и в памяти не обновляется.​
т.е. bitblt может не отработать, как нужно.​
Quote​
Это фиксится вызовом WinAPI: PrintWindow() из dll - user32,​
этим методом мы вызовем отрисовку графического объекта в WINGDI Bitmap буфер (по Handle Bitmap'a).​
После реализации HVNC по стандартному механизму работы, я, будучи энтузиастом, на этом не остановился.
Тогда было принято решение в поиске иного пути реализации HVNC, т.к. этот был уж сильно заезжан.

Рассмотрим любопытную вещь, которую я заметил.
1. В ОС Windows существует механизм хендлов (Handle == 32-x разрядное число без знака).
1. Handle имеется практически у каждого объекта, в т.ч. у форм, кнопок, полей ввода и т.п.
2. По Handle можно обратиться к определенному объекту, например через SendMessage() / PostMessage().
4. Объекты могут быть выстроены в определенную иерархию объект родитель -> дочерний объект, например форма -> кнопки на ней.
3. (Самое важное) У графических и не только объектов, у которых есть Handle (т.е. у WinForms) есть одно
просто замечательнейшее свойство - их можно "удочерять" через WinAPI метод SetParent()
SetParent(Handle целевого объекта, Handle "родителя").


Причем строгий механизм контроля "удочерения" для этого API метода в Windows отсутствует!


Т.е. мы можем создать форму через WinAPI, которая будет находиться за пределами видимой части рабочего стола...
А затем запустить нужное нам приложение (например Chrome) и удочерить его формы в нашу.
P.S. Процесс скрытого запуска приложений и форм далее не рассматривается - это все можно нагуглить самим.
Quote​
Может так получиться, что у целевого приложения будет 2-3 и более форм.​
Самый простой вариант перехватить их Handle - это скомбинировать API: EnumWindows(), и GetWindowThreadProcessId(),​
pid нового процесса можно получить при его создании.​
Забавное примечание:​
PrintWindow() вызывает отрисовку графического объекта и всех его дочерних графических объектов.​
Итого, что мы имеем:
1. Можем запустить процесс в фоне, без вызова CreateDesktop() !
2. Чтобы сделать скриншот нашего скрытого рабочего стола - нам нужно отрисовать в Bitmap буфер только нашу форму, используя PrintWindow() !
3. Можем легко взаимодействовать с его графическими элементами через SendMessage() / PostMessage(),
посылать клики/движения мыши и нажатия клавиш !
4. Данный способ довольно не просто задетектить, т.к. механизм MDI используется в огромном перечне белого софта,

Протестировано на Win XP, 7, 8, 8.1, 10 (последний билд), Server 2007.
а это значит, что данная технология может спокойно отодвинуть HVNC на второй план.
К посту прикрепляю скрины технологии в действии, тесты проводились на ботах (Некоторая информация замазана. Мы ведь не ей делимся :) ).
И видео - демонстрацию, как это все работает в realtime. 
Показать содержимое
Видео:
https://radikal.ru/video/HE7v4l4nmhk
Данная технология использовалась в wxrat, который был доступен для покупки у меня год назад.
В более поздних версиях используется технология, производная от описанной в данной статье.
b10e345607e9ed1bfe412.png

13f2319b0f671f2553d50.png

b7e4f06b43f906929c339.jpg

f75fef5144efbe38ad575.jpg

ce609856cf8e11620c861.png

Автор: wdosx
 

asdasd222

Viewer
User
Регистрация
07.12.2023
Сообщения
1
Реакции
0
Доброго времени суток форумчане, давно не виделись :)

В данной статье будет описана найденный мной интересный вектор эксплуатации MDI.


N-ное время назад я решил реализовать собственную версию HVNC (скрытое управление рабочим столом).


Но код от Zeus и его производных конечно же оставлял желать лучшего.
Банально ничего не работало.

Коротко о том, как работает HVNC.
1. Создается виртуальный рабочий стол через WinAPI: CreateDesktop() / OpenDesktop().
Quote​
Заметка:​
Получить Handle текущего рабочего стола можно вот так:​
GetThreadDesktop(GetCurrentThreadId())​
Чтобы использовать его в будущем.​

2. Получается HDC рабочего стола.
3. С помощью WinAPI: bitblt() мы можем делать скриншот виртуального рабочего стола.
Весьма изящный и довольно простой механизм.
Но есть минус - каждая антивирусная компания знает о нем и довольно легко детектят.


Минус #2 связан с механизмом отрисовки объектов в Windows:
Quote​
Если у нас есть приложение, форма или часть формы которого находятся за пределами​
отображаемой части рабочего стола, т.е. например на фоновом, созданном нами, рабочем столе, то​
она не отрисовывается и в памяти не обновляется.​
т.е. bitblt может не отработать, как нужно.​
Quote​
Это фиксится вызовом WinAPI: PrintWindow() из dll - user32,​
этим методом мы вызовем отрисовку графического объекта в WINGDI Bitmap буфер (по Handle Bitmap'a).​
После реализации HVNC по стандартному механизму работы, я, будучи энтузиастом, на этом не остановился.
Тогда было принято решение в поиске иного пути реализации HVNC, т.к. этот был уж сильно заезжан.

Рассмотрим любопытную вещь, которую я заметил.
1. В ОС Windows существует механизм хендлов (Handle == 32-x разрядное число без знака).
1. Handle имеется практически у каждого объекта, в т.ч. у форм, кнопок, полей ввода и т.п.
2. По Handle можно обратиться к определенному объекту, например через SendMessage() / PostMessage().
4. Объекты могут быть выстроены в определенную иерархию объект родитель -> дочерний объект, например форма -> кнопки на ней.
3. (Самое важное) У графических и не только объектов, у которых есть Handle (т.е. у WinForms) есть одно
просто замечательнейшее свойство - их можно "удочерять" через WinAPI метод SetParent()
SetParent(Handle целевого объекта, Handle "родителя").


Причем строгий механизм контроля "удочерения" для этого API метода в Windows отсутствует!


Т.е. мы можем создать форму через WinAPI, которая будет находиться за пределами видимой части рабочего стола...
А затем запустить нужное нам приложение (например Chrome) и удочерить его формы в нашу.
P.S. Процесс скрытого запуска приложений и форм далее не рассматривается - это все можно нагуглить самим.
Quote​
Может так получиться, что у целевого приложения будет 2-3 и более форм.​
Самый простой вариант перехватить их Handle - это скомбинировать API: EnumWindows(), и GetWindowThreadProcessId(),​
pid нового процесса можно получить при его создании.​
Забавное примечание:​
PrintWindow() вызывает отрисовку графического объекта и всех его дочерних графических объектов.​
Итого, что мы имеем:
1. Можем запустить процесс в фоне, без вызова CreateDesktop() !
2. Чтобы сделать скриншот нашего скрытого рабочего стола - нам нужно отрисовать в Bitmap буфер только нашу форму, используя PrintWindow() !
3. Можем легко взаимодействовать с его графическими элементами через SendMessage() / PostMessage(),
посылать клики/движения мыши и нажатия клавиш !
4. Данный способ довольно не просто задетектить, т.к. механизм MDI используется в огромном перечне белого софта,

Протестировано на Win XP, 7, 8, 8.1, 10 (последний билд), Server 2007.
а это значит, что данная технология может спокойно отодвинуть HVNC на второй план.
К посту прикрепляю скрины технологии в действии, тесты проводились на ботах (Некоторая информация замазана. Мы ведь не ей делимся :) ).
И видео - демонстрацию, как это все работает в realtime.
Показать содержимое
Видео:
https://radikal.ru/video/HE7v4l4nmhk
Данная технология использовалась в wxrat, который был доступен для покупки у меня год назад.
В более поздних версиях используется технология, производная от описанной в данной статье.
b10e345607e9ed1bfe412.png

13f2319b0f671f2553d50.png

b7e4f06b43f906929c339.jpg

f75fef5144efbe38ad575.jpg

ce609856cf8e11620c861.png

Автор: wdosx
но разве виндовс форм пожет поддерживать открытие приложений по типу хром? у меня получилось сделать открытие простых софтов по типу notepad, но когда я пытаюсь открыть хром или что-то подобное, оно просто открывается вне формы
 

Members, viewing this thread

Сейчас на форуме нет ни одного пользователя.