盘点某些不常用但是很好玩(?)的 DLL API
0x00 什么是 DLL API
DLL(Dynamic link library)是一种微软的 PE 文件格式,用于在多个程序共享公开的函数。DLL 使程序开发更加简单,开发者不必再一次开发功能或复制代码,而是直接引用 DLL 中的 API,使程序开发更加便捷。
0x01 正片开始
以下是某些好玩的 DLL API,可以使您的程序进化出各种有趣的功能。
SetWindowDisplayAffinity,位于 user32.dll 内
函数格式:
BOOL SetWindowDisplayAffinity(
HWND hWnd, // 填写您的应用程序的窗口句柄(必须为本程序)
DWORD dwAffinity // 方式
);
通过使用此函数,可以使您的软件在 录屏、屏幕截图 等屏幕采集中不可见,保护了用户的隐私或者版权内容。
调用方法:
HWND hWnd
需要反截图的窗口句柄(窗口只能是当前进程的,对其他窗口操作无效)。若想要反截图其他程序的窗口,请使用远程执行代码或代码注入。
在任务栏的预览中,也会反截屏。
DWORD dwAffinity
反截图的类型。
0:取消窗口的反截屏
1:在系统截屏时将窗口内容全部隐藏(变成黑色)
0x00000011(十六进制)/ 17 (十进制):在系统截屏是完全隐藏窗口
NtRaiseHardError,位于 ntdll.dll 内(愚人节必备,哈哈哈)
函数格式:
NTSTATUS HpNtRaiseHardError( NTSTATUS ErrorStatus, // 错误代码(例如,0xEF) ULONG NumberOfParameters, // 参数常量(填 0 就行) ULONG UnicodeStringParameterMask, // Unicode 字符串掩码(填 0 就行) PULONG_PTR Parameters, // 参数数组 ULONG ValidResponseOptions, // 操作 PULONG Response // 响应(可忽略) );
调用此函数,如果“操作”参数填写了 6 或者 0x00000003,将会马上触发蓝屏。请保存好您的工作。
调用方法:
NTSTATUS ErrorStatus
错误代码,可以填写 0xEF(关键进程终止),或者其他参数(自行查找)。
比土方法(杀死 wininit 好多了,这个不用管理员也能实现蓝屏。)
BlockInput,位于 user32.dll 内(愚人节必备 × 2)
函数格式:
BOOL BlockInput(
BOOL fBlockIt
);
通过调用此函数,可以锁定或解除锁定鼠标和键盘。
调用方法
BOOL fBlockIt
是否阻止输入。TRUE 则阻止鼠标和键盘输入,FALSE 则解除。
DrawIcon,位于 user32.dll 内(这个应该也属于愚人节必备把)
函数格式:
BOOL DrawIcon( HDC hDC, int X, int Y, HICON hIcon );
通过调用此函数,可以绘制图标。
调用方法
HDC hDC
设备句柄。可以使用 HDC hdc = GetWindowDC(GetDesktopWindow()) 来获取。
int X, int Y
要绘制的位置坐标。
HICON hIcon
图标句柄。可使用 LoadIcon(NULL, lpIconName) 获取。
lpIconName 可以是 IDI_WARNING(警告图标),IDI_ERROR(错误图标)等。
示例代码:跟着鼠标移动位置画图标
POINT cursor; while (TRUE) { GetCursorPos(&cursor); // 获取鼠标坐标 DrawIcon(GetWindowDC(GetDesktopWindow()), cursor.x * 1.75, cursor.y * 1.75, LoadIcon(NULL, IDI_WARNING)); // 加载并绘制图标 Sleep(10); // 防止 CPU 过高 }
该代码将会跟随鼠标画警告图标。
效果如图: