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 ...
WindowsAPI查缺补漏-进程
WindowsAPI查缺补漏-进程创建进程ShellExecute打开i可执行文件、文档文件、网址等。
12345678HINSTANCE ShellExecute( _In_opt_ HWND hwnd, //父窗口句柄 _In_opt_ LPCTSTR lpOperation, //指定的操作 _In_ LPCTSTR lpFile, //要操作的文件或文件夹 _In_opt_ LPCTSTR lpParameters, //当lpFile为可执行文件时 为命令行参数 _In_opt_ LPCTSTR lpDirectory, //要操作的文件的默认工作目录 _In_ INT nShowCmd //显示标志)
lpOperation可以是:
枚举值
含义
open
由关联的默认程序打开lpFile文件/文件夹
explore
资源管理器打开lpFIle文件夹
edit
用编辑器(记事本)打开lpFile指定的文档,不是文档则调用失败
print
打印lpFile指定的文件,不是文档文件则失败
find
从l ...
WindowsAPI查缺补漏-文件驱动器目录
WindowsAPI查缺补漏-文件驱动器目录碎碎念硬盘容量=柱面数(磁道数)*磁头数(盘面数)*每磁道扇区数*每扇区字节数。
目录SetCurrentDirectory设置当前目录:
123BOOL SetCurrentDirectory( LPCTSTR lpPathName)
GetCurrentDirectory获取当前目录:
1234DWORD GetCurrentDirectory( _In_ DWORD nBufferLength, //缓冲区大小 单位字符 _Out_ LPTSTR lpBuffer //返回当前目录)
GetFullPathName获取一个文件完整路径:
123456DWORD WINAPI GetFullPathName( _In_ LPCTSTR lpFileName, //文件名称 _In_ DWORD nBufferLength, //缓冲区大小 单位字符 _Out_ LPTSTR lpBuffer, //返回完整路径文件名 _Outptr_opt_ LPTSTR* lpFilePart //返回文件名起始地址指针)
文件操作Cr ...