0%

前言

尽管我学OI没有多久,论成绩最后在NOI2022也只拿了一块铜牌,但在这个退役的时刻,回首这短暂的两年,也确实有许多感想,时间再往前看,好像也有故事可讲。这篇退役感言将会讲讲我和OI缘分的始终,谈谈我的感受,以此纪念一系列我再也打不了的比赛。

阅读全文 »

作者:czm23333

题目传送门

题目大意

给定一个m列n行的网格,给定每行列的宽度,求:

  1. 其中网格矩形的数量
  2. 所有网格矩形的面积和

由于$n, m$同级,以下计算的时间复杂度内均把$n, m$合并

Subtask 0

枚举每个矩形计算即可,时间复杂度$\Theta (n^4)$

Subtask 1

here

Method #2

时间复杂度$\Theta (n^2)$

Subtask 2

其实在上面的文章的最后一部分有提到正解做法,不过当时并没有仔细想,只是口胡了一下,实际上里面有一些错误。

在这里再写一下正解做法:

阅读全文 »

洛谷不知道为啥发布不了,于是放到这个博客上了

在本次江西代码中共出现了714个freopen,其中7个被注释了

仅出现过4次文件流(均为笔者本人)

365个文件中有一个文件没有导入任何头文件,739个导入中共有233个万能头

共发现3个T1打表人,最大的一个文件大小达到了1.07MB

保龄人

IO0ete.png

IO0M6I.png

IO030f.png

这位更是重量级:

IO0JAS.md.png

痛恨O2人

IO0thQ.md.png

文明人

IO0Bn0.md.png

AK人

IO0fj1.md.png

退役人

IO0TAO.md.png

O3全开,预言成真

拼音人

IO0H4e.png

IO0OgA.png

一般路过RP人

IO0xDP.png

IOBAvn.png

IOBebV.png

甚至打广告:

IOBuUU.png

IOBQC4.png

IOBUUO.png

IOBwPe.png

IOB08H.png

IOBsKI.png

道歉人

IOByrt.png

表白CCF人

IOB6qP.png

IOBgVf.png

前言

因为看到洛谷上有人问 怎么用taskkill关掉PopBlock.exe

我就立马去尝试了一下,试了一会发现一堆方法都不行

我当然服气不了,于是当场花了一晚上整了一下

正文

0x01 尝试

首先,我们先试一下能不能用一些冷门方法钻火绒主防的漏洞

包括但不限于:排APC调用ExitProcess,内存抹0,劫持线程到无效地址等等

显然,全都失败了,不然也不会有这篇博文了

0x02 分析

火绒到底干什么了,为什么我们的方法全都不行?

阅读全文 »

前言

这个其实是我很长一段时间之前弄的了,不过当时没有发出来(现在发出来水一下博客)

刚开学那会我在学校的某群吹水时,听说了微机室电脑有控制软件可以让老师看屏幕,于是在第一节微机课的前一天晚上连夜弄了一下这个

正文

0x01 Find

想要伪造画面,自然要用到Hook技术,可是要Hook哪里呢?

这里先贴一段截屏代码供参考
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
BOOL WriteBmp(const TSTRING &strFile, const std::vector<BYTE> &vtData, const SIZE &sizeImg);
BOOL WriteBmp(const TSTRING &strFile, HDC hdc);
BOOL WriteBmp(const TSTRING &strFile, HDC hdc, const RECT &rcDC);

