API:收录一下调过的API

进程与内存

打开一个已存在的本地进程:OpenProcess

HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);

dwdesiredaccess 指定能获得指定进程哪些权限。可选值如下

PROCESS_ALL_ACCESS  //所有能获得的权限
PROCESS_CREATE_PROCESS //需要创建一个进程
PROCESS_CREATE_THREAD //需要创建一个线程
PROCESS_DUP_HANDLE //重复使用DuplicateHandle句柄
PROCESS_QUERY_INFORMATION //获得进程信息的权限,如它的退出代码、优先级
PROCESS_QUERY_LIMITED_INFORMATION /*获得某些信息的权限,如果获得了PROCESS_QUERY_INFORMATION,也拥有PROCESS_QUERY_LIMITED_INFORMATION权限*/
PROCESS_SET_INFORMATION //设置某些信息的权限,如进程优先级
PROCESS_SET_QUOTA //设置内存限制的权限,使用SetProcessWorkingSetSize
PROCESS_SUSPEND_RESUME //暂停或恢复进程的权限
PROCESS_TERMINATE //终止一个进程的权限,使用TerminateProcess
PROCESS_VM_OPERATION //操作进程内存空间的权限(可用VirtualProtectEx和WriteProcessMemory)
PROCESS_VM_READ //读取进程内存空间的权限,可使用ReadProcessMemory
PROCESS_VM_WRITE //读取进程内存空间的权限,可使用WriteProcessMemory
SYNCHRONIZE //等待进程终止

bInheritHandle 若为TRUE,则表示所得到的进程句柄可被进程
dwProcessId 表示要获取的进程的PID

函数成功执行,则返回指定进程的句柄。反之则NULL。

在指定进程的虚拟地址空间中保留,开辟,禁用一段区域 : VirtualAllocEx

LPVOID VirtualAllocEx(
HANDLE hProcess,
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType,
DWORD flProtect
);

hProcess 指定的进程的句柄。该句柄需有PROCESS_VM_OPERATION权限(操作进程内存空间的权限)

lpAddress 一个指针,用于选择你想分配的内存的开始地址。如果填NULL,则由dwsize的设置来自动分配。

dwSize 欲分配的内存大小(字节单位)。实际分配的大小是该值与页内存对齐后的结果。如果lpAddress为NULL,则会选中从进程首地址到dwSize的页对齐后的内存区域
如果lpAddress不为NULL,则选定lpaddress到lpaddress+dwsize的按照页对齐后的内存区域。

flAllocationType 内存分配的类型。有很多值,MSDN上有记录。
https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualallocex
这个值用来确定一段内存区域用于被置0(commit)还是保留(reserve)还是禁用(reset)

flProtect 内存保护常数

PAGE_NOACCESS
PAGE_GUARD
PAGE_NOCACHE
PAGE_WRITECOMBINE

若函数执行成功,则返回分配的内存地址的基地址。

在指定进程的虚拟地址空间中释放或decommit一段区域 : VirtualFreeEx

BOOL VirtualFreeEx(
HANDLE hProcess,
LPVOID lpAddress,
SIZE_T dwSize,
DWORD dwFreeType
);

hprocess 进程句柄,需有PROCESS_VM_OPERATION权限

lpaddress 一个指向需要被释放或decommit内存区域首地址的指针。若dwfreetype为mem_release(释放),则这里应该填入VirtualAllocEx方法返回的保留的内存区域的基地址。

dwsize 需要被decommit的内存大小。
若dwfreetype为MEM_RELEASE 则此处填0
若为MEM_DECOMMIT,则此处填内存大小。 选定lpaddress到lpaddress+dwsize的按照页对齐后的内存区域。

dwfreetype 需要对内存区域进行的操作。有MEM_DECOMMIT和MEM_RELEASE,更多参数参考MSDNhttps://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualfreeex

若函数执行成功则返回一个非零值,不成功则返回0

向指定进程的内存区域写入: WriteProcessMemory

BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T *lpNumberOfBytesWritten
);

hprocess 进程句柄

lpbaseaddress 需要写入的内存区域的起始地址指针

lpbuffer 指向缓冲区的指针,该缓冲区包含要在指定进程的地址空间中写入的数据。

nsize 需要写入的数据大小(字节单位)

lpNumberOfBytesWritten 可选,用来存放”要被写入的数据“的变量

若成功则返回非0值,反之则0

在一个进程内存空间中创建一个线程:CreateRemoteThread

HANDLE CreateRemoteThread(
HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);

hprocess 进程句柄

lpThreadAttributes 安全描述符

dwStackSize 栈大小,若为0则为默认值

lpStartAddress 要创建的线程的实现函数的首地址

lpParameter 传递给线程函数的参数

dwCreationFlags 线程控制参数

0 The thread runs immediately after creation.
CREATE_SUSPENDED0x00000004 The thread is created in a suspended state, and does not run until the ResumeThread function is called.
STACK_SIZE_PARAM_IS_A_RESERVATION0x00010000 The dwStackSize parameter specifies the initial reserve size of the stack. If this flag is not specified, dwStackSize specifies the commit size.

lpThreadId 线程标识符,如果线程不返回标识符则此项填NULL

关闭一个句柄:CloseHandle

BOOL CloseHandle(
HANDLE hObject
);

hobject 要被关闭的句柄

成功则返回非0值,反之则0

令牌与命名管道

创建命名管道句柄:CreateNamedPipeA

HANDLE CreateNamedPipeA(
LPCSTR lpName,
DWORD dwOpenMode,
DWORD dwPipeMode,
DWORD nMaxInstances,
DWORD nOutBufferSize,
DWORD nInBufferSize,
DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

lpName 唯一的管道名。格式是固定的: \.\pipe*pipename*

dwOpenMode 管道的开启方式。有三种:1.数据在服务器和客户机双向流通 PIPE_ACCESS_DUPLEX。2.数据只能从服务器流向客户机 PIPE_ACCESS_OUTBOUND。3.数据只能从客户机流向服务器 PIPE_ACCESS_INBOUND。具体请参考官方文档。以及一些附加参数,详情参考官方文档 https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createnamedpipea

dwPipeMode 管道通信方式。指定字节流或者消息流通信,指定远程链接的访问方式,指定等待方式,详情参考官方文档

nMaxInstancees 管道的最大实例数

nOutBufferSize&nInBufferSize 为输出&输入缓存区保留的内存字节大小

nDefaultTimeOut 设定超时值。置0则为50ms

lpSecurityAttributes 设置安全描述符

若函数执行成功则返回管道服务器句柄。反之则返回INVALID_HANDLE_VALUE

开启一个命名管道等待链接: ConnectNamedPipe

BOOL ConnectNamedPipe(
HANDLE hNamedPipe,
LPOVERLAPPED lpOverlapped
);

hNamedPipe 指定一个命名管道句柄,该句柄由CreateNamedPipe函数返回

lpOverlapped 一个指向重叠结构的指针,一般为NULL。详情参考官方文档
https://docs.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-connectnamedpipe

一般来说,当由客户机连上时返回true,没有客户机链接或链接丢失返回false

模拟一个命名管道客户端:ImpersonateNamedPipeClient

BOOL ImpersonateNamedPipeClient(
HANDLE hNamedPipe
);

hNamedPipe 即指定的命名管道服务端。

这个函数有个坑点是,服务端才能用这个函数,且必须在服务端读取客户端传来的数据后才能成功,否则就会返回1368错误。

获取当前线程令牌句柄: GetCurrentThreadToken

HANDLE GetCurrentThreadToken();

无参数,直接返回当前线程虚拟句柄

以令牌创建一个进程(1): CreateProcessWithTokenW

BOOL CreateProcessWithTokenW(
HANDLE hToken,
DWORD dwLogonFlags,
LPCWSTR lpApplicationName,
LPWSTR lpCommandLine,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);

有点不懂,链接在这里https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createprocesswithtokenw

hToken 表示用户的令牌 必须有 TOKEN_QUERY, TOKEN_DUPLICATE, and TOKEN_ASSIGN_PRIMARY 权限

dwLogonFlags 登陆选项。LOGON_WITH_PROFILELOGON_NETCREDENTIALS_ONLY

lpApplicationName 要被执行的模块。(比如 C:\Windows\system32\notepad.exe )

lpCommandLine 要被执行的命令。如果为NULL则把 lpApplicationName 当作要执行的命令

dwCreationFlags 控制进程的创建方式。参考MSDN

lpEnvironment 指向新进程环境块的指针。

lpCurrentDirectory 指向进程的“当前目录”路径。若NULL则“当前目录”为调用程序的“当前目录”

lpStartUpInfo 指向 STARTUPINFOSTARTUPINFOEX 结构体

lpProcessInformation 指向 PROCESS_INFORMATION 结果的指针

坑点:调用该函数的进程必须有 SE_IMPERSONATE_NAME 权限,不然会返回ERROR:1314

以令牌创建一个进程(2): CreateProcessAsUserA

BOOL CreateProcessAsUserA(
HANDLE hToken,
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);

大致上与CreateProcessWithTokenW一样。
但是调用这个函数的进程必须有SE_INCREASE_QUOTA_NAME,或者SE_ASSIGNPRIMARYTOKEN_NAME权限,不然会返回ERROR:1314

为已存在的Token创建副本: DuplicateTokenEx

BOOL DuplicateTokenEx(
HANDLE hExistingToken,
DWORD dwDesiredAccess,
LPSECURITY_ATTRIBUTES lpTokenAttributes,
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
TOKEN_TYPE TokenType,
PHANDLE phNewToken
);

hExistingToken 一个指针,指向一个有 TOKEN_DUPLICATE 权的Token

dwDesiredAccess 为新Token设置权限。若置0则表示权限与原Token相同。
下面是权限列表 https://docs.microsoft.com/en-us/windows/win32/secauthz/access-rights-for-access-token-objects

lpTokenAttributes 指向安全描述符的指针。若为NULL,则为默认安全描述符且句柄不能被继承

ImpersonationLevel 从 SECURITY_IMPERSONATION_LEVEL 中选择一个值填入。决定模仿的程度。

TokenType 选择TokenPrimary or TokenImpersonation填入。决定Token是primary token(能被用来执行CreateProcessAsUser)还是impersonation token

phNewToken 指针,指向承载新Token的Handle变量。

文件IO

获得文件句柄:GetMoudleHandleA

HMODULE GetModuleHandleA(
LPCSTR lpModuleName
);

lpModuleName即要获取的文件句柄的文件名,可为exe或dll。
若文件名没有后缀名则默认视为dll文件。
若该项为NULL,则返回当前进程的文件句柄。
存在于Kerner32.dll中
这里介绍一些HMOUDLE是个什么玩意
一般就是一个线性地址,用于记录一个文件句柄的地址。

QQ截图20210217151436

从dll文件句柄中获得函数:GetProcAddress

FARPROC GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
);

hmodule 表示要传入的dll文件句柄。这个句柄可以由 LoadLibrary, LoadLibraryEx, LoadPackagedLibrary, or GetModuleHandle 等方法得到。

lpProcName表示要从dll文件中获得的函数没或者变量名。
若函数执行不成功,则返回NULL,否则返回函数或者变量的地址

QQ截图20210217151441

获得一个已存在文件句柄或者新建文件句柄:CreateFile

HANDLE CreateFileW(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);

lpFileName 文件路径

dwDesiredAccess 对文件的访问控制:读,写。GENERIC_READ, GENERIC_WRITE, or both (GENERIC_READ | GENERIC_WRITE)

dwShareMode 零表示不共享; FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允许对文件进行共享访问

lpSecurityAttributes 安全描述符

dwCreationDisposition 在文件不存在或存在时采取的操作

dwFlagsAndAttributes 设置文件标志位

hTemplateFile 多数情况下为NULL

写文件: ReadFile

BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);

hFile 文件句柄

lpBuffer 要写入的数据缓存区

nNumberOfBytesToWrite 要写入的字节数

lpNumberOfBytesWritten 设置一个变量,用来接收写入的内容

lpOverlapped 通常为NULL

读文件: ReadFile

BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);

和WriteFile差不多,8说了

服务

建立与指定计算机服务控制管理器的联络并打开其数据库: OpenSCManagerA

SC_HANDLE OpenSCManagerA(
LPCSTR lpMachineName,
LPCSTR lpDatabaseName,
DWORD dwDesiredAccess
);

lpMachineName 指定计算机的名字。若为NULL则指向本地服务控制管理器

lpDatabaseName 服务控制管理器的数据库名。一般设为 SERVICES_ACTIVE_DATABASE 。若为NULL则默认打开 SERVICES_ACTIVE_DATABASE

dwDesiredAccess 对服务控制管理器的权限设置。参数清单:https://docs.microsoft.com/en-us/windows/win32/services/service-security-and-access-rights

若执行成功则返回服务管理器数据库的句柄。反之则NULL。

创建一个服务并把它加入到服务管理器数据库: CreateServiceA

SC_HANDLE CreateServiceA(
SC_HANDLE hSCManager,
LPCSTR lpServiceName,
LPCSTR lpDisplayName,
DWORD dwDesiredAccess,
DWORD dwServiceType,
DWORD dwStartType,
DWORD dwErrorControl,
LPCSTR lpBinaryPathName,
LPCSTR lpLoadOrderGroup,
LPDWORD lpdwTagId,
LPCSTR lpDependencies,
LPCSTR lpServiceStartName,
LPCSTR lpPassword
);

hSCManager 服务管理器数据库句柄。可由OpenSCManagerA获得。句柄权限必须有SC_MANAGER_CREATE_SERVICE

lpServiceName 要创建的服务名。

lpDisplayName 用户界面程序 用来标识服务的 显示名称 ,可与lpServiceName一致

dwDesiredAccess 对服务管理器的权限。参数清单在上面

dwServiceType 创建的服务的类型。(直接复制粘贴参数吧

Value Meaning
SERVICE_ADAPTER0x00000004 Reserved.
SERVICE_FILE_SYSTEM_DRIVER0x00000002 File system driver service.
SERVICE_KERNEL_DRIVER0x00000001 Driver service.
SERVICE_RECOGNIZER_DRIVER0x00000008 Reserved.
SERVICE_WIN32_OWN_PROCESS0x00000010 Service that runs in its own process.
SERVICE_WIN32_SHARE_PROCESS0x00000020 Service that shares a process with one or more other services. For more information, see Service Programs.
SERVICE_USER_OWN_PROCESS0x00000050 The service runs in its own process under the logged-on user account.
SERVICE_USER_SHARE_PROCESS0x00000060 The service shares a process with one or more other services that run under the logged-on user account.

If you specify either SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS, and the service is running in the context of the LocalSystem account, you can also specify the following value.

Value Meaning
SERVICE_INTERACTIVE_PROCESS0x00000100 The service can interact with the desktop.For more information, see Interactive Services.

dwStartType 服务的开始选项,参数如下

Value Meaning
SERVICE_AUTO_START0x00000002 A service started automatically by the service control manager during system startup. For more information, see Automatically Starting Services.
SERVICE_BOOT_START0x00000000 A device driver started by the system loader. This value is valid only for driver services.
SERVICE_DEMAND_START0x00000003 A service started by the service control manager when a process calls the StartService function. For more information, see Starting Services on Demand.
SERVICE_DISABLED0x00000004 A service that cannot be started. Attempts to start the service result in the error code ERROR_SERVICE_DISABLED.
SERVICE_SYSTEM_START0x00000001 A device driver started by the IoInitSystem function. This value is valid only for driver services.

dwErrorContriol 服务对于错误的容忍程度。

img

lpBinaryPathName 服务的绝对路径。

lpLoadOrderGroup 服务所属的加载排序组名称。如果服务不属于任何一个组则填NULL或空字符

lpdwTagId 一个指向变量的指针,该变量接收在lpLoadOrderGroup参数中指定的组中唯一的标记值。 一般置NULL

lpDependencies 一个以null结尾的指向服务或者加载顺序组的指针,在当前服务启动前必须先启动该项指向的服务或加载顺序组,即启动当前服务的依赖项。若服务不需要依赖项则置NULL

lpServiceStartName 服务运行的账户。若为NULL则用LocalSystem Account账户(即SYSTEM)

lpPassword 账户的密码。若为LocalSystemAccount则填NULL(SYSTEM账户没有密码)

成功则返回服务句柄,反之则NULL

打开一个服务并获得句柄: OpenServiceA

SC_HANDLE OpenServiceA(
SC_HANDLE hSCManager,
LPCSTR lpServiceName,
DWORD dwDesiredAccess
);

hSCManager 指向服务控制管理器数据库的句柄。

lpServiceName 服务名,注意不是lpDisplayName

dwDesiredAccess 对服务控制管理器的权限

成功则返回服务句柄,反之则NULL

向一个服务发送控制指令:ControlService

BOOL ControlService(
SC_HANDLE hService,
DWORD dwControl,
LPSERVICE_STATUS lpServiceStatus
);

hService 指向服务的句柄

dwControl 控制指令。详情参考 https://docs.microsoft.com/zh-cn/windows/win32/api/winsvc/nf-winsvc-controlservice?f1url=%3FappId%3DDev16IDEF1%26l%3DZH-CN%26k%3Dk(WINSVC%252FControlService);k(ControlService);k(DevLang-C%252B%252B);k(TargetOS-Windows)%26rd%3Dtrue

lpServiceStatus 指向 SERVICE_STATUS 结构的指针,该结构用于接收服务报告给服务管理器的最新状态。

使服务与SCM链接: StartServiceCtrlDispatcherA

BOOL StartServiceCtrlDispatcherA(
const SERVICE_TABLE_ENTRYA *lpServiceStartTable
);

lpServiceStartTable 指向一个 SERVICE_TABLE_ENTRY 结构,其包含了每个服务的入口点。该结构最后一个入口点必须是NULL来表示该结构已结束。
这个结构的定义如下

typedef struct _SERVICE_TABLE_ENTRYW {
LPWSTR lpServiceName;
LPSERVICE_MAIN_FUNCTIONW lpServiceProc;
}SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;

当SCM开始一个服务进程时,便在等待服务调用StartServiceCtrlDispatcherA 函数,若该函数长时间没有调用(一般为30s),则服务会被强行关闭。直到所有该函数指定的服务进入SERVICE_STOPPED阶段,这个函数才会返回值。

注册一个函数来处理服务控制请求: RegisterServiceCtrlHandlerA

SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerA(
LPCSTR lpServiceName,
LPHANDLER_FUNCTION lpHandlerProc
);

lpServiceName 服务的名字。

lpHandlerProc 一个指针,指向要被注册的handler函数

若成功,则返回服务状态句柄,若失败则返回0

这个函数的主要目的是 可以让一个服务在运行过程中被来自其他地方的控制指令所控制,并根据自己定义的函数做出对应的行为

更新服务的状态信息: SetServiceStatus

BOOL SetServiceStatus(
SERVICE_STATUS_HANDLE hServiceStatus,
LPSERVICE_STATUS lpServiceStatus
);

hServiceStatus 指向服务状态句柄,这个句柄由RegisterServiceCtrlHandlerA 等函数返回

lpServiceStatus 一个指针,指向 SERVICE_STATUS 结构,这个结构记录了服务的状态

快照 以下函数或结构基本上都用到了另一个头文件Tlhelp32.h

为进程创建快照文件(转储): CreateToolhelp32Snapshot

HANDLE CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);

dwFlags 转储参数,用于指定转储哪些信息以及指定返回的句柄的一些信息
详细参数
https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot

th32ProcessID 要被转储的进程的PID。置0则指定当前进程,当dwFlags为TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE, TH32CS_SNAPMODULE32, or TH32CS_SNAPALL时,该值才表示要被转储的进程PID,否则该值会被忽略并转储所有进程

函数成功返回快照的句柄,否则返回INVALID_HANDLE_VALUE

检索快照中遇到的第一个进程的信息: Process32First

BOOL Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);

hSnapshot 快照句柄,由CreateToolhelp32napshot返回

lppe 指向PROCESSENTRY32结构。该结构用于保存进程信息,在进行该函数前,PROCESSENTRY32的dwSize属性必须定义好。

检索快照中下一个进程的信息: Process32Next

BOOL Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);

hSnapshot 快照句柄,由CreateToolhelp32napshot返回

lppe 指向PROCESSENTRY32结构。该结构用于保存进程信息,在进行该函数前,PROCESSENTRY32的dwSize属性必须定义好。

将某个进程转储为快照写入文件: MiniDumpWriteDump

头文件 DbgHelp.h

BOOL MiniDumpWriteDump(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);

hProcess 进程句柄

processid 进程的PID

hFile 文件句柄,指定写入那个文件

DumpType 指定以何种形式写入文件,参数参考:https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/ne-minidumpapiset-minidump_type

ExceptionParam 指针,指向 MINIDUMP_EXCEPTION_INFORMATION 结构用于描述发生的异常。如果为NULL,则表示转储文件中不包含异常信息

UserStreamParam 指针,指向 MINIDUMP_USER_STREAM_INFORMATION 结构,这个结构保存用户数据流信息。一般置NULL

CallbackParam 指针,指向 MINIDUMP_CALLBACK_INFORMATION 结构,该结构保存回调函数的信息,一般置NULL

HTTP请求,多数函数包含在winhttp.h中

大流程

functions that create handles

winhttpopen:返回 WinHTTP-session 句柄

WINHTTPAPI HINTERNET WinHttpOpen(
LPCWSTR pszAgentW,
DWORD dwAccessType,
LPCWSTR pszProxyW,
LPCWSTR pszProxyBypassW,
DWORD dwFlags
);

pszAgentW 指针,指向一个字符串.该字符串在http通信中被用作user agent

dwAccessType http请求方式,其值有如下,主要是代理相关

WINHTTP_ACCESS_TYPE_DEFAULT_PROXY
WINHTTP_ACCESS_TYPE_NAMED_PROXY
WINHTTP_ACCESS_TYPE_AUTOMATIC_PROXY
WINHTTP_ACCESS_TYPE_NO_PROXY 不使用代理进行通讯

pszProxyW 指针,当dwAccessType为 WINHTTP_ACCESS_TYPE_NAMED_PROXY 时指向代理服务器名字。否则取WINHTTP_NO_PROXY_NAME

pszProxyBypassW 指针,指向字符串, 当dwAccessType为 WINHTTP_ACCESS_TYPE_NAMED_PROXY 时指向不想走代理的IP地址或主机名。否则取WINHTTP_NO_PROXY_BYPASS

dwFlags 一般取0

WinHttpConnect :返回 链接 句柄( handle to an HTTP session for that initial target. )

