常用API函数
模拟鼠标
1
|
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
|
其中Msg可以为WM_LBUTTONDOWN或WM_LBUTTONUP,表示对鼠标的软件模拟操作(虽然兼容性和安全性不如硬件模拟的mouse_event,但不改变移动鼠标指针)
故一般写作SendMessage(hwnd, WM_LBUTTONUP/WM_LBUTTONDOWN, 0, Y坐标<<16+X);
Msg也可以为WM_CLOSE,表示关闭窗口,其后的两个参数传0即可.
DLL注入
CreateThread 将在主线程的基础上创建一个新线程
1
|
HANDLE CreateThread(LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD ,LPDWORD);
|
VirtualAllocEx 向指定进程申请内存
1
2
3
4
5
6
7
|
LPVOID VirtualAllocEx(
HANDLE hProcess, //申请内存所在的进程句柄。
LPVOID lpAddress, //保留页面的内存地址;一般用NULL自动分配 。
SIZE_T dwSize, //欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
DWORD flAllocationType, //一般用MEM_COMMIT
DWORD flProtect //一般用PAGE_READWRITE(读写)
);
|
GetProcAddress 获得指定的动态链接库(DLL)中的输出库函数地址
1
2
3
4
5
|
FARPROC GetProcAddress(
[in] HMODULE hModule, //包含函数或变量的DLL模块的句柄
[in] LPCSTR lpProcName //函数或变量名称,或函数的序数值
);//返回值是导出函数或变量的地址
//如果函数失败,返回值为NULL
|
GetModuleHandleA 获得指定模块的模块句柄
1
2
3
4
|
HMODULE GetModuleHandleA(
[in, optional] LPCSTR lpModuleName //加载模块的名称(.dll或.exe文件)
);//返回值是指定模块的句柄。
//如果函数失败,返回值为NULL
|
CreateRemoteThread 创建一个在其它进程地址空间中运行的线程
1
2
3
4
5
6
7
8
9
|
HANDLE CreateRemoteThread(
[in] HANDLE hProcess, //目标进程句柄
[in] LPSECURITY_ATTRIBUTES lpThreadAttributes, //指针,一般设置为NULL
[in] SIZE_T dwStackSize, //纯种堆栈大小,一船设置为0,表示默认为1M
[in] LPTHREAD_START_ROUTINE lpStartAddress, //线程函数的地址(目标进程代码地址)
[in] LPVOID lpParameter, //线程参数
[in] DWORD dwCreationFlags, //线程的创建标志
[out] LPDWORD lpThreadId //输出参数,记录创建的远程线程的ID,不输出可传NULL
);
|
GetExitCodeThread 检索指定线程的终止状态。
1
2
3
4
5
6
7
|
BOOL GetExitCodeThread(
[in] HANDLE hThread, //线程句柄
[out] LPDWORD lpExitCode //指向变量的指针,以接收线程终止状态。
);
//返回值
//如果函数成功,返回值为非零。
//如果函数失败,返回值为零。
|
DLL劫持
__asm{ }
执行括号内的汇编代码
JMP EAX
将EIP跳转到EAX执行,劫持DLL后要获取真正的原函数地址,使用时要进行跳转
GDI绘图
检索显示设备上下文环境的句柄
CDC
CDC类定义的是设备上下文对象的类
1
2
|
CPoint CDC::MoveTo(int x,int y);
CPoint CDC::LineTo(int x,int y);
|
绘制直线
1
|
BOOL CDC::Ellipse(int x1,int y1,int x2,int y2);
|
绘制圆形
1
|
BOOL CRgn::CreateRectRgn(int x1,int y1,int x2,int y2);
|
建立方形区域
1
|
BOOL CRgn::CreateEllipticRgn(int x1,int y1,int x2,int y2)
|
建立圆形区域
1
|
int CombineRgn(CRgn pRgn1,CRgn pRgn2,int nCombineMode );
|
合并区域(圆点准心为使得中间透明采取大圆-小圆的区域)
1
|
BOOL FillRgn(CRgn pRgn,CBrush pBrush );
|
填充形状
设置钩子API
1
2
3
4
5
6
|
HHOOK WINAPI SetWindowsHookEx(
_In_ int idHook, //设置钩子的类型.意思就是我要设置的钩子是什么钩子. 可以是监视窗口过程.可以是监视消息队列.
_In_ HOOKPROC lpfn, //根据钩子类型.设置不同的回调函数.
_In_ HINSTANCE hMod, //钩子设置的Dll实例句柄,就是DLL的句柄
_In_ DWORD dwThreadId //设置钩子的线程ID. 如果为0 则设置为全局钩子.
); //HHOOK 返回值. 是一个钩子过程句柄.
|
输入与输出
1
2
3
4
5
6
7
8
9
|
#include <iostream>
//输出
int a =1;
printf("Hello \n");
printf("%d",a);
//输入
scanf_s("%d",&a); //输入一个值,并赋值给a
|
其它API函数
MoveWindow
1
|
BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint );
|
改变指定窗口的位置和大小
IsWindow
1
|
BOOL IsWindow(HWND hWnd);
|
判断是否是有效窗口句柄
ShowWindow
1
|
BOOL ShowWindow(HWND hWnd, int nCmdShow);
|
显示隐藏窗口
ShowWindowAsync
1
|
BOOL ShowWindowAsync(HWND hWnd,int nCmdshow);
|
异步显示窗口
IsWindowVisible
1
|
BOOL IsWindowVisible(HWND hWnd);
|
获取窗口可视状态,即显示或隐藏
IsZoomed
1
|
BOOL IsZoomed(HWND hWnd);
|
窗口是否是最大化
IsWindowUnicode
1
|
BOOL IswindowUnicode(HWND hwnd);
|
判断窗口字符集 由RegisterClassA 还是RegisterClassW注册
CloseWindow
1
|
BOOL CloseWindow(HWND hWnd);
|
关闭窗口
WindowFromPoint
1
|
HWND WindowFromPoint(POINT Point);
|
获取指定坐标处的窗口句柄
ChildWindowFromPoint
1
|
HWND ChildWindowFromPoint (HWND hWndParent, POINT Point);
|
获取指定窗口 坐标处子窗口句柄
GetWindowText
1
2
3
4
5
|
Int GetWindowText(HWND hWnd,LPTSTR lpString,Int nMaxCount);
// int 如果函数成功,返回值是拷贝的字符串的字符个数,不包括中断的空字符;如果窗口无标题栏或文本,或标题栏为空,或窗口或控制的句柄无效,则返回值为零。
// hWnd:带文本的窗口或控件的句柄。
// lpString:指向接收文本的缓冲区的指针。
// nMaxCount:指定要保存在缓冲区内的字符的最大个数,其中包含NULL字符。如果文本超过界限,它就被截断。
|
获取窗口标题字符串
GetClassName
1
2
3
4
5
6
|
int GetClassName(
HWND hWnd, //窗口的句柄及间接给出的窗口所属的类。
LPTSTR IpClassName, //指向接收窗口类名字符串的缓冲区的指针。
int nMaxCount //指定由参数lpClassName指示的缓冲区的字节数。如果类名字符串大于缓冲区的长度,则多出的部分被截断。
);
// 返回值: 如果函数成功,返回值为拷贝到指定缓冲区的字符个数:如果函数失败,返回值为0
|
获取窗口注册的类名,由RegisterClass注册时的名字
BringWindowToTop
1
|
B00L BringWindowToTop(HWND hWnd);
|
窗口激活并切换到Z序顶层
EnableWindow
1
|
BOOL EnableWindow(HWND hWnd,BOOL bEnable);
|
是否接收键盘鼠标消息
EnumChildWindows
1
|
BOOL EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc, LPARAM lParam);
|
遍历子窗口
SetWindowPos
1
|
WINUSERAPI BOOL WINAPI SetWindowPos(HWND hWnd,HWND hWndInsertAfter,int X,int Y,int cx, int cy, UINT uFlags);
|
窗口位置设置
SetWindowText
1
|
BOOL SetWindowText(HWNDhwnd,LPCTSTRlpString);
|
设置窗口标题,SetWindowText也分A和W两种