【逆向】病毒木马常用API函数功能参数详解

时间:2024-03-01 19:41:55

算法

https://www.cnblogs.com/dspeeding/p/3338129.html
http://blog.sina.com.cn/s/blog_9cd8465f0102uy5d.html

 1 // 获取CSP中特定密钥容器的句柄
 2 BOOLEAN CRYPTFUNC CryptAcquireContext(
 3   [out]HCRYPTPROV* phProv,       //返回csp句柄
 4   [in]LPCTSTR pszContainer,      //密钥容器名称,指向密钥容器的字符串指针
 5   [in]LPCTSTR pszProvider,       //指向CSP名称的字符串指针,如果为NULL,则使用默认的CSP
 6   [in]DWORD dwProvType,          //CSP类型
 7   [in]DWORD dwFlags              //标志
 8 );                               //失败=0,成功!=0
 9 
10 // 获取CSP哈希对象句柄,可以使用此句柄来哈希数据和会话密钥
11 BOOL CRYPTFUNC CryptCreateHash(
12   [in]HCRYPTPROV hProv,          //csp句柄
13   [in]ALG_ID Algid,             //哈希算法标识(CALG_MD5=8003,CALG_SHA_256等)
14   [in]HCRYPTKEY hKey,            //如果哈希算法是密钥哈希,如HMACH或者MAC算法,就用此密钥句柄传递密钥,对于非密钥算法,此参数为NULL
15   [in]DWORD dwFlags,             //保留,必须为0
16   [out]HCRYPTHASH* phHash        //返回创建的哈希对象句柄
17 );                               //成功=1,失败=0
18 
19 // 计算一段数据的哈希值并加入到指定的哈希句柄中
20 BOOL WINAPI CryptHashData(
21   [in]HCRYPTHASH hHash,          //哈希句柄
22   [in]BYTE* pbData,              //要添加到哈希对象的数据指针
23   [in]DWORD dwDataLen,           //数据长度
24   [in]DWORD dwFlags              //标识(所有Microsoft加密服务提供商都忽略此参数)
25 );                               //成功=1,失败=0
26 
27 // 从哈希对象中查询指定参数(可以获取CryptHashData哈希结果)
28 BOOL WINAPI CryptGetHashParam(
29   [in]      HCRYPTHASH hHash,    //哈希句柄
30   [in]      DWORD dwParam,       //需要获取参数的类型标识(哈希算法=1,哈希值=2,哈希值长度=4)
31   [out]     BYTE *pbData,        //缓冲区指针
32   [in,out]  DWORD *pdwDataLen,   //缓冲区长度
33   [in]      DWORD dwFlags        //保留,必须为0
34 );                               //成功=1,失败=0
35 
36 // 用哈希后的数据生成加密会话密钥
37 BOOL CRYPTFUNC CryptDeriveKey(
38   [in]HCRYPTPROV hProv,          //csp句柄
39   [in]ALG_ID Algid,              //用于生成密钥的算法标识(CALG_MD5/CALG_SHA_256等)
40   [in]HCRYPTHASH hBaseData,      //用CryptHashData计算数据哈希后,返回的哈希对象句柄
41   [in]DWORD dwFlags,             //在生成会话密钥时设置会话密钥的大小
42   [out]HCRYPTKEY* phKey          //返回新生成密钥的句柄指针
43 );                               //成功=1,失败=0
44 
45 // 用随机数生成加密会话密钥
46 BOOL WINAPI CryptGenKey(
47   [in]   HCRYPTPROV hProv,       //csp句柄
48   [in]   ALG_ID Algid,           //用于生成密钥的算法标识(CALG_MD5/CALG_SHA_256等)
49   [in]   DWORD dwFlags,          //指定创建密钥的长度及其他属性
50   [out]  HCRYPTKEY *phKey        //返回创建的密钥句柄
51 );                               //成功=1,失败=0
52 
53 // 导入加密密钥到csp
54 BOOL WINAPI CryptImportKey(
55   _In_   HCRYPTPROV hProv,       //csp句柄
56   _In_   BYTE *pbData,           //密钥缓冲区
57   _In_   DWORD dwDataLen,        //缓冲区长度
58   _In_   HCRYPTKEY hPubKey,      //用户解密pbData参数的密钥句柄(如果pbData参数指向的密钥未加密,此参数=0)
59   _In_   DWORD dwFlags,          //该参数仅在将PRIVATEKEYBLOB形式的公钥/私钥对导入到CSP时才使用
60   _Out_  HCRYPTKEY *phKey        //返回导入密钥的句柄
61 );                               //成功!=0,失败=0
62 
63 // 设置密钥参数
64 BOOL WINAPI CryptSetKeyParam(
65   [in]HCRYPTKEY hKey,            //要设置参数的密钥句柄
66   [in]DWORD dwParam,             //参数类型(例如设置AES_CBC加密算法中的向量IV)
67   [in]BYTE* pbData,              //参数缓冲区的指针(如果参数类型是向量IV,该缓冲区保存的就是IV值)
68   [in]DWORD dwFlags              //保留,必须为零
69 );                               //成功=1,失败=0
70 
71 // 获取密钥参数
72 BOOL CRYPTFUNC CryptGetKeyParam(
73   [in]HCRYPTKEY hKey,            //要查询的密钥句柄
74   [in]DWORD dwParam,             //参数类型
75   [out]BYTE* pbData,             //参数缓冲区的指针
76   [in,out]DWORD* pdwDataLen,     //长度
77   [in]DWORD dwFlags              //保留,必须为零
78 );                               //成功=1,失败=0
79 
80 // 使用指定密钥来解密一段密文
81 BOOL CRYPTFUNC CryptDecrypt(
82   [in]HCRYPTKEY hKey,            //解密密钥句柄
83   [in]HCRYPTHASH hHash,          //哈希对象句柄,如果不需要散列设置为零
84   [in]BOOL Final,                //指定这是否是正在被解密数据的最后一节。如果是最后一个或唯一的块,这个值为真;
85   [in]DWORD dwFlags,             //保留,必须为零
86   [in,out]BYTE* pbData,          //加密数据缓冲区,解密后保存明文
87   [in,out]DWORD* pdwDataLen      //长度
88 );                               //成功=1,失败=0