WINHTTPAPI HINTERNET WinHttpConnect(
HINTERNET hSession,
LPCWSTR pswzServerName,
INTERNET_PORT nServerPort,
DWORD dwReserved
);

hSession WinHttpOpen 方法返回的句柄

pswzServerName 指针,指向需要请求的服务器的IP或主机名的字符串

nServerPort 指定请求端口

dwReserved 置0

WinHttpOpenRequest :创建HTTP请求句柄

WINHTTPAPI HINTERNET WinHttpOpenRequest(
HINTERNET hConnect,
LPCWSTR pwszVerb,
LPCWSTR pwszObjectName,
LPCWSTR pwszVersion,
LPCWSTR pwszReferrer,
LPCWSTR *ppwszAcceptTypes,
DWORD dwFlags
);

hConnect WinHttpConnect返回的句柄

pwszVerb 指定HTTP请求方法

pwszObjectName 指定请求资源的路径

pwszVersion 指定HTTP版本

pwszReferrer 多数情况可设置为WINHTTP_NO_REFERER

ppwszAcceptTypes 指定媒体类型,可设置为WINHTTP_DEFAULT_ACCEPT_TYPES

dwFlags 通常置0

WinHttpAddRequestHeaders 设置HTTP头

BOOLAPI WinHttpAddRequestHeaders(
HINTERNET hRequest,
LPCWSTR lpszHeaders,
DWORD dwHeadersLength,
DWORD dwModifiers
);

hRequest WinHttpOpenRequest返回的句柄

lpszHeaders 指向字符串的指针,字符串里包含了要附加到http请求上的头部信息。每个头部之间用 CR/LF 隔开

dwHeadersLength 头部的长度

dwModifiers 一些功能修饰,一般可以置 WINHTTP_ADDREQ_FLAG_ADD

WinHttpSendRequest 发送HTTP请求

BOOLAPI WinHttpSendRequest(
HINTERNET hRequest,
LPCWSTR lpszHeaders,
DWORD dwHeadersLength,
LPVOID lpOptional,
DWORD dwOptionalLength,
DWORD dwTotalLength,
DWORD_PTR dwContext
);

hRequest WinHttpOpenRequest返回的句柄

lpszHeaders 附加的HTTP头,如果没有想附加的头就置0

dwHeadersLength lpszHeaders 指定的头的字符串大小

lpOptional 一个指针。指向一个缓冲区,当中包括可选的数据发送后,马上请求标头。该參数通经常使用于POST和PUT操作。 (我理解为传的参数)

dwOptionalLength 额外内容的长度

dwTotalLength 总长度

dwContext 通常置0

WinHttpReceiveResponse :等待http回应

WINHTTPAPI BOOL WinHttpReceiveResponse(
HINTERNET hRequest,
LPVOID lpReserved
);

hRequest WinHttpOpenRequest 返回的句柄

lpReserved 置NULL

主要作用是如果有回应,则会返回true。

WinHttpQueryDataAvailable :返回HTTP回应内容的大致信息

BOOLAPI WinHttpQueryDataAvailable(
HINTERNET hRequest,
LPDWORD lpdwNumberOfBytesAvailable
);

lpdwNumberOfBytesAvailable 置NULL,其用来接收内容长度

WinHttpReadData 读取HTTP回应内容

BOOLAPI WinHttpReadData(
HINTERNET hRequest,
LPVOID lpBuffer,
DWORD dwNumberOfBytesToRead,
LPDWORD lpdwNumberOfBytesRead
);

lpBuffer 指定一片缓冲区,回应的数据会存放到此处

dwNumberOfBytesToRead 缓冲区大小长度

lpdwNumberOfBytesRead 用于存储回应的字节数,在使用该函数时该值须为NULL

说白了,就是以C或c++等语言为载体,调用各种Windows API完成编程
学这个的目的是因为要接触免杀,需要更深层次的了解Windows的一些机制。