• XSS.stack #1 – первый литературный журнал от юзеров форума

HVNC C#

ioioio777

Конвертирую ваши доступы в деньги.
Забанен
Регистрация
23.07.2021
Сообщения
144
Реакции
319
Гарант сделки
2
Депозит
0.0001
Пожалуйста, обратите внимание, что пользователь заблокирован
Всех приветствую, данным постом преследую две цели.
1) Найти решение своей проблемы при написании скриншота скрытого онка.
2) Проинформировать людей о таком способе реализации скрытого браузера.


Уверен, что для старичков эта схема не будет новой, однако я ни в коем случае не притендую на авторство (статья 2019 года, а сам метод датируется 2004ым?) + этот метод куда уж лучше реализации через CreateDesktop


Далее цитирую самого автора



Спустя 3 дня мозгоебки и перебирания множества способов отрисовки ... у меня не выходит ничего кроме черного экрана.
Максимальный из результатов - вот (и то, это нельзя считать успешным вариантом, так как это просто последний хендл, оставшийся в оперативной памяти)


Собственно вопрос заключается в этом: Как сделать скриншот MDI формы за областью экрана.
 
Последнее редактирование:
Решение
Как сделать скриншот MDI формы за областью экрана.
Printwindow по другому никак
P.S. Процесс скрытого запуска приложений и форм далее не рассматривается - это все можно нагуглить самим.
Кстати так просто его не скрыть, я пробовал вызывать ShowWindow после запуска процесса, нихрена нормально не получилось, окно промелькает. Хотя через один костыль у меня получилось норм его скрыть
Не могу понять - а как правильно симулировать инпут с клавиатуры? Изначально думал получать хэндл окна, на котором сейчас находится фокус и далее слать WM_KEYDOWN/WM_KEYUP с помощью PostMessageW, но сами майки не рекомендуют так делать:
You can't simulate keyboard input with PostMessage
Как вариант - UIAutomation, но это достаточно геморойный метод.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Не могу понять - а как правильно симулировать инпут с клавиатуры? Изначально думал получать хэндл окна, на котором сейчас находится фокус и далее слать WM_KEYDOWN/WM_KEYUP с помощью PostMessageW, но сами майки не рекомендуют так делать
SendInput не?
 
Я пользовался таким методом hvnc как ты, у меня получилось сделать скриншот когда я оставил один пиксель формы в правом нижнем углу экрана, а т.к у большинства людей там панель винды, то зацепиться за этот пиксель и вытащить твою форму не получится, да и если там не будет панели винды, то не думаю что кто-то будет там чет тыкать

Отпиши если поможет мой метод
 
SendInput не?
Не уверен что SendInput поддерживает отправку в конкретное окно (на котором стоит наш фокус, а не юзера).

UPD: временно запилил через PostMessageW, но всё же достаточно проблемное решение. Гемор с языками, возможности использовать комбинации клавиш нет. Возможно, решение с UIAutomation самое юзабельное.
 
Последнее редактирование:
Так же не совсем понятно как по нормальному передавать кадры на сервер. Скрин-граббер стабильно грабит и кодирует с помощью h264 в 25-30 фпс, но как эти данные отобразить на странице? Попробовал jmuxer - для real-time не очень подходит, в лучшем случае выдаёт 12 фпс - юзабельно, но дискомфортно. Само по себе такое решение очень простое и удобное - на бэкэнде из вебсокета клиента (машины, на которой запущен псевдо-хвнц) данные просто пересылаются в вебсокет клиента-вьювера, jmuxer уже оборачивает raw-h264 stream в mp4 контейнер и с помощью MSE выводит в элемент <video>.
Дабы получить нормальное кол-во кадров в секунду нужно избавиться от бутылочного горлышка - в данном случае это jmuxer. В идеале нужно полученные h264-фреймы оборачивать в fragmented mp4-контейнер и отдавать по http - в таком случае вьювер реализуется очень просто - элемент <video> с прописанным <source> на хэндлер, который отдаёт fMP4, собранный из полученных от клиента кадров. Примерная реализация: fmp4streamer
 
Пожалуйста, обратите внимание, что пользователь заблокирован
как по нормальному передавать кадры на сервер.
А ты передаешь скрин всего окна или как? Просто обычно передают только ту область, что изменилась.
 
А ты передаешь скрин всего окна или как? Просто обычно передают только ту область, что изменилась.
Скрин снимается со всего окна, обрабатывается кодеком h264 - на выходе фрейм размером 15-4000 байт. Как кодек под капотом работает - не смотрел, главное что со своей задачей справляется на ура.
 
Дабы получить нормальное кол-во кадров в секунду нужно избавиться от бутылочного горлышка - в данном случае это jmuxer. В идеале нужно полученные h264-фреймы оборачивать в fragmented mp4-контейнер и отдавать по http - в таком случае вьювер реализуется очень просто - элемент <video> с прописанным <source> на хэндлер, который отдаёт fMP4, собранный из полученных от клиента кадров.
Дошли руки потестить - да, фпс хороший, картинка плавная, но есть одна проблема высокая задержка. Как я понял, это связано с тем что браузер сначала буферезирует видео, как только какое-то кол-во кадров загружено - начинает воспроизведение видео. Данное решение не подходит для low-latency стримов, тк задержка может достигать 60 сек.
Нашёл идеальное решение: WebSocket как транспорт, h264-фреймы оборачиваем в fmp4-контейнер и проигрываем на странице с помощью Media Extension Source API. Минимальная задержка, плавная картинка, но на большом кол-ве кадров в секунду могут начаться проблемы с отставанием видео, поэтому ограничил фпс до 24. По моим тестам, PrintWindow(..., PW_CLIENTONLY | PW_RENDERFULLCONTENT) выдаёт до 15 кадров при разрешение 1280х720, BitBlt(..., SRCCOPY) при тех же параметрах выдаёт чуть болше фпс (до 23). Если нужно больше фпс - можно распаралеллить, но картинка плавная и при одном потоке.
 
Кстати, очень гибкий метод, на самом деле. Получилось реализовать некое подобие рабочего стола, с поддержкой нескольких окон/их сворачиванием, разворачиванием/изменением размера, позиции - всё это реализается достаточно просто.
Единственный минус, что я заметил - тк передвижение виртуального курсора реализуется с помощью сообщений WM_MOUSEMOVE - в "усыновлённое" окно постоянно прилетают сообщения WM_MOUSELEAVE, что, по идее, может отловить фрод на стороне сайта, установив хук на mouseenter/mouseleave/mouseover/mouseout. Как я понял, связано это с тем что настоящий курсор захвачен в окне, которое используется пользователем. Пока не копал эту тему, но уверен, что можно исправить.
 
Ооказалось не всё так сладко, на Win8.1 non-client область child-окон отображается некорректно - отсутствуют системные кнопки (min/max/close), заголовок окна просто закрашен чёрным. Пока не нашёл решение, но думаю это связано со стилями окон.
image.png
 
Пожалуйста, обратите внимание, что пользователь заблокирован
to capture screenshot of non-active window you can't use bitblt you have to use printwindow then use bitblt function to copy screenshot of the window to the global bitmap and so on don't forget to enumirate the windows in z-order and the bitblt will gather them
 
to capture screenshot of non-active window you can't use bitblt you have to use printwindow then use bitblt function to copy screenshot of the window to the global bitmap and so on don't forget to enumirate the windows in z-order and the bitblt will gather them
Какое это имеет отношение к данному методу? Окно за пределами дисплея продолжает рисоваться, можно использовать и BitBlt.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Какое это имеет отношение к данному методу? Окно за пределами дисплея продолжает рисоваться, можно использовать и BitBlt.
maybe the translator miss i was talking about the normal hvnc u can't use bitblt Sry
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх