目录

常用API函数

常用API函数


模拟鼠标

1
LRESULT SendMessage(HWND hWndUINT MsgWPARAM wParamLPARAM 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绘图

1
HDC GetDC(HWND hWnd);

检索显示设备上下文环境的句柄

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 y1int 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 hWndint 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 hWndBOOL 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两种