WindowsAPI编程核心技术-传输技术
WindowsAPI编程核心技术-传输技术TCPSocket分配个套接字。
12345678SOCKET WAAPI Socket( _In_ int af, //指定地址族规范 _In_ int type, //套接字类型 _In_ int protocol //协议)//成功返回引用新套接字的描述符 否则返回INVALID_SOCKET并通过WSAGetLastError来获取错误代码
bind本地地址与套接字绑定。
12345678int bind( _In_ SOCKET s, //标识未绑定套接字的描述符 _In_ const struct sockaddr* name, //sockaddr结构分配给绑定的套接字 _In_ int namelen //值的长度)//成功返回0 否则SOCKET_ERROR
htons将整数变量从主机字节序转为网络字节序。
1234u_short WSAAPI htons( _In_ u_short hostshort //主机字节序)//网络字节序
i ...
WindowsAPI编程核心技术-加密技术
WindowsAPI编程核心技术-加密技术CryptoAPI入门CryptAcquireContext获取特定CSP内特定密钥容器句柄。
123456789101112BOOL WINAPI CryptAcquireContext( _Out_ HCRYPTPROV *phProv, //CSP句柄指针 _In_ LPCTSTR pszContainer, //密钥容器名称 _In_ LPCTSTR pszProvider, //CSP名称 _In_ DWORD dwProvType, //获取提供程序的类型 _In_ DWORD dwFlags //标志)//成功TRUE 失败FALSE
dwProvType可以是:
CSP类型
密钥交换算法
签名算法
对称加密算法
Hash算法
PROV_RSA_FULL
RSA
RSA
RC2、RC4
MD5、SHA
PROV_RSA_SIG
RSA
MD5、SHA
PROV_RSA_SCHANNEL
RSA
RSA
RC4、DES、3DES
MD5、SHA
...
WindowsAPI编程核心技术-压缩技术
WindowsAPI编程核心技术-压缩技术数据压缩APIRtlGetCompressionWorkSpaceSize确定压缩和解压缩工作空间缓冲区的正确大小,单位字节。
12345678NTSTATUS RtlGetCompressionWorkSpaceSize( _In_ USHORT CompressionFormatAndEngine, //压缩格式和引擎类型 _Out_ PULONG CompressBufferWorkSpaceSize, //接收接收缓冲区所需大小 _Out_ PULONG CompressFragmentWorkSpaceSize //接收解压缓冲区为片段所需大小)//成功返回STATUS_SUCCESS 否则失败
RtlCompressBuffer压缩缓冲区。
123456789101112131415161718NTSTATUS RtlCompressBuffer( _In_ USHORT CompressionFormatAndEngine, //压缩格式和引擎类型 有枚举值自己去查 _In_ ...
WindowsAPI编程核心技术-隐藏技术
WindowsAPI编程核心技术-隐藏技术进程伪装NtQueryInformationProcess123456789101112NTSTATUS WINAPI NtQueryInformationProcess( _In_ HANDLE ProcessHandle, //要获取信息的进程句柄 _In_ PROCESSINFOCLASS ProcessInformationClass, //要获取的进程信息的类型 _Out_ PVOID ProcessInformation, //请求的信息 _In_ ULONG ProcessInformationLength, //缓冲区大小 _Out_opt_ PULONG ReturnLength //所请求信息的大小)//返回NTSTATUS成功或错误代码
PROCESS_BASIC_INFORMATION1234567typedef struct _PROCESS_BASIC_INFORMATION{ PVOID Reserved1; PPEB PebBas ...
WindowsAPI编程核心技术-提权技术
WindowsAPI编程核心技术-提权技术进程访问令牌权限提升‘OpenProcessToken打开与进程关联的访问令牌。
12345678BOOL WINAPI OpenProcessToken( _In_ HANDLE ProcessHandle, //打开访问令牌的进程句柄 _In_ DWORD DesiredAccess, //指定一个访问掩码 并指定访问令牌的请求类型 _Out_ PHANDLE TokenHandle //新打开的访问令牌句柄)//成功非0 失败0
LookupPrivilegeValue查看系统权限特权值并返回信息到一个LUID结构体中。
12345678BOOL WINAPI LookupPrivilegeValue( _In_opt_ LPCTSTR lpSystemName, //要获取特权值的系统名称 _In_ LPCTSTR lpName, //指定特权名称 在Winnt.h中定义 可以是枚举值常量 也可以是字符串 _Out_ PLUID lpLuid //接收指定系统中已 ...
WindowsAPI编程核心技术-自启动技术
WindowsAPI编程核心技术-自启动技术注册表RegOpenKeyEx打开注册表键。
123456789101112LONG WINAPI RegOpenKeyEx( _In_ HKEY hKey, //这些键:HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOVAL_MACHINE HKEY_USERS HEY_CURRENT_CONFIG _In_opt_ LPCTSTR lpSubKey, //要打开键的名称 NULL则打开新的句柄由hKey决定 _In_ DWORD ulOptions, //保留 必须0 _In_ REGSAM samDesired, //希望得到的访问权限 自己去查 _Out_ PHKEY phkResult //打开注册表键的句柄)//成功返回ERROR_SUCCESS=0 否则返回WINERROR.h中非零值
RegSetValueEx设置指定值的数据或类型。
12345678910111213LONG WINAPI RegSetValueEx( ...
WindowsAPI编程核心技术-启动技术
WindowsAPI编程核心技术-启动技术创建进程WinExec运行指定的应用程序。
123456UINT WINAPI WinExec( _In_ LPCTSTR lpCmdLine, //要执行的应用程序命令行 _In_ UINT uCmdShow //显示选项 SW_HIDE隐藏窗口 SW_SHOWNORMAL激活)//成功返回值大于31 失败返回0系统内存资源不足、ERROR_BAD_FORMAT文件无效 ERROR_FILE_NOT_FOUND找不到指定文件 ERROR_PATH_NOT_FOUND找不到指定路径
ShellExecute运行一个外部程序或打开一个已注册的文件/目录或打印一个文件。
1234567891011121314HINSTANCE ShellExecute( _In_opt_ HWND hwnd, //父窗口句柄 _In_opt_ LPCTSTR lpOperation, //要执行的操作,sz类型,有edit explore find open print _In_ LPCTSTR l ...
WindowsAPI编程核心技术-注入技术
WindowsAPI编程核心技术-注入技术全局钩子注入全局钩子作用于整个系统的基于消息的应用,需要使用DLL文件。
SetWindowsHookEx将程序定义的钩子函数安装到挂钩链中。
12345678910HHOOK WINAPI SetWindowsHookEx( _In_ int idHook, //钩子程序的类型 具体可选参数自己查 _In_ HOOKPROC lpfn, //指向钩子程序的指针,当dwThreadId为0或指定由不同进程创建线程标识符,则lpfn必须指向DLL中钩子过程 否则可指向与当前进程关联的代码中的钩子过程 _In_ HINSTANCE hMod, //lpfn指向的钩子过程的DLL句柄 当dwThreadId指定由当前进程创建线程且钩子过程位于与当前进程关联的代码中时hMod必须为NULL _In_ DWORD dwThreadId //与钩子程序关联的线程标识符 为0时钩子过程与系统中所有线程相关联)//成功返回钩子过程的句柄 失败返回NULL
例子为了使DLL注入到所有进程中,需要设置WH_GETM ...
Windows内存攻击概览
Windows内存攻击概览栈溢出例如普通栈溢出:
1234567891011121314151617181920212223int __cdecl verify_password(char* Str1) { char Destination[8]; // [esp+4Ch] [ebp-Ch] BYREF int v3; // [esp+54h] [ebp-4h] v3 = strcmp(Str1, "1234567"); strcpy(Destination, Str1); return v3;};int __cdecl main(int argc, const char** argv, const char** envp) { FILE* Stream; // [esp+4Ch] [ebp-408h] char Str1[1024]; // [esp+50h] [ebp-404h] BYREF int v6; // [esp+450h] [ebp-4h] v6 = 0; Stream = fopen(&q ...
Windows堆溢出浅讲
Windows堆溢出浅讲堆表堆表分为空表free和快表lookaside组成。
空表free数组共有$128$项,每一项是个双向列表的下一项地址。free[1]链接了所有大小为$8$字节的堆块,free[2]链接大小为$16$字节的,以此类推到free[127]链接大小为$1016$字节的堆块。free[0]从小到大链接剩余的大于$1016$字节大小的堆块。
快表这玩意儿跟空表差不多,但每一项最多链接$4$个堆块,且都被设置为占用态,不能被合并。
堆块分配快表分配时必须精确分配。普通空表最优大小查找失败时会查找次优堆块。零号空表free[0]从大到小倒着找合适大小。
堆块合并小块大小小于$1\mathrm{KB}$,大块大小在$[1,512)\mathrm{KB}$之间,巨块在$512\mathrm{KB}$及以上。
小块分配:快表、普通空表、堆缓存、零号空表、内存紧缩、NULL
小块释放:快表、空表
大块分配:堆缓存、零号空表
大块释放:堆缓存、零号空表
巨快分配:虚分配
巨快释放:直接释放
堆结构这里使用HeapCreate创建堆,创建堆底层都为RtlAllocateHeap。调试 ...