网络

https://blog.csdn.net/analogous_love/article/details/72515002
https://docs.microsoft.com/zh-cn/windows/win32/wininet/wininet-functions?redirectedfrom=MSDN

  1 //分解一个完整的URL,获取不同字段数据
  2 BOOL InternetCrackUrl(
  3   [in]     LPCTSTR lpszUrl,                    //需要分解的URL
  4   [in]     DWORD dwUrlLength,                  //长度
  5   [in]     DWORD dwFlags,                      //选项
  6   [in,out]  LPURL_COMPONENTS lpUrlComponents   //分解后的每个字段数据保存在该结构体中
  7 );
  8 
  9 //初始化应用程序对WinINet函数的使用(类似WSAStartup())
 10 HINTERNET InternetOpen(
 11   [in]LPCTSTR lpszAgent,                       //浏览器UserAgent(可以随意写)
 12   [in]DWORD dwAccessType,                      //访问类型(可以设置不同常量)
 13   [in]LPCTSTR lpszProxyName,                   //使用代理请求时的代理名称
 14   [in]LPCTSTR lpszProxyBypass,                 //使用代理请求时的代理IP.PORT
 15   [in]DWORD dwFlags                            //其它可用选项
 16 );                                             //失败返回null,否则返回可用句柄
 17 
 18 //打开给定站点的文件传输协议(FTP)或HTTP会话
 19 HINTERNET InternetConnect(
 20   [in]  HINTERNET hinternet,                   //InternetOpen返回的句柄
 21   [in]  LPCTSTR lpszServerName,                //服务器 域名或IP
 22   [in]  INTERNET_PORT nServerPort,             //服务器 端口
 23   [in]  LPCTSTR lpszUsername,                  //要登录的用户名称(null=默认值)
 24   [in]  LPCTSTR lpszPassword,                  //要登录的用户密码(null=默认值)
 25   [in]  DWORD dwService,                       //要访问的服务类型(ftp/http等)
 26   [in]  DWORD dwFlags,                         //特定于所使用服务的选项(一般=0)
 27   [in]  DWORD_PTR dwContext                    //标识回调中返回句柄的应用程序上下文(一般=0)
 28 );                                             //失败返回null,否则返回可用句柄
 29 
 30 //创建一个HTTP请求句柄
 31 HINTERNET HttpOpenRequest(
 32   [in]  HINTERNET hConnect,                    //InternetConnect返回的句柄
 33   [in]  LPCTSTR lpszVerb,                      //请求方法(GET/POST等)
 34   [in]  LPCTSTR lpszObjectName,                //请求路径(/index.php等)
 35   [in]  LPCTSTR lpszVersion,                   //HTTP版本(HTTP/1.0 或 1.1)
 36   [in]  LPCTSTR lpszReferer,                   //HTTP引用(null=不指定引用)
 37   [in]  LPCTSTR *lplpszAcceptTypes,            //客户端希望接收的媒体数据类型(比如:Accept:text/xml)
 38   [in]  DWORD dwFlags,                         //可用选项(一般=0)
 39   [in]  DWORD_PTR dwContext                    //上下文相关(一般=0)
 40 );                                             //失败返回null,否则返回可用句柄
 41 
 42 //将指定的请求发送到HTTP服务器
 43 BOOL HttpSendRequest(
 44   [in]  HINTERNET hRequest,                    //HttpOpenRequest返回的句柄
 45   [in]  LPCTSTR lpszHeaders,                   //附加到请求中的附加头(null)
 46   [in]  DWORD dwHeadersLength,                 //附加头长度
 47   [in]  LPVOID lpOptional,                     //要发送的body数据
 48   [in]  DWORD dwOptionalLength                 //body数据长度
 49 );                                             //成功=TRUE 失败=FALSE
 50 
 51 //将指定的请求发送到HTTP服务器(加强版)
 52 BOOL HttpSendRequestEx(
 53   [in]   HINTERNET hRequest,                   //HttpOpenRequest返回的句柄
 54   [in]   LPINTERNET_BUFFERS lpBuffersin,       //结构体
 55   [out]  LPINTERNET_BUFFERS lpBuffersout,      //结构体
 56   [in]  DWORD dwFlags,                         //保留,必须是0
 57   [in]  DWORD_PTR dwContext                    //上下文相关(一般=0)
 58 );                                             //成功=TRUE 失败=FALSE
 59 
 60 //检索与HTTP请求关联的头信息
 61 BOOL HttpQueryinfo(
 62   [in]     HINTERNET hRequest,                 //HttpOpenRequest或internetOpenUrl返回的句柄
 63   [in]     DWORD dwinfoLevel,                  //要查询的属性和修改请求的标志组合
 64   [in,out]  LPVOID lpvBuffer,                  //接收查询结果的缓冲区
 65   [in,out]  LPDWORD lpdwBufferLength,          //缓冲区长度
 66   [in,out]  LPDWORD lpdwindex                  //下标索引(一般=0)
 67 );                                             //成功=TRUE 失败=FALSE
 68 
 69 //查询服务器返回的可用数据
 70 BOOL InternetQueryDataAvailable(
 71   [in]   HINTERNET hFile,                      //HttpOpenRequest等函数返回的句柄
 72   [out]  LPDWORD lpdwNumberOfBytesAvailable,   //返回可用字节数
 73   [in]   DWORD dwFlags,                        //保留,必须为0
 74   [in]   DWORD_PTR dwContext                   //保留,必须为0
 75 );                                             //成功=TRUE 失败=FALSE
 76 
 77 //读取服务器返回的数据
 78 BOOL InternetReadFile(
 79   [in]   HINTERNET hFile,                      //HttpOpenRequest等函数返回的句柄
 80   [out]  LPVOID lpBuffer,                      //缓冲区
 81   [in]   DWORD dwNumberOfBytesToRead,          //要读取的字节数
 82   [out]  LPDWORD lpdwNumberOfBytesRead         //实际读取的字节数
 83 );                                             //成功=TRUE 失败=FALSE
 84 
 85 //--------------------------------------------------------------------
 86 
 87 //将URL拆解为多个组成部分
 88 BOOL WINAPI WinHttpCrackUrl(
 89   [in]     LPCWSTR pwszUrl,                    //待拆解URL
 90   [in]     DWORD dwUrlLength,                  //URL 长度
 91   [in]     DWORD dwFlags,                      //可选标识
 92   [in,out]  LPURL_COMPONENTS lpUrlComponents   //返回拆解后的结构体
 93 );                                             //成功=True,失败=False
 94 
 95 //初始化并返回WinHTTP会话句柄
 96 HINTERNET WINAPI WinHttpOpen(            
 97   [in,opt]  LPCWSTR pwszUserAgent,             //应用程序标识(例如:Mozilla/5.0 (Windows NT 6.2; Win64; rv:47.0))
 98   [in]      DWORD dwAccessType,                //访问类型(直接解析主机名或使用代理等)
 99   [in]      LPCWSTR pwszProxyName,             //代理服务器名称
100   [in]      LPCWSTR pwszProxyBypass,           //代理服务器密码
101   [in]      DWORD dwFlags                      //可选标识(同步、异步等)
102 );                                             //成功=句柄,失败=NULL
103 
104 //指定HTTP请求的目标服务器
105 HINTERNET WINAPI WinHttpConnect(
106   [in]        HINTERNET hSession,              //WinHttpOpen返回的句柄
107   [in]        LPCWSTR pswzServerName,          //域名或IP地址
108   [in]        INTERNET_PORT nServerPort,       //端口(80、443、或同时支持)
109   [Reserved]  DWORD dwReserved                 //保留 = 0
110 );                                             //成功=句柄,失败=NULL
111 
112 //创建并返回HTTP请求句柄
113 HINTERNET WINAPI WinHttpOpenRequest(
114   [in]  HINTERNET hConnect,                    //WinHttpConnect返回的句柄
115   [in]  LPCWSTR pwszVerb,                      //请求方法(GET、POST等)
116   [in]  LPCWSTR pwszObjectName,                //要访问的资源名称(例如:index.html等)
117   [in]  LPCWSTR pwszVersion,                   //HTTP版本(NULL = HTTP/1.1)
118   [in]  LPCWSTR pwszReferrer,                  //引用来源
119   [in]  LPCWSTR *ppwszAcceptTypes,             //客户端接收的文件类型(例如:text等)
120   [in]  DWORD dwFlags                          //可选标识
121 );                                             //成功=句柄,失败=NULL
122 
123 //添加HTTP请求头字段
124 BOOL WINAPI WinHttpAddRequestHeaders(
125   [in]  HINTERNET hRequest,                    //WinHttpOpenRequest返回的句柄
126   [in]  LPCWSTR pwszHeaders,                   //要添加到请求头的字段数据指针(例如:Content-Type: application等)
127   [in]  DWORD dwHeadersLength,                 //数据长度,如果等于-1则自动计算长度
128   [in]  DWORD dwModifiers                      //可选标识
129 );                                             //成功=True,失败=False
130 
131 //设置WinHTTP选项
132 BOOL WINAPI WinHttpSetOption(
133   [in]  HINTERNET hInternet,                   //句柄
134   [in]  DWORD dwOption,                        //选项
135   [in]  LPVOID lpBuffer,                       //缓冲区
136   [in]  DWORD dwBufferLength                   //缓冲区长度
137 );                                             //成功=True,失败=False
138 
139 //向HTTP服务器发送指定请求
140 BOOL WINAPI WinHttpSendRequest(
141   [in]      HINTERNET hRequest,                //WinHttpOpenRequest返回的句柄
142   [in,opt]  LPCWSTR pwszHeaders,               //附加在请求头中的数据指针
143   [in]      DWORD dwHeadersLength,             //附加数据长度(-1 = 自动计算)
144   [in,opt]  LPVOID lpOptional,                 //要在请求头之后发送的数据指针(一般用于POST/PUT方法)
145   [in]      DWORD dwOptionalLength,            //数据长度
146   [in]      DWORD dwTotalLength,               //要发送数据的总长度
147   [in]      DWORD_PTR dwContext                //上下文,该值与请求句柄一起传递给任何回调函数(null = 没有)
148 );                                             //成功=True,失败=False
149 
150 //向HTTP服务器发送数据
151 BOOL WINAPI WinHttpWriteData(
152   [in]   HINTERNET hRequest,                   //WinHttpOpenRequest返回的句柄
153   [in]   LPCVOID lpBuffer,                     //缓冲区
154   [in]   DWORD dwNumberOfBytesToWrite,         //缓冲区长度
155   [out]  LPDWORD lpdwNumberOfBytesWritten      //实际写入长度
156 );                                             //成功=True,失败=False
157 
158 //接收HTTP服务器返回数据
159 BOOL WINAPI WinHttpReceiveResponse(
160   [in]        HINTERNET hRequest,              //WinHttpOpenRequest返回的句柄
161   [Reserved]  LPVOID lpReserved                //保留 = NULL
162 );                                             //成功=True,失败=False
163 
164 //获取与HTTP请求相关的信息
165 BOOL WINAPI WinHttpQueryHeaders(
166   [in]      HINTERNET hRequest,                //WinHttpOpenRequest返回的句柄
167   [in]      DWORD dwInfoLevel,                 //要查询的信息标识(例如:0x20000013=返回状态码))
168   [in,opt]  LPCWSTR pwszName,                  //包含标题名称的字符串指针
169   [out]     LPVOID lpBuffer,                   //缓冲区
170   [in,out]   LPDWORD lpdwBufferLength,         //缓冲区长度
171   [in,out]   LPDWORD lpdwIndex                 //下标索引(用于区分同名的字段)
172 );                                             //成功=True,失败=False

