除了很熟悉的跨进程注入(远程注入)等技术外。记录一些其它的小函数。
1、mouse_event/key_event ( SendInput ) 按键/鼠标模拟(鼠标/键盘按键精灵)、
void mouse_event(
DWORD dwFlags, //具体的按键动作,如:左键、右键等。
DWORD dx, // x坐标
DWORD dy, // y坐标
DWORD dwData, // 数据,如滚轮动作,此参数表示滚轮滑动的角度等
ULONG_PTR dwExtraInfo // 附加信息,使用LPARAM GetMessageExtraInfo();的返回值
);
void keybd_event(
BYTE bVk, //1-254的虚拟键码.数值/字母为其ASCII码,其他以VK_开头的宏
BYTE bScan, //硬件扫描码,
DWORD dwFlags, //取值范围:KEYEVENTF_EXTENDEDKEY,KEYEVENTF_KEYUP(是否是抬起)
ULONG_PTR dwExtraInfo //附件信息,通常为0
);
微软推荐使用上面2个函数的替代函数
UINT SendInput(
UINT cInputs, //pInputs元素的个数
LPINPUT pInputs, // 数据首地址,可包含多个鼠标、键盘动作
int cbSize // 必须为sizeof(INPUT)
);
//按键模拟示例:
// 设置数字锁定键按下或抬起
void SetNumLock( BOOL bState )
{
BYTE keyState[256];
// 获取当前状态
GetKeyboardState((LPBYTE)&keyState);
// 如果与要设置的状态不同
if( (bState && !(keyState[VK_NUMLOCK] & 1)) ||
(!bState && (keyState[VK_NUMLOCK] & 1)) )
{
// 一个按键由2个动作组成
// 先模拟一个按下数字锁定键
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0 );
// 再模拟一个抬起动作
keybd_event( VK_NUMLOCK,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);
}
}
Header | winuser.h (include Windows.h) |
Library | User32.lib |
DLL | User32.dll |
2、RegisterHotKey 注册系统热键
3、ToggleDesktop 任务栏的“显示桌面”按钮 (IShellDispatch4的函数) 样例:
#include
#pragma comment(lib,"Shell32.lib")
void toggleDesktop( )
{
//需要初始化COM,否则失败 CoInitialize(NULL);
IShellDispatch4 * pInterface = NULL;
HRESULT hResult = CoCreateInstance(
CLSID_Shell,NULL,
CLSCTX_ALL,
__uuidof(IShellDispatch4),
(void **)&pInterface);
if (!SUCCEEDED(hResult ))
{
/// log: create IShellDispatch4 object failed.
return;
}
ASSERT( NULL != pInterface );
hResult = pInterface ->ToggleDesktop();
if( !SUCCEEDED(hResult))
{
/// log: create ToggleDesktop failed.
}
pInterface ->Release();
/// call succeeded!
}
Header | Shldisp.h |
IDL | Shldisp.idl |
DLL | Shell32.dll (version 6.0 or later) |
4.BOOL IsDebuggerPresent(); 检查当前程序是否 使用用户态的调试器在调试。
头是件 | debugapi.h (include Windows.h) |
编译库 | Kernel32.lib |
动态库 | Kernel32.dll |
5.ReadProcessMemory/WriteProcessMemory读写进程内存
BOOL ReadProcessMemory(
HANDLE hProcess, // 目标进程句柄,此句柄必须有PROCESS_VM_READ权限
LPCVOID lpBaseAddress, //要读取的内存起始地址,目标进程
LPVOID lpBuffer, //读取的数据缓存
SIZE_T nSize, //读取的数据缓存的长度
SIZE_T *lpNumberOfBytesRead // 实际读取的数目
);
//写入,参数函数类似于读取
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T *lpNumberOfBytesWritten
);
Header | memoryapi.h (include Windows.h) |
Library | Kernel32.lib |
DLL | Kernel32.dll |
6.BOOL WINAPI SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, _In_ WORD wAttributes );
BOOL WINAPI GetConsoleScreenBufferInfo( _In_ HANDLE hConsoleOutput, _Out_ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo );
读取(监视)控制台缓冲
Header |
ConsoleApi2.h (via Wincon.h, include Windows.h) |
Library |
Kernel32.lib |
DLL |
Kernel32.dll |
9.BOOL GetSystemPowerStatus( LPSYSTEM_POWER_STATUS lpSystemPowerStatus );获取电源相关数据(包括当前电量)
Header | winbase.h (include Windows.h) |
Library | Kernel32.lib |
DLL | Kernel32.dll |
10.int GetTextCharset( __in HDC hdc ); 获取当前的语言环境。如:中文,英文等。
Header | wingdi.h (include Windows.h) |
Library | Gdi32.lib |
DLL | Gdi32.dll |
11.LPCH GetEnvironmentStrings(); 获取当前进程的系统环境变量。
Header | processenv.h (include Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2, Windows.h) |
Library | Kernel32.lib |
DLL | Kernel32.dll |