桌面截屏

​ 对用户计算机进行截屏,获取截屏数据,能够让病毒木马的控制者直接观看到用户计算机的画面,直 观地了解到目前计算机的操作和状态,便于监控用户计算机的屏幕。如果截屏频率足够快,甚至可以连成 一段视频。
在用户层上,通常通过GDI(Graphics Device Interface)方式实现屏幕画面抓取。GDI图形库提供了一 系列绘图接口函数,这极大地简化了绘图操作。GDI虽然是常用的绘图方式,但是压缩算法太差,压缩大 图失真严重,并且只支持BMP图片类型。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include<windows.h>
#include<atlimage.h>
BOOL ScreenCapture();
BOOL PaintMouse(HDC hdc);
BOOL SaveBmp(HBITMAP bmp);
int main()
{
ScreenCapture();

return 0;
}

BOOL ScreenCapture()
{
HWND hDesktopWnd = GetDesktopWindow();
//获取桌面窗口句柄
HDC hdc = GetDC(hDesktopWnd);
//获取窗口DC

HDC mdc = CreateCompatibleDC(hdc);
//创建兼容DC屏幕设备上下文

DWORD dwScreenWidth = GetSystemMetrics(SM_CXSCREEN);
DWORD dwScreenHeight = GetSystemMetrics(SM_CYSCREEN);
//获取屏幕尺寸

HBITMAP bmp = CreateCompatibleBitmap(hdc,dwScreenWidth,dwScreenHeight);
//创建兼容位图


HBITMAP holdbmp = (HBITMAP)SelectObject(mdc,bmp);
BitBlt(mdc,0,0,dwScreenWidth,dwScreenHeight,hdc,0,0,SRCCOPY);

PaintMouse(mdc);
//绘制鼠标
SaveBmp(bmp);
//保存图片

return TRUE;
}

BOOL PaintMouse(HDC hdc)
{
CURSORINFO cursorInfo = {0};
ICONINFO iconInfo = {0};
HBITMAP bmpOldMask = NULL;
HDC bufdc = CreateCompatibleDC(hdc);
RtlZeroMemory(&iconInfo,sizeof(iconInfo));
cursorInfo.cbSize = sizeof(cursorInfo);


GetCursorInfo(&cursorInfo);
//获取光标信息
GetIconInfo(cursorInfo.hCursor,&iconInfo);
//获取光标图标信息

bmpOldMask = (HBITMAP)SelectObject(bufdc,iconInfo.hbmMask);
BitBlt(hdc,cursorInfo.ptScreenPos.x,cursorInfo.ptScreenPos.y,20,20,bufdc,0,0,SRCAND);
//显示掩图


SelectObject(bufdc,iconInfo.hbmColor);
BitBlt(hdc,cursorInfo.ptScreenPos.x,cursorInfo.ptScreenPos.y,20,20,bufdc,0,0,SRCPAINT);
//显示彩图



SelectObject(bufdc,bmpOldMask);
DeleteObject(iconInfo.hbmColor);
DeleteObject(iconInfo.hbmMask);
DeleteDC(bufdc);
//释放资源

return TRUE;
}

BOOL SaveBmp(HBITMAP bmp)
{
CImage image;

image.Attach(bmp);

image.Save("screenCapture.jpg");

return TRUE;
}