资源

 1 //查找资源
 2 HRSRC WINAPI FindResource(
 3   [in,opt]  HMODULE hModule,        //模块句柄
 4   [in]      LPCTSTR lpName,         //资源名称
 5   [in]      LPCTSTR lpType          //资源类型
 6 );                                  //成功=资源句柄 失败=NULL
 7 
 8 //加载资源
 9 HGLOBAL WINAPI LoadResource(
10   [in,opt]  HMODULE hModule,        //模块句柄
11   [in]      HRSRC hResinfo          //资源句柄
12 );                                  //成功=资源数据句柄 失败=NULL
13 
14 //获取资源
15 LPVOID WINAPI LockResource(
16   [in]  HGLOBAL hResData            //LoadResource返回的资源句柄
17 );                                  //成功=指向资源第一个字节的指针 失败=NULL
18 
19 //获取资源大小
20 DWORD WINAPI SizeofResource(
21   [in,opt]  HMODULE hModule,        //模块句柄
22   [in]      HRSRC hResinfo          //资源句柄
23 );                                  //成功=资源大小 失败=0

提权

https://blog.csdn.net/BetaBin/article/details/7393457
https://blog.csdn.net/china_jeffery/article/details/79173417

 1 //打开与进程关联的访问令牌。
 2 BOOL WINAPI OpenProcessToken(
 3   [in]   HANDLE ProcessHandle,                  //进程句柄,该进程必须具有PROCESS_QUERY_INFORMATION访问权限
 4   [in]   DWORD DesiredAccess,                   //指定访问掩码,表明请求什么类型的访问令牌
 5   [out]  PHANDLE TokenHandle                    //打开成功后返回新的访问令牌句柄
 6 );                                              //成功=TRUE 失败=FALSE
 7 
 8 //获取系统上用于表示指定特权名在本地的惟一标识符(LUID)
 9 BOOL WINAPI LookupPrivilegeValue(
10   [in,opt]  LPCTSTR lpSystemName,               //系统名称,NULL=查找本地系统上的特权名称
11   [in]      LPCTSTR lpName,                     //特权名称,如:SE_DEBUG_NAME
12   [out]     PLUID lpLuid                        //返回特权名称在指定系统上对应的特权LUID
13 );                                              //成功=TRUE 失败=FALSE
14 
15 //启用或禁用指定访问令牌中的特权
16 BOOL WINAPI AdjustTokenPrivileges(
17   [in]       HANDLE TokenHandle,                //访问令牌句柄
18   [in]       BOOL DisableAllPrivileges,         //TRUE=禁用令牌所有特权并忽略NewState参数 FALSE=根据NewState参数启用修改特权
19   [in,opt]   PTOKEN_PRIVILEGES NewState,        //TOKEN_PRIVILEGES结构体,包含需要变更的特权及修改方式
20   [in]       DWORD BufferLength,                //NewState参数大小
21   [out,opt]  PTOKEN_PRIVILEGES PreviousState,   //TOKEN_PRIVILEGES结构体,用于保存被修改前的所有特权(不需要可以=NULL)
22   [out,opt]  PDWORD ReturnLength                //PreviousState参数大小
23 );                                              //成功=TRUE 失败=FALSE
24 
25 //示例代码
26 void RaiseToDebug()
27 {
28     HANDLE hToken;
29     HANDLE hProcess = GetCurrentProcess();
30 
31     //打开与当前进程关联的访问令牌,第二个参数可以用TOKEN_ALL_ACCESS
32     if (OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
33     {
34         //获取"SE_DEBUG_NAME"特权,在当前系统上惟一标识符(LUID)
35         TOKEN_PRIVILEGES tkp;
36         if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid))
37         {
38             tkp.PrivilegeCount = 1;                                 //待修改特权数量
39             tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;    //待执行特权属性(启用/禁用 特权)
40 
41             //通知系统修改进程权限
42             BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0);
43         }
44         CloseHandle(hToken);
45     }
46 }

