【逆向】病毒木马常用API函数功能参数详解
算法
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, //密钥容器名称,用于标识CSP的密钥容器 5 [in]LPCTSTR pszProvider, //指向CSP名称的字符串指针,如果为NULL,则使用默认的CSP 6 [in]DWORD dwProvType, //CSP类型,用于标识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, //密钥缓冲区(由CryptExportKey函数返回) 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 // 导出加密密钥到csp 64 BOOL CryptExportKey( 65 [in] HCRYPTKEY hKey, //要导出的密钥句柄 66 [in] HCRYPTKEY hExpKey, //目标用户的密钥句柄,通常为NULL 67 [in] DWORD dwBlobType, //指定要导出的密钥类型(公钥、私钥等) 68 [in] DWORD dwFlags, //附加选项,通常为NULL 69 [out] BYTE *pbData, //接收导出数据的缓冲区,如果为NULL则在pdwDataLen参数中返回需要的长度 70 [in,out] DWORD *pdwDataLen //缓冲区长度 71 ); 72 73 // 导入公钥Key 74 BOOL WINAPI CryptImportPublicKeyInfo( 75 [in] HCRYPTPROV hCryptProv, //CSP句柄 76 [in] DWORD dwCertEncodingType, //指定使用的编码类型 77 [in] PCERT_PUBLIC_KEY_INFO pInfo, //CERT_PUBLIC_KEY_INFO结构的地址,其中包含要导入的公钥和算法 78 [out] HCRYPTKEY *phKey //用于接收导入公钥的句柄 79 ); 80 81 // 设置密钥参数 82 BOOL WINAPI CryptSetKeyParam( 83 [in]HCRYPTKEY hKey, //要设置参数的密钥句柄 84 [in]DWORD dwParam, //参数类型(例如设置AES_CBC加密算法中的向量IV) 85 [in]BYTE* pbData, //参数缓冲区的指针(如果参数类型是向量IV,该缓冲区保存的就是IV值) 86 [in]DWORD dwFlags //保留,必须为零 87 ); //成功=1,失败=0 88 89 // 获取密钥参数 90 BOOL CRYPTFUNC CryptGetKeyParam( 91 [in]HCRYPTKEY hKey, //要查询的密钥句柄 92 [in]DWORD dwParam, //参数类型 93 [out]BYTE* pbData, //参数缓冲区的指针 94 [in,out]DWORD* pdwDataLen, //长度 95 [in]DWORD dwFlags //保留,必须为零 96 ); //成功=1,失败=0 97 98 // 加密数据 99 BOOL WINAPI CryptEncrypt( 100 [in] HCRYPTKEY hKey, //【重要】加密密钥句柄,密钥指定了使用的加密算法(由CryptGenKey或CryptImportKey函数返回) 101 [in] HCRYPTHASH hHash, //哈希对象句柄(如果要同时对数据进行散列和加密,可以使用该参数,否则NULL) 102 [in] BOOL Final, //指定这是否是正在被加密数据的最后一节。如果是最后一部分或唯一的一部分,这个值为真; 103 [in] DWORD dwFlags, //保留 104 [in,out] BYTE *pbData, //明文数据缓冲区,加密后保存密文 105 [in,out] DWORD *pdwDataLen, //pbData缓冲区中明文的长度 106 [in] DWORD dwBufLen //pbData缓冲区的总大小(以字节为单位)(根据算法不同,加密文本可能比原始明文大) 107 ); 108 109 // 解密数据 110 BOOL CRYPTFUNC CryptDecrypt( 111 [in]HCRYPTKEY hKey, //【重要】解密密钥句柄,该密钥指定了要使用的解密算法(由CryptGenKey或CryptImportKey函数返回) 112 [in]HCRYPTHASH hHash, //哈希对象句柄,如果不需要散列设置为零 113 [in]BOOL Final, //指定这是否是正在被解密数据的最后一节。如果是最后一部分或唯一的一部分,这个值为真; 114 [in]DWORD dwFlags, //保留,必须为零 115 [in,out]BYTE* pbData, //加密数据缓冲区,解密后保存明文 116 [in,out]DWORD* pdwDataLen //缓冲区长度 117 ); //成功=1,失败=0 118 119 // 解码由lpszStructType参数指定的类型数据 120 BOOL CryptDecodeObjectEx( 121 [in] DWORD dwCertEncodingType, //使用的编码类型(不重要) 122 [in] LPCSTR lpszStructType, //【重要】结构体类型常量标识(标识pbEncoded是什么类型的结构体) 123 [in] const BYTE *pbEncoded, //指向要解码的数据指针(该结构必须是lpszStructType指定的类型) 124 [in] DWORD cbEncoded, //pbEncoded数据长度 125 [in] DWORD dwFlags, //可选标识 126 [in] PCRYPT_DECODE_PARA pDecodePara, //指向包含解码段落信息的CRYPT_DECODE_PARA结构的指针。 127 [out] void *pvStructInfo, //接收解码后数据的缓冲区指针 128 [in,out] DWORD *pcbStructInfo //pvStructInfo缓冲区长度 129 ); 130 131 // 将字符串转换成指定标识的字节数组 132 BOOL WINAPI CryptStringToBinary( 133 [in] LPCTSTR pszString, //要转换字符串的指针 134 [in] DWORD cchString, //要转换字符串的长度,不包括终止NULL字符。如果此参数为零,则pszString是以null结尾的字符串。 135 [in] DWORD dwFlags, //转换标识(ASCII、十六进制、Base64等) 136 [in] BYTE *pbBinary, //接收转换后数据的缓冲区指针(如果为NULL则自动计算pcbBinary长度) 137 [in,out] DWORD *pcbBinary, //pbBinary参数长度(以字节为单位,如果为0则忽略pbBinary参数) 138 [out] DWORD *pdwSkip, //可选参数 139 [out] DWORD *pdwFlags //可选参数 140 ); //成功=TRUE,失败=FALSE
网络
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 ); 16 17 // 堆创建 18 HANDLE HeapCreate( 19 [in]DWORD flOptions, //新堆的可选属性(关于读写权限) 20 [in]DWORD dwInitialSize, //堆的初始大小,以字节为单位 21 [in]DWORD dwMaximumSize //指定堆的最大大小,以字节为单位 22 ); //成功=堆句柄,失败=NULL 23 24 // 获取调用进程的堆句柄 25 HANDLE GetProcessHeap( 26 [in]VOID //NULL 27 ); //成功=堆句柄,失败=NULL 28 29 // 从堆中分配内存 30 LPVOID HeapAlloc( 31 [in]HANDLE hHeap, //由HeapCreate或GetProcessHeap函数返回的堆句柄 32 [in]DWORD dwFlags, //堆分配选项(会覆盖HeapCreate函数设置的属性) 33 [in]DWORD dwBytes //要分配的字节数 34 ); //成功=内存句柄,失败=NULL 35 36 // 从堆中重新分配内存 37 LPVOID HeapReAlloc( 38 [in]HANDLE hHeap, //由HeapCreate或GetProcessHeap函数返回的堆句柄 39 [in]DWORD dwFlags, //堆分配选项(会覆盖HeapCreate函数设置的属性) 40 [in]LPVOID lpMem, //要重新分配的内存块指针(由HeapAlloc或HeapReAlloc函数调用) 41 [in]DWORD dwBytes //新内存块的大小 42 ); //成功=内存句柄,失败=NULL 43 44 // 释放堆内存 45 BOOL HeapFree( 46 [in]HANDLE hHeap, //由HeapCreate或GetProcessHeap函数返回的堆句柄 47 [in]DWORD dwFlags, //释放标识 48 [in]LPVOID lpMem //要释放的内存块指针 49 ); //成功=TRUE,失败=FALSE
服务
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 ); //最高位=1,表示vKey键被按下 最低位=1,表示在上次调用该API以来,vKey键被按下 39 //如果此时另一个进程或线程中的窗口拥有键盘焦点,则返回值为零。 40 //按键码说明: 41 //https://www.cnblogs.com/xiangyuliu/p/5868636.html 42 //https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes 43 44 //获取指定按键的字符串名称 45 int WINAPI GetKeyNameText( 46 [in] LONG lParam, //钩子回调函数的第二个参数 47 [out] LPTSTR lpString, //缓冲区 48 [in] int cchSize //缓冲区长度 49 );