用过的WINDOWS_API记录
目录
- API:收录一下调过的API
- 进程与内存
- 令牌与命名管道
- 文件IO
- 服务
- 快照 以下函数或结构基本上都用到了另一个头文件Tlhelp32.h
- HTTP请求,多数函数包含在winhttp.h中
- winhttpopen:返回 WinHTTP-session 句柄
- WinHttpConnect :返回 链接 句柄( handle to an HTTP session for that initial target. )
- WinHttpOpenRequest :创建HTTP请求句柄
- WinHttpAddRequestHeaders 设置HTTP头
- WinHttpSendRequest 发送HTTP请求
- WinHttpReceiveResponse :等待http回应
- WinHttpQueryDataAvailable :返回HTTP回应内容的大致信息
- WinHttpReadData 读取HTTP回应内容
- COM相关
- 一些数据类型
title: 记录一下用过的c++ windows api date: tags: windows相关
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
RtlSecureZeroMemory :以安全方式用0填充内存
PVOID RtlSecureZeroMemory(
PVOID ptr,
SIZE_T cnt
);
ptr 指向内存的指针
cnt 填充的字节数
令牌与命名管道
创建命名管道句柄: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_PROFILE或LOGON_NETCREDENTIALS_ONLY
lpApplicationName 要被执行的模块。(比如 C:\Windows\system32\notepad.exe )
lpCommandLine 要被执行的命令。如果为NULL则把 lpApplicationName 当作要执行的命令
dwCreationFlags 控制进程的创建方式。参考MSDN
lpEnvironment 指向新进程环境块的指针。
lpCurrentDirectory 指向进程的“当前目录”路径。若NULL则“当前目录”为调用程序的“当前目录”
lpStartUpInfo 指向 STARTUPINFO或STARTUPINFOEX 结构体
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是个什么玩意 一般就是一个线性地址,用于记录一个文件句柄的地址。
从dll文件句柄中获得函数:GetProcAddress
FARPROC GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
);
hmodule 表示要传入的dll文件句柄。这个句柄可以由 LoadLibrary, LoadLibraryEx, LoadPackagedLibrary, or GetModuleHandle 等方法得到。
lpProcName表示要从dll文件中获得的函数没或者变量名。 若函数执行不成功,则返回NULL,否则返回函数或者变量的地址
获得一个已存在文件句柄或者新建文件句柄: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 codeERROR_SERVICE_DISABLED. |
SERVICE_SYSTEM_START0x00000001 | A device driver started by theIoInitSystem function. This value is valid only for driver services. |
dwErrorContriol 服务对于错误的容忍程度。
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 指向服务的句柄
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中
大流程
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的一些机制。
COM相关
CoInitializeEx :创建COM环境
HRESULT CoInitializeEx(
LPVOID pvReserved,
DWORD dwCoInit
);
pvReserved 必须填NULL
dwCoInit 初始化选项:
COINIT_APARTMENTTHREADED | Initializes the thread for apartment-threaded object concurrency (see Remarks).(启动单线程对象) |
---|---|
COINIT_MULTITHREADED | Initializes the thread for multithreaded object concurrency (see Remarks).(启动多线程对象) |
COINIT_DISABLE_OLE1DDE | Disables DDE for OLE1 support. |
COINIT_SPEED_OVER_MEMORY | Increase memory usage in an attempt to increase performance. |
一些数据类型
NTSTATUS
NTSTATUS是用于系统提供的状态码值的标准32位数据类型。
STATUS_SEVERITY_SUCCESS0x0 | Success |
---|---|
STATUS_SEVERITY_INFORMATIONAL0x1 | Informational |
STATUS_SEVERITY_WARNING0x2 | Warning |
STATUS_SEVERITY_ERROR0x3 | Error |
HRESULT
用于描述错误或警告的32位值。