DLL

 1 //DllMain
 2 BOOL WINAPI DllMain(
 3     [in] HINSTANCE hinstDLL,      //指向自身的句柄
 4     [in] DWORD fdwReason,         //调用原因
 5     [in] LPVOID lpvReserved       //隐式加载和显式加载
 6 );
 7 
 8 fdwReason
 9 {
10     DLL_PROCESS_ATTACH            //1: 第一次映射DLL到进程地址空间
11     DLL_PROCESS_DETACH            //0: 从进程地址空间中解除DLL映射
12 
13     DLL_THREAD_ATTACH             //2: 创建线程
14     DLL_THREAD_DETACH             //3: 结束线程
15 }

进程

进程遍历

 

文件

文件遍历

 

管道

 1 //创建命名管道
 2 HANDLE WINAPI CreateNamedPipe(
 3   [in]      LPCTSTR lpName,                               //管道名称:\\.\pipe\pipename
 4   [in]      DWORD dwOpenMode,                             //读写模式:3=双向读写、1=数据从客户端写入服务器、2=数据从服务器写入客户端(同步/异步等)
 5   [in]      DWORD dwPipeMode,                             //数据形式:0=数据以字节流的形式写入管道、4=数据以消息流的形式写入管道
 6   [in]      DWORD nMaxInstances,                          //管道最大实例数
 7   [in]      DWORD nOutBufferSize,                         //输出缓冲区大小
 8   [in]      DWORD nInBufferSize,                          //输入缓冲区大小
 9   [in]      DWORD nDefaultTimeOut,                        //超时(毫秒为单位)
10   [in,opt]  LPSECURITY_ATTRIBUTES lpSecurityAttributes    //指定管道安全描述符的结构体,null=默认描述符
11 );                                                        //成功=管道句柄
12 
13 //允许客户端连接到命名管道,客户端通过调用CreateFile或CallNamedPipe函数进行连接
14 BOOL WINAPI ConnectNamedPipe(
15   [in]         HANDLE hNamedPipe,                         //服务端管道句柄
16   [inout,opt]  LPOVERLAPPED lpOverlapped                  //↓↓↓
17 );
18 
19 //参数2:lpOverlapped
20 如果hNamedPipe是用FILE_FLAG_OVERLAPPED打开的,那么lpoverlapped参数不能为空,它必须指向一个有效的重叠结构。
21 如果hNamedPipe是用FILE_FLAG_OVERLAPPED打开的,并且lpoverlapped为NULL,那么该函数可能会错误地报告连接操作已经完成。
22 如果hNamedPipe是用FILE_FLAG_OVERLAPPED创建的,并且lpoverlapped不为NULL,重叠结构应该包含一个手动重置事件对象的句柄(服务器可以使用CreateEvent函数创建该对象)。
23 如果hNamedPipe不是用FILE_FLAG_OVERLAPPED打开的,则该函数直到连接到客户端或发生错误才会返回。如果客户端连接成功返回一个非零值。
24 
25 //返回值:
26 如果操作是同步的,ConnectNamedPipe直到操作完成才返回,函数成功=非零,失败=0
27 如果操作是异步的,ConnectNamedPipe会立即返回,如果操作仍处于等待状态或失败=0

内存

 1 //申请内存
 2 LPVOID WINAPI VirtualAlloc(
 3   [in,opt]  LPVOID lpAddress,            //要分配的区域的起始地址,NULL=系统自动确定起始地址
 4   [in]      SIZE_T dwSize,               //内存大小(字节)
 5   [in]      DWORD flAllocationType,      //内存类型(保留、提交、更改等)
 6   [in]      DWORD flProtect              //要分配页面区域的内存保护
 7 );                                       //成功=基址,失败=NULL
 8 
 9 //修改内存属性
10 BOOL WINAPI VirtualProtect(
11   [in]   LPVOID lpAddress,               //要修改属性的内存起始地址
12   [in]   SIZE_T dwSize,                  //内存大小(字节)
13   [in]   DWORD flNewProtect,             //属性常量
14   [out]  PDWORD lpflOldProtect           //原属性常量
15 );

服务

 1 //打开服务控制管理器(SCM)
 2 SC_HANDLE WINAPI OpenSCManager(
 3   [in,opt]  LPCTSTR lpMachineName,            //计算机名称(本机==NULL)
 4   [in,opt]  LPCTSTR lpDatabaseName,           //数据库名称(默认数据库==NULL)
 5   [in]      DWORD dwDesiredAccess             //访问权限(SC_MANAGER_ALL_ACCESS==0xF003F等)
 6 );                                            //失败=0,成功=SCM句柄
 7 
 8 //创建服务
 9 SC_HANDLE WINAPI CreateService(
10   [in]       SC_HANDLE hSCManager,            //SCM句柄(OpenSCManager函数返回)
11   [in]       LPCTSTR lpServiceName,           //服务名称
12   [in,opt]   LPCTSTR lpDisplayName,           //显示名称
13   [in]       DWORD dwDesiredAccess,           //访问权限(SC_MANAGER_ALL_ACCESS==0xF003F等)
14   [in]       DWORD dwServiceType,             //服务类型(Exe、Dll等)
15   [in]       DWORD dwStartType,               //启动类型(自动启动、手动启动等)
16   [in]       DWORD dwErrorControl,            //错误处理(服务启动时发生错误后的处理措施:忽略错误或记录错误日志等)
17   [in,opt]   LPCTSTR lpBinaryPathName,        //服务程序的全路径
18   [in,opt]   LPCTSTR lpLoadOrderGroup,        //服务分组(该服务属于哪个组)
19   [out,opt]  LPDWORD lpdwTagId,               //接收服务分组标识符
20   [in,opt]   LPCTSTR lpDependencies,          //服务依赖项名称
21   [in,opt]   LPCTSTR lpServiceStartName,      //用户名称(该服务运行在哪个账户下)
22   [in,opt]   LPCTSTR lpPassword               //用户密码
23 );                                            //失败=0,成功=服务句柄
24 
25 //打开服务
26 SC_HANDLE WINAPI OpenService(
27   [in]  SC_HANDLE hSCManager,                 //SCM句柄(OpenSCManager函数返回)
28   [in]  LPCTSTR lpServiceName,                //服务名称(CreateService函数的lpServiceName参数)
29   [in]  DWORD dwDesiredAccess                 //访问权限(SC_MANAGER_ALL_ACCESS==0xF003F等)
30 );                                            //失败=0,成功=服务句柄
31 
32 //启动服务
33 BOOL WINAPI StartService(
34   [in]      SC_HANDLE hService,               //服务句柄(OpenService或CreateService函数返回)
35   [in]      DWORD dwNumServiceArgs,           //服务Main的参数长度
36   [in,opt]  LPCTSTR *lpServiceArgVectors      //要传递给服务Main的参数
37 );                                            //失败=0,成功!=0
38 
39 //关联服务主线程
40 BOOL WINAPI StartServiceCtrlDispatcher(
41   [in]  const SERVICE_TABLE_ENTRY *lpServiceTable    //SERVICE_TABLE_ENTRY结构数组的指针
42 );                                                   //失败=0,成功!=0
43 
44 typedef struct _SERVICE_TABLE_ENTRYA {
45   LPSTR                    lpServiceName;            //服务名称(SERVICE_WIN32_OWN_PROCESS类型服务可以==NULL)
46   LPSERVICE_MAIN_FUNCTIONA lpServiceProc;            //服务Main函数指针
47 } SERVICE_TABLE_ENTRYA, *LPSERVICE_TABLE_ENTRYA;
48 
49 https://docs.microsoft.com/en-us/windows/win32/api/winsvc/ns-winsvc-service_table_entrya
50 
51 //注册服务控制处理函数
52 SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandler(
53   [in]  LPCTSTR lpServiceName,                       //服务名称
54   [in]  LPHANDLER_FUNCTION lpHandlerProc             //服务控制处理函数
55 );                                                   //失败=0,成功=服务状态句柄
56 
57 //设置服务运行状态
58 BOOL WINAPI SetServiceStatus(
59   [in]  SERVICE_STATUS_HANDLE hServiceStatus,        //服务状态句柄
60   [in]  LPSERVICE_STATUS lpServiceStatus             //包含服务状态信息的结构体
61 );                                                   //败=0,成功!=0

COM

123

定时器

 1 //创建定时器
 2 UINT_PTR SetTimer(
 3   [in] HWND      hWnd,            //与当前定时器关联的窗口句柄,这个窗口必须属于调用线程。
 4   [in] UINT_PTR  nIDEvent,        //定时器标识符:
 5                                   //如果hWnd==NULL,忽略该参数,创建新的定时器。
 6                                   //如果hWnd!=NULL,并且当前标识符的定时器已经存在,替换原定时器。
 7   [in] UINT      uElapse,         //超时时间(毫秒)
 8   [in] TIMERPROC lpTimerFunc      //超时后将要执行的回调函数,如果==NULL,则向程序消息队列发送WM_TIMER消息
 9 );                                //失败=0,成功=定时器标识
10 
11 //销毁定时器
12 BOOL KillTimer(
13   [in] HWND hWnd,                 //与定时器关联的窗口句柄
14   [in] UINT uIDEvent              //定时器标识符
15 );                                //失败=0,成功!=0

剪切板

https://www.cnblogs.com/wind-net/archive/2012/11/01/2749558.html

 1 //打开剪贴板,并阻止其他应用程序修改剪贴板内容
 2 BOOL WINAPI OpenClipboard(
 3   [in,opt]  HWND hWndNewOwner       //要与打开的剪贴板关联的窗口句柄(如果==NULL,则打开的剪贴板与当前任务相关联)
 4 );                                 //成功=True,否则=False
 5 
 6 //确定剪贴板是否包含指定格式的数据
 7 BOOL IsClipboardFormatAvailable(
 8   [in]    UINT format             //要检查的数据类型(1=CF_TEXT,具体看MSDN)
 9 );                                //包含=True,否则=False