BOOL WriteBmp(const TSTRING &strFile, const std::vector<BYTE> &vtData, const SIZE &sizeImg)
{

BITMAPINFOHEADER bmInfoHeader = { 0 };
bmInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bmInfoHeader.biWidth = sizeImg.cx;
bmInfoHeader.biHeight = sizeImg.cy;
bmInfoHeader.biPlanes = 1;
bmInfoHeader.biBitCount = 24;

//Bimap file header in order to write bmp file
BITMAPFILEHEADER bmFileHeader = { 0 };
bmFileHeader.bfType = 0x4d42; //bmp
bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmFileHeader.bfSize = bmFileHeader.bfOffBits + ((bmInfoHeader.biWidth * bmInfoHeader.biHeight) * 3); ///3=(24 / 8)

HANDLE hFile = CreateFile(strFile.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}

DWORD dwWrite = 0;
WriteFile(hFile, &bmFileHeader, sizeof(BITMAPFILEHEADER), &dwWrite, NULL);
WriteFile(hFile, &bmInfoHeader, sizeof(BITMAPINFOHEADER), &dwWrite, NULL);
WriteFile(hFile, &vtData[0], vtData.size(), &dwWrite, NULL);


CloseHandle(hFile);

return TRUE;
}


BOOL WriteBmp(const TSTRING &strFile, HDC hdc)
{
int iWidth = GetDeviceCaps(hdc, HORZRES);
int iHeight = GetDeviceCaps(hdc, VERTRES);
RECT rcDC = { 0,0,iWidth,iHeight };

return WriteBmp(strFile, hdc, rcDC);
}

BOOL WriteBmp(const TSTRING &strFile, HDC hdc, const RECT &rcDC)
{
BOOL bRes = FALSE;
BITMAPINFO bmpInfo = { 0 };
BYTE *pData = NULL;
SIZE sizeImg = { 0 };
HBITMAP hBmp = NULL;
std::vector<BYTE> vtData;
HGDIOBJ hOldObj = NULL;
HDC hdcMem = NULL;

//Initilaize the bitmap information
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = rcDC.right - rcDC.left;
bmpInfo.bmiHeader.biHeight = rcDC.bottom - rcDC.top;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;

//Create the compatible DC to get the data
hdcMem = CreateCompatibleDC(hdc);
if (hdcMem == NULL)
{
goto EXIT;
}

//Get the data from the memory DC
hBmp = CreateDIBSection(hdcMem, &bmpInfo, DIB_RGB_COLORS, reinterpret_cast<VOID **>(&pData), NULL, 0);
if (hBmp == NULL)
{
goto EXIT;
}
hOldObj = SelectObject(hdcMem, hBmp);

//Draw to the memory DC
sizeImg.cx = bmpInfo.bmiHeader.biWidth;
sizeImg.cy = bmpInfo.bmiHeader.biHeight;
StretchBlt(hdcMem,
0,
0,
sizeImg.cx,
sizeImg.cy,
hdc,
rcDC.left,
rcDC.top,
rcDC.right - rcDC.left + 1,
rcDC.bottom - rcDC.top + 1,
SRCCOPY);


vtData.resize(sizeImg.cx * sizeImg.cy * 3);
memcpy(&vtData[0], pData, vtData.size());
bRes = WriteBmp(strFile, vtData, sizeImg);

SelectObject(hdcMem, hOldObj);


EXIT:
if (hBmp != NULL)
{
DeleteObject(hBmp);
}

if (hdcMem != NULL)
{
DeleteDC(hdcMem);
}

return bRes;
}

int main()
{
HDC hdc = GetDC(0);
HDC hMemDC = CreateCompatibleDC(hdc);
SelectObject(hMemDC, CreateCompatibleBitmap(hdc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)));
BitBlt(hMemDC, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), hdc, 0, 0, SRCCOPY);
WriteBmp(L"directWrite.bmp", hdc);
WriteBmp(L"copyWrite.bmp", hMemDC);
ReleaseDC(GetActiveWindow(), hdc);
DeleteDC(hMemDC);
return 0;
}

CreateDCA和CreateDCW?

研究截屏的实现代码,首先可以想到CreateDCA和CreateDCW两个点,把程序拿到的屏幕DC替换掉

但能够发现,GetDC(0)和GetDC(GetDesktopWindow())也能拿到截屏用的DC,这样我们又多了一个需要Hook的点,并且可能还有更多方法来获得这个DC

还有,屏幕HDC并不一定只是用来读的,如果替换掉屏幕DC,很可能影响程序的正常显示

因此,这个Hook点是不能用的

阅读全文 »

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment