我这个学生党(大三)放寒假了,然而我有寒假作业,其中一个就是编写木马与木马查杀。So,我开始学习如何木马如何制作、运行原理、如何防御。在搜集资料过程中,发现木马的第一站是window api,so有了这个window api专题。
在学任何编程语言,第一次很多都是hello,word!,本文也以hello word开篇
#include
int main()
{
MessageBox(NULL, (LPCSTR)"hello, world!", (LPCSTR)"Title", MB_OK);
return 0;
}
一.Window api 简介
Windows API 就是windows应用程序接口,是针对microsoft windows操作系统家族的系统编程接口。其中32位Windows操作系统的编程接口称为 Win32 API,以便与以前16位版本Windows编程接口(16位Windows API)区别开来。
二.Window api 功能分类
Windows API所提供的功能可以归为七类:
0x01基础服务(Base Services)
提供对Windows系统可用的基础资源的访问接口。比如象:文件系统(file system)、外部设备(device)、,进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。这些功能接口位于,16位Windows下的kernel.exe、krnl286.exe或krnl386.exe系统文档中;以及32位Windows下的 kernel32.dll和advapi32.dll中。
0x02图形设备接口(GDI)
输出图形内容到显示器、打印机以及其他外部输出设备。它位于16位Windows下的gdi.exe;以及32位Windows下的gdi32.dll。
0x03图形化用户界面(GUI)
提供的功能有创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。接收鼠标和键盘输入,以及其他与GUI有关的功能。这些调用接口位于:16位Windows下的user.exe,以及32位Windows下的user32.dll。从Windows XP版本之后,基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32.dll中。
0x04通用对话框链接库(Common Dialog Box Library)
为应用程序提供标准对话框,比如打开/保存文档对话框、颜色对话框和字体对话框等等。这个链接库位于:16位Windows下的commdlg.dll中,以及32位Windows下comdlg32.dll中。它被归类为User Interface API之下。
0x05通用控件链接库(Common Control Library)
为应用程序提供接口来访问操作系统提供的一些高级控件。比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。这个链接库位于:16位Windows下的commctrl.dll中,以及32位Windows下comctl32.dll中。。它被归类为User Interface API之下。
0x06Windows外壳(Windows Shell)
作为Windows API的组成部分,不仅允许应用程序访问Windows外壳提供的功能,还对之有所改进和增强。它位于16位Windows下的shell.dll中,以及32位Windows下的shell32.dll中(Windows 95则在 shlwapi.dll中)。 它被归类为User Interface API之下。
0x07网络服务(Network Services)
为访问操作系统提供的多种网络功能提供接口。它包括NetBIOS、Winsock、NetDDE及RPC等。
三.Windows 数据类型
学习windwos编程,第一步就需要了解 windows 编程所常用的数据类型。 Windows API 中定义了很多 Windows 自己定义的数据类型。对于函数的入口参数、返回值以及一些数据结构等等都使用的是 windows 数据类型,所以这也是一个必不可少的步骤。
0x01 常见数据类型
windef.h
typedef int INT; /* 整形 */
typedef unsigned int UINT; /* 无符号整形 */
typedef unsigned int *PUINT; /* 无符号整形指针 */
typedef int BOOL; /* 布尔类型 */
typedef unsigned char BYTE; /* 字节 */
typedef unsigned short WORD; /* WORD (无符号短整型) */
typedef unsigned long DWORD; /* DOUBLE WORD (无符号长整形)*/
typedef float FLOAT; /* 浮点型 */
typedef FLOAT *PFLOAT; /* 指向float类型指针 */
typedef BOOL near *PBOOL; /* 指向布尔类型指针 */
typedef BOOL far *LPBOOL;
typedef BYTE near *PBYTE; /* 指向字节类型指针 */
typedef BYTE far *LPBYTE;
typedef int near *PINT; /* 整形指针 */
typedef int far *LPINT;
typedef WORD near *PWORD; /* 指向WORD类型的指针 */
typedef WORD far *LPWORD;
typedef long far *LPLONG; /* 指向长整形的指针 */
typedef DWORD near *PDWORD; /* 指向DWORD类型的指针 */
typedef DWORD far *LPDWORD;
typedef void far *LPVOID; /* 指向void类型的指针 */
typedef CONST void far *LPCVOID; /* 指向void类型的常指针 */
0x02 Windows 数据类型名命名的规律
无符号类型:一般是以“U”开头,比如“INT”对应的“UINT”。
指针类型:其指向的数据类型前加“LP”或“P”,比如指向 DWORD
的指针类型为“LPDWORD”和“PDWORD”。
句柄类型:以“H”开头。比如,HWND 是window(WND简写)也就是窗口的句柄,菜单(MENU)类型对应的句柄类型为 “HMENU” 等。
0x03 参数简写
b 布尔
by BYTE
c chr 或WCHAR TCHAR
n short
i int
x、y 分别表示x 坐标,y 坐标
cx、cy 分别表示x 方向长度和y 方向长度
b 或f BOOL(int),f 代表“flag”
w WORD(无符号short)
l LONG 长整数
dw DWORD 无符号长整数
fn function 函数
s string 字符串
sz 以0 字节结尾的字符串
h 句柄
p 指针
lpfn 指向函数的长指针
cb 字节数
lpsz 指向以0 结尾的字符串的长指针
g_ 全局变量
c_ 常量
m_ 类数据成员
s_ 静态变量
CS_ 类风格选项
CW_ 创建窗口选项
DT_ 绘制文本选项
IDI_ 图标ID 号
IDC_ 光标ID 号
MB_ 消息框选项
SND_ 声音选项
WM_ 窗口消息
WS_ 窗口风格
rc 矩形
0x04 Windows数据类型与标准C数据类型的关系
查看Windows数据类型的定义可以看到,所有的windows数据类型都是由C数据类型经过类型重定义得到的。
DWORD实质上就是 unsigned long 数据类型,32位无符号整型。
HANDLE类型实质上是void,HANDLE定义为:
typedof PVOID HANDLE;
HANDLE实际上就是一个PVOID,PVOID就是指向void的指针。
typeof void *PVOID;
所有的Windows数据类型都是通过这种方式在SDK的头文件中进行定义的,它们都是来源于标准C的。
(持续更新中)
领取专属 10元无门槛券
私享最新 技术干货