10 
11 //以指定格式从剪贴板获取数据
12 HANDLE GetClipboardData(
13   [in]    UINT uFormat            //要获取的数据类型(1=CF_TEXT,具体看MSDN)
14 );                                //成功=返回数据指针,否则=NULL
15 
16 
17 //关闭剪贴板
18 BOOL CloseClipboard(void);        //非零表示成功,零表示失败
19                                   //使用完必须关闭,否则其它进程无法访问剪切板

键盘记录

 1 //安装钩子
 2 HHOOK WINAPI SetWindowsHookEx(
 3   [in]  int idHook,             //钩子类型
 4   [in]  HOOKPROC lpfn,         //回调函数
 5   [in]  HINSTANCE hMod,         //包含回调函数的模块句柄(如果回调函数处理当前进程,设置NULL)
 6   [in]  DWORD dwThreadId        //想要挂钩的线程ID(如果是全局hook,设置0)
 7 );                              //成功=钩子句柄 失败=NULL
 8 
 9 //钩子回调
10 LRESULT CALLBACK LowLevelKeyboardProc(
11   [in]  int nCode,              //消息代码,用来确定如何处理消息(如果nCode<0,必须调用CallNextHookEx将消息传递给下一个回调函数)
12   [in]  WPARAM wParam,          //键盘消息标识符(以下消息之一:WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP)
13   [in]  LPARAM lParam           //KBDLLHOOKSTRUCT 结构体指针
14 );                              //返回值:必须调用CallNextHookEx将消息传递给下一个回调函数
15 
16 //KBDLLHOOKSTRUCT 结构体(包含键盘输入事件的信息)
17 typedef struct tagKBDLLHOOKSTRUCT {
18   DWORD     vkCode;             //一个虚拟按键码,该代码的取值范围必须在1到254之间(具体看MSDN)
19   DWORD     scanCode;           //键的硬件扫描码
20   DWORD     flags;              //扩展键标志、事件注入标志、上下文代码和转换状态标志(具体看MSDN)
21   DWORD     time;               //此消息的时间戳(等于GetMessageTime为此消息返回的时间戳)
22   ULONG_PTR dwExtraInfo;        //与消息关联的附加信息
23 } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT, *LPKBDLLHOOKSTRUCT;
24 
25 //卸载钩子
26 BOOL WINAPI UnhookWindowsHookEx(
27   [in]  HHOOK hhk               //钩子句柄
28 );
29 
30 //获取指定按键状态(按下、弹起)(Caps键:打开或关闭)
31 SHORT WINAPI GetKeyState(
32   [in]  int nVirtKey            //按键码(如果是字母或数字使用ASCII码,其它按键则使用对应虚拟按键码)
33 );                              //返回按键状态
34 
35 //获取指定按键状态(按下、弹起)
36 SHORT WINAPI GetAsyncKeyState(
37   [in]  int vKey                //虚拟按键码
38 );
39 
40 //获取指定按键的字符串名称
41 int WINAPI GetKeyNameText(
42   [in]   LONG lParam,           //钩子回调函数的第二个参数
43   [out]  LPTSTR lpString,       //缓冲区
44   [in]   int cchSize            //缓冲区长度
45 );