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为文件中数据相对于文件头的偏移。
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 e_sp; //DOS代码初始S ...
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; //端口号 ...
Windows软件调试初探-垫片
Windows软件调试初探-垫片垫片数据库垫片用于解决软件兼容问题,让两个模块对接一起。用户空间的用来解决第三方代码兼容问题,叫程序兼容引擎ACE,内核空间的用来解决设备驱动兼容问题,叫内核垫片引擎KSE。ACE和KSE都依赖垫片数据库SDB。
在C:\Windows\apppatch下有一堆.sdb文件,即垫片数据库,用sdb2xml可以将其导出为XML。文件名以main结尾都是微软官方维护的,sysmain.sdb解决用户空间应用程序问题,drvmain.sdb用于内核空间,msimain.sdb用于MSI安装包,pcamain.sdb供程序兼容助理使用。
也可以用应用兼容工具包ACT中的兼容管理器浏览SDB数据库内容,用兼容管理员定制新SDB文件。定制的SDB需要安装和注册来生效,注册位置为“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Widows NT\CurrentVersion\AppCompatFlags\Custom”和“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Widows NT\CurrentVers ...
Windows软件调试初探-特殊过程调用
Windows软件调试初探-特殊过程调用跨越空间、跨越特权级别、跨越线程、跨越进程或跨越机器的过程调用统称为特殊过程调用。
异步过程调用APC例如异步文件操作引发的APC:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849void CGeAPCDlg::D4D(LPCTSTR szFormat, ...) { TCHAR szMsg[MAX_PATH] = { 0 }; va_list va; va_start(va, szFormat); _vsntprintf_s(szMsg, MAX_PATH, MAX_PATH, szFormat, va); OutputDebugString(szMsg); this->m_ListInfo.AddString(szMsg); return;};VOID WINAPI GeCompletedWriteRoutine(DWORD dwErr, DWORD cbWritte ...