WindowsAPI编程核心技术-栈和函数调用
WindowsAPI编程核心技术-栈和函数调用什么是栈每个普通用户进程都有俩栈,一个为内核态栈记录在_KTHREAD结构中,另一个为用户态栈记录在_TEB结构中。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751 ...
Windows软件调试初探-验证机制
Windows软件调试初探-验证机制碎碎念驱动程序验证器主体在内核中,名字包含Verifier字样或以Vi/Vf开头。
还有应用程序验证器,一部分为NTDLL.DLL中函数,都以AVrf开头。
若一个驱动程序项取得Windows徽标和数字签名,一定要通过驱动验证器的验证,后者是WHQL测试的一部分内容。
蓝屏终止BSOD两个DDI用于蓝屏错误:
12345678910VOID KeBugCheck( _In_ ULONG BugCheckCode //停止码);VOID KeBugCheckEx( _In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4);
上面这俩函数的实现都在nt!KeBugCheck2中,加上这个一共仨函数统称为BugCheck函数,工作过程如下:
将全局变量nt!KeBugCheck ...
Windows软件调试初探-中断和异常管理
Windows软件调试初探-中断和异常管理中断描述符表保护模式下有中断或异常发生时,CPU通过中断描述符表IDT寻找处理函数。
启动时0号处理器称为BSP,其他的称为AP。
在BSP中,IDT最初建立和初始化工作在Windows加载程序WinLoad在实模式下完成。准备好一个内存块后加载程序执行CLI指令关闭中断处理,用LIDT指令将IDT位置和长度信息加载到CPU,加载程序将CPU从实模式切换到保护模式,将执行权移交给NT内核入口函数KiSystemStartup。接下来,啮合处理器初始化函数通过SIDT指令取得IDT信息,对其调整后作为参数传给KiInitializePcr,后者将其记录到PCR和PRCB中。
对于每个AP,KeStartAllProcessors为其建立一个单独的处理器状态区,包括其IDT,再用KiInitProcessor,后者根据启动CPU的IDT为要初始化的AP复制一份。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515 ...
C++源码免杀入门
C++源码免杀入门准备创建俩VS控制台工程,一个为Shellcode一个为ShellcodeLoader,两边运行库都改为多线程调试/MTd,关掉Spectre缓解,符合模式改为否。
用MSFVenom搞个Shellcode,功能是弹计算器,C语言格式:
1msfvenom -p windows/exec cmd=calc.exe -f c
当然这样生成的C代码很别扭,选中其中十六进制及引号部分,在010Editor中粘贴自十六进制,再拷贝自C代码。
注意这个是x86下的Shellcode,下面Loader要用x86写。
异或与逆转123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <iostream>#include <Windows.h>#include <tchar.h>using namespace std;#define SHELLCODE_LENGTH 193#define S ...
CobaltStrike4.8初探
CobaltStrike4.8初探安装Server端得在Linux下跑,Client端Linux或Windows无所谓。Linux下运行teamserver如下,其中服务端IP可用ifconfig查看,这里设root为用户密码。
1234567891011121314151617181920212223242526┌──(kali㉿kali)-[~/CS-Server]└─$ sudo ./teamserver 192.168.17.129 root[sudo] password for kali: [*] Will use existing X509 certificate and keystore (for SSL)[*] Starting teamserver[*] Team Server Version: 4.8 (Pwn3rs)[*] Setting 'https.protocols' system property: SSLv3,SSLv2Hello,TLSv1,TLSv1.1,TLSv1.2,TLSv1.3[*] Loading keystrokes. ...
Windows软件调试初探-用户态调试过程
Windows软件调试初探-用户态调试过程调试器进程本节调试器指的是用户态调试器。
调试器有俩线程,一个线程负责与用户对话,称为UI线程;另一个线程负责与被调试进程对话,称为调试器工作线程DWT或调试会话线程。WinDBG Classic的俩线程栈回溯为:
1234567891011121314UI线程:ntdll!KiFastSystemCallRet //内核模式执行系统服务 USER32!NtUserWaitMessage //调用等待窗口消息的子系统服务windbg!_wmainCRTStartup //程序启动函数kernel32!BaseProcessStart //系统的进程启动函数工作线程:ntdll!ZwWaitForDebugEvent //调用等待调试事件的内核服务dbgeng!LiveUserDebugServices::WaitForEventdbgeng!LiveUserTargetInfo::WaitForEventdbgeng!WaitForAnyTargetdbgeng!RawWaitForEvent //调试引擎内部函数dbgeng!DebugCli ...
Windows软件调试初探-用户态调试模型
Windows软件调试初探-用户态调试模型碎碎念调试器进程通过调试API与NTDLL.DLL中调试支持函数和调试子系统交互。调试子系统分为3个部分:NTDL.DLL支持函数、内核文件支持函数、调试子系统服务器。
NTDLL.DLL中调试支持函数有3中:以DbgUi开头的供调试器用;以DbgSs开头的供调试子系统使用,已被废弃;其他以Dbg开头的用于实现调试API。
内核文件调试函数以Dbgk开头,负责采集和传递调试事件、控制被调试进程。
调试子系统服务器用于管理调试会话和调试事件,是调试消息(事件)的集散地,也是所有调试设施的核心,位于内核模式中。
Windows用户态调试通过调试事件驱动。调试器程序在与被调试进程建立调试对话后,调试器进程进入调试事件循环,等待调试事件发生,然后处理再等待,直到调试会话终止,如:
1234while (WaitForDebugEvent(&DbgEvt, INIFINITE)) { //等待事件 //处理等待得到的事件 ContinueDebugEvent(DbgEvt.dwProcessId, DbgEvt.dwThreadId, ...
Windows软件调试初探-托管
Windows软件调试初探-托管碎碎念C#和Visual Basic .NET等编程语言由公共基础设施支持,被公共类型系统CTS编译为微软中间语言MSIL(也叫公共中间语言CIL)。CIL再由公共运行时CLR或及时编译器JIT在操作系统服务上的本地代码上运行。
CIL是一种面向对象、基于栈的字节码,有200多条指令分为10组。.NET框架中有ILASM和ILDASM用于CIL指令与CIL字节码转化。
.NET将源程序中类型定义、名称等信息以元数据形式保存,并可在运行期使用。元数据与CIL字节码组合起来叫做程序集。
开发.NET程序的语言叫托管语言,用.NET技术开发的程序叫托管程序,CLR有时也叫托管运行时。.NET程序运行时,系统加载MSCOREE.dll,用于解析.NET程序中信息并为其加载合适版本的CLR。
执行引擎EE模块MSCOREE通过注册表确定所需版本CLR,加载其接口模块mscoreei.dll,要加载的CLR主模块为clr.dll。在.NET 2.0下CLR主模块桌面/工作站版本为mscorwks.dll,服务器版本为mscorwks.dll。.NET运行时 ...
WindowsAPI查缺补漏-PE文件格式解析
WindowsAPI查缺补漏-PE文件格式解析碎碎念PE格式为Win32可执行文件采用的文件格式,Win64下称为PE32+。虚拟地址VA表示数据在进程地址空间中内存地址,相对虚拟地址RVA表示数据相对模块基地址偏移,文件偏移地址FOA为文件中数据相对于文件头的偏移。
本节不讲PE文件结构,只讲代码实现。
DOS头DOS MZ头是个IMAGE_DOS_HEADER结构:
123456789101112131415161718192021typedef struct _IMAGE_DOS_HEADER { WORD e_magic; //字符MZ WORD e_cblp; //最后页字节数 WORD e_cp; //全部和部分页数 WORD e_crlc; //重定向表中指针数 WORD e_cparhdr; //DOS MZ长度 WORD e_minalloc; //所需最小附加段 WORD e_maxalloc; //所需最大附加段 WORD e_ss; //DOS代码初始SS值 WORD ...
WindowsAPI查缺补漏-WinSock网络编程
WindowsAPI查缺补漏-WinSock网络编程碎碎念Windows套接字即WinSock以UNIX的伯克利套接字规范为标准,包含同名接口函数,用法也一致。WinSock结课Windows消息机制又增加了许多扩展函数。
TCP/IP规定统一使用大端序传输数据,也称为网络字节顺序。本篇不讲计网,自己去学。
这节内容真是吔屎了...前面基础WinSock编程不支持Unicode还得转,看个乐子就行了,重点在后面I/O模型。
代码例子有ANSI和Unicode混用的情况,纯属懒得改了,用的时候小心点儿。
本篇只讲TCP和UDP连接,想学HTTP啥的可以关上了。
学习本篇需要智商在线,不在线的先去听《大香蕉》洗一下脑子。
地址表示在sockaddr_in结构中同时指定IP地址和端口号。下文定义中出现sockaddr结构的均是为了兼容1.0旧版本,都可以当作sockaddr_in使。
123456struct sockaddr_in { SHORT sin_family; //地址家族 AF_INET USHORT sin_port; //端口号 struct ...