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 ...
Windows软件调试初探-启动过程
Windows软件调试初探-启动过程本篇没特殊说明就是按照时间先后顺序写。
BootMgr系统上电后执行固化在系统主板上的固件代码,检测和初始化基本硬件,如CPU、内存、键盘、显卡和磁盘等。之后加载并将执行权移交给操作系统启动程序,即NTLDR。NTLDR依次分为BootMgr、WinLoad、WinResume。BootMgr从系统引导配置数据BCD中读取启动设置,当有多个启动选线则显示启动菜单让用户选择。现有图形界面启动程序BootIM.exe,启用经典启动菜单可以:
1bcdedit /set bootmenupolicy Legacy
为了启用BootMgr和WinLoad的调试引擎,执行以下命令。调试时先用WinDBG监听,之后会自动挂靠。打开调试模式后无法正常进入系统,只能进入安全模式将on改为off。NT内核加载后调试引擎在配置双机调试时已打开。
1234567bcdedit /set {bootmgr} bootdebug onbcdedit /set {bootmgr} debugtype serialbcdedit /set ...
WindowsAPI查缺补漏-杂谈
WindowsAPI查缺补漏-杂谈程序开机自启动之前有讲过,这里讲些别的方法。
将程序快捷方式写入开机自启动程序目录法123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115#include <windows.h>#include <tchar.h>#include <Shlobj.h>#include <strsafe.h>#include "resource.h"// 函数声明INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wPara ...
WindowsAPI查缺补漏-异常处理
WindowsAPI查缺补漏-异常处理结构化异常处理SEH基本结构1234567__try { //受保护语句}__except (异常过滤表达式) { //异常处理语句};//其他语句
其中异常锅炉表达式可以是:
枚举值
含义
EXCEPTION_EXECUTE_HANDLER
执行except块内容并继续执行except块后其他语句,try块中剩下语句不执行
EXCEPTION_CONTINUE_SEARCH
不执行except块,继续向上搜索下一个具有最高优先级异常处理程序
EXCEPTION_CONTINUE_EXECUTION
不执行except块,重新执行发生异常的语句,慎用
GetExceptionCode获取刚发生异常的异常代码,只能在异常过滤表达式或异常处理程序块中被调用。
123DWORD GetExceptionCode(VOID);#define GetExceptionCode _exception_codeunsigned long _cdecl _exception_code(v ...
WindowsAPI查缺补漏-INI配置文件与注册表操作
WindowsAPI查缺补漏-INI配置文件与注册表操作碎碎念INI文件即初始化文件,如Windows目录中Win.ini保存桌面设置和与应用程序运行有关信息,System.ini保存于硬件配置有关的信息,还有Control.ini等,但他们被映射到注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Current Version\IniFileMapping中。单个INI文件大小不得超过64KB,注释以“;”开头且必须独占一行。键名不能存在“;”但键值可存在,键名不能为多行文本。
NT系统注册表由Windows\system32\Config目录中多个文件构成,文件运行时这些文件被系统独占,无任何权限(甚至是读),只能通过Windows提供的接口进行操作。常见键值数据类型有:
键值数据类型
含义
REG_SZ
REG_DWORD
REG_QWORD
REG_BINARY
REG_MULTI_SZ
字符串序列,每个字符串以1个\0结尾,最后一个以2个\0结尾
REG_EXPAND_SZ
包含对环 ...
Windows软件调试初探-架构和系统部件
Windows软件调试初探-架构和系统部件系统概览在内核空间中:
硬件抽象层HAL隔离CPU架构层面核心硬件的硬件差异性,使内核和顶层模块可使同一的方式访问硬件,不负责的外设设备硬件通过I/O管理器加载不同设备驱动程序解决。执行体如内存管理器、进程管理器、I/O管理器。Windows子系统驱动程序Win32K.sys包括USER和GDI两部分,USER负责窗口管理、用户输入等,GDI负责显示输出和各种图形操作,还有DxgKrnl.sys图形核心负责管理GPU 有关核心任务。内核支持模块有用于内核调试的KDCOM.DLL,用于启动截断显示驱动的BOOTVID.DLL,用于检查模块完好性的CI.DLL,用于支持日志功能的CLFS.SYS,支持WHEA的PSHED.DLL,管理流媒体的KS.sys,网络套接字WinSock的内核空间接口驱动AFD.sys,管理网卡驱动的NDIS.sys,管理网络过滤驱动的Windows过滤平台清凉过滤器驱动程序Wfplw.sys,支持ACPI标准的ACPI.sys,PCI总线的PCI.sys,NTFS文件系统的实现NTFS.SYS。
在用 ...