Window api(一)

我这个学生党(大三)放寒假了,然而我有寒假作业,其中一个就是编写木马与木马查杀。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的。

(持续更新中)

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180119G04UUH00?refer=cp_1026

扫码关注云+社区