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 ...
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(void);
...
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。
在用 ...
Windows软件调试初探-进程与线程
Windows软件调试初探-进程与线程进程资源每个进程都有这些资源:
一个虚拟地址空间。
全局唯一Cid,即PID。
一个可执行映像,即该进程可执行文件在内存中的表示。
一个或多个线程。
一个内核空间中的EPROCESS。
一个内核空间中的对象句柄表。
一个用于描述内存目录表起始位置的基地址,即页目录基地址DirBase。当CPU切换到该进程时,将该地址加载到页表基地址寄存器如CR3或TTBR,再由RVA翻译为正确物理地址。
一个用户空间中的PEB。
一个访问令牌。
例如列出系统所有进程:
123456789101112131415161718192021226: kd> !process 0 0 //第一个参数为EPROCESS地址 0表示所有 第二个0为最少信息**** NT ACTIVE PROCESS DUMP ****PROCESS ffff84898203c440 //进程EPROCESS地址 SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000 //会话、客户进程ID、进程环境快地址、父进 ...
WindowsAPI查缺补漏-动态链接库
WindowsAPI查缺补漏-动态链接库静态链接库静态链接库头文件:
123#pragma onceint funAdd(int a, int b);int funMul(int a, int b);
静态链接源文件:
1234567#include "StaticLinkLibrary.h"int funAdd(int a, int b) { return a + b;};int funMul(int a, int b) { return a * b;};
调用方:
12345678#include <Windows.h>#include "StaticLinkLibrary.h" // StaticLinkLibrary.h头文件#pragma comment(lib, "StaticLinkLibrary.lib") // StaticLinkLibrary.lib对象库int WINAPI WinMain(HINS ...
WindowsAPI查缺补漏-剪贴板
WindowsAPI查缺补漏-剪贴板常用函数OpenClipboard打开剪贴板:
123BOOL OpenClipboard( _In_opt_ HWND hWndNewOwner //与剪贴板相关联得窗口句柄);
在关闭剪贴板前其他应用程序无法打开剪贴板。
EmptyClipboard清空剪贴板中数据,并把OpenClipboard的hWndNewOwner指定的窗口设为剪贴板的新所有者。若hWndNewOwner为NULL则导致后续SetClipboardData失败。
1BOOL EmptyClipboard(VOID);
SetClipboardData把指定格式的数据写入剪贴板:
1234HANDLE SetClipboardData( _In_ UINT uFormat, //要写入剪贴板中数据的格式 _In_opt_ HANDLE hMem //数据的句柄); //成功返回剪贴板数据句柄 失败NULL
其中uFormat常用的有:
枚举值
含义
CF_TEXT
ANSI文本格式
CF_UNICODETEXT
Unicode文本格式
CF_BIT ...