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。调试 ...
WindowsAPI编程核心技术-基础扫盲
WindowsAPI编程核心技术-基础扫盲预备知识常见参数说明符前缀:
123456789101112b BOOL 布尔值g_ Global 全局的h Handle 句柄hwnd HWND类型i Integer 整数l Long 长整数lp Long-pointer 长指针n Short-int 短整型p Pointer 指针sz Zero-terminated-String 以0结尾的字符串u Unsigned-int 无符号整数w WORD 无符号短整数
常用参数类型:
1234567891011HWND 窗口句柄HINSTANCE 实例句柄HANDLE 句柄INT_PTR 约等于intLPARAM 不好说,一般传地址LPSTR 字符串指针LPTSTR 定义了_T宏的同上LPCTSTR 常量,同上UINT 32位无符号整型VOID 等于voidWPARAM 不好说,一般传各种参数
常用宏定义:
1234WINAPI/APIENTRY/CALLBACK __stdcall_In_ 输入参数,不会改变其值_In_opt_ 可选的输入参数,不会改变其值_Out_ 不关心本身内容,写入 ...
高级加密在逆向中初探
高级加密在逆向中初探笔记get_s_box_aes.c
12345678910111213141516171819202122232425262728293031323334353637383940#include <stdio.h> int main(){ unsigned char sbox[256] = { 0xE3, 0xFD, 0xF5, 0x30, 0x50, 0xBD, 0x51, 0x70, 0x3D, 0x40, 0x16, 0x04, 0x4D, 0xB5, 0xC0, 0xA2,0x6D, 0xE2, 0x56, 0xC4, 0xA9, 0x54, 0x7F, 0x27, 0x66, 0x82, 0xD6, 0x68, 0xFB, 0x57, 0xCA, 0xC3,0x6F, 0xA4, 0xF0, 0xD5, 0x2A, 0xE8, 0xC1, 0x0A, 0x5E, 0x19, 0x79, 0x4B, 0x69, 0x45, 0xF1, 0xA7,0x87, 0x00, 0xD8, 0xDC, 0x ...