Windows 系统编程基础

进程;虚拟内存;DLLs;线程;系统架构;windows API

进程

私有地址空间;私有处理表;访问token;线程

虚拟内存

进程只能用虚拟内存

DLLs

映射到进程地址空间中,类似python库,可进程间共享

线程

内核执行代码时,实际用的是线程
CPU寄存器状态
访问模式:用户模式和内核模式
两个stacks:一个用户空间一个内核空间
线程本地存储(TLS)
可选的安全token
可选的线程创建的消息队列和窗口
线程调度优先级
状态:运行,准备,等待

系统架构

用户模式:子系统DLLs(服务进程,用户进程,系统进程),NTDLL.DLLs(子系统DLLs,系统进程,子系统进程)
内核模式:win32k.sys,设备驱动,内核,硬件抽象层

ntdll!NtReadFile: sysenter,syscall

函数调用流程: 用户模式:应用 fread->msvcrt.dll ReadFile ->Kernel32.DLL NtReadFile ->NtDll.DLL sysenter,syscall --> 内核模式:NtOskrnl.exe NtReadFile -> NtOskrnl.exe NtReadFile调用设备 -> driver.sys 设备I/O返回调用

windows API

windows API win32 ,.net,windows runtime

Windows应用程序开发测试调试

Visual Studio 社区版,Desktop development with C++
::非强制性,C++中表示全局,无法在C中编译,编码习惯,易于识别windows API调用

msdn getnativesysteminfo:https://learn.microsoft.com/zh-tw/windows/win32/api/sysinfoapi/nf-sysinfoapi-getnativesysteminfo

处理错误

  • msdn一把梭:全部不需要记,查阅文档一把梭

FALSE(0)表示错误,任何其他值表示成功

GetLastError
@err,FormatMessage

HANDLE
Zero (NULL) and -1(INVALID HANDLE VALUE) indicate failure Call
GetLastError

LRESULT 或 LONG:函数直接返回的错误代码错误,SUCCESS(0)表示成功

HRESULT
COM函数/方法中的典型返回类型S OK(0)表示成功,负值表示错误

msdn openprocess:https://learn.microsoft.com/zh-tw/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess

32-bit vs. 64-bit Systems

wow64转换层
windows API 演进向后兼容:指针和处理的数据类型扩展到了64
增加了更多类型:DWORD PTR,INT PTR,SIZE T等

字符串

Windows内核使用UTF-16(Unicode)来表示字符串;Windows APl也使用Unicode;兼容性原因还存在ANSI(ASCII)函数,以“W”(Unicode)和“A”(ANSI)结尾;函数名实际上是一个宏
WCHAR,wchar t(Unicode字符)
PWSTR(Unicode字符串指针),PSTR(ASCII字符串手指针)
PCWSTR,PCSTR(常态变量)

结构

https://learn.microsoft.com/zh-tw/windows/win32/api/processthreadsapi/ns-processthreadsapi-process_information

typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;
  HANDLE hThread;
  DWORD  dwProcessId;
  DWORD  dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

Windows数子版本

NT 4 4.0;2000 5.0;XP 5.1;2003 5.2;2008 6.0;win7 2008 R2 6.1;win8 2012 6.2;win8.1 2012 R2 6.3;win10 2016 10

windows version manifest: APIs(#include <versionhelpers.h>))
API getversionexa弃用:https://learn.microsoft.com/zh-tw/windows/win32/api/sysinfoapi/nf-sysinfoapi-getversionexa
需要这么一个列表才能判断版本信息:https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests

系统信息

GetSystemInfo,GetNativeSystemInfo,静态信息
GetPerformanceInfo(#include <psapi.h>)
GetComputerName(Ex),GetProductInfo,GetSystemDirectory,GetIntegratedDisplaySize,GetUserName(Ex)..

内核对象

windows系统:一切皆对象,进程,线程,互斥体,信号符,文件...
用户模式无法直接访问这些数据结构
内核模式可直接访问对象
用户模式进程可以获取对象的处理方式

对象 和 Handles

每个进程有一个私有处理表(private handle table)
进程创建或打开一个对象时会接收一个handle(用于对底层对象的不透明的间接指针;允许跨进程共享对象)
查看进程处理器(process handles):Process Explorer,handls.exe(www.sysinternals.com), resource Monitor,System Explorer

Handles

windows API公开的对象
Process(CreateProcess,0penProcess)
Thread (CreateThread, OpenThread)
Job(CreateJobobject,openJobobject)
File (CreateFile,CreateFile2)
File mapping (Section)(CreateFileMapping,openFileMapping)
Token (LogonUser,OpenProcessToken)
Mutex(Mutant)reateMutex(Ex),OpenMutex)
Event(CreateEvent(Ex),OpenEvent)
Semaphore(CreateSemaphore,OpenSemaphore)
Timer(CreateWaitableTimer,OpenWaitableTimer)
I/O Completion Port(CreateIoCompletionPort)
Window Station(CreateWindowStation,OpenWindowstation)
Desktop(CreateDesktop,OpenDesktop)

用户模式进程通过调用适当的reate*函数或Open*函数检索Handles:成功会返回一个handle;失败时为NULL或INVALID HANDLE VALUE

不需要handle时,应通过调用CloseHandle APl将其关闭:记录从Handle table中删除;对象引用数减1,如果为0,对象将被删除

假Handles
正常有效Handles的值为4倍:第一个Handles为4
假Handles有特殊的值,并且不可拆卸:GetCurrentProcess(-1);GetCurrentThread(-2)
windows 8+:GetCurrentProcessToken(-4);GetCurrentThreadToken(-5);GetCurrentThreadEffectiveToken(-6);所有token只有TOKEN QUERY 和 TOKEN QUERY SOURCE权限

共享对象

进程Handles继承,进程创建一个子进程
以名称打开对象,最简单的共享机制
复制Handles,DuplicateHandle APl

对象名与会话

winObj - Sysinternals
对象名可见:可使用工具或编程进行定位
对象名不可见:windows vista+ 支持私有对象名称空间,可进一步受到SID或完整性级别的限制
APls:CreateBoundaryDescriptor,AddSIDToBoundaryDescriptor,CreatePrivateNamespace,OpenPrivateNamespace,ClosePrivateNamespace

Handle 继承

复制Handle时必须指定为 inheritable,CreateProcess调用必须为继承处理参数指定TRUE,所有可继承的Handle都复制到目标进程,Handle值相同

User 和 GDI 对象

Executive中的对象管理器只负责内核对象
用户和GDI对象由Win32k.sys管理
user32.dll和gdi32.dll中的APl函数不会经过NtDll.dll:直接调用sysenter/syscall指令
用户对象:windows(HWND),菜单(HMENU)和hooks(HHOOK)
用户对象 handles:无引用/handles计数;私有到一个windows station
GDI对象:设备上下文(HDC),pen(HPEN),brush(HBRUSH),bitmap(HBITMAP)等
GDI对象handles:无引用/handles计数;私有到一个进程;无文档化/教程的跨进程共享方式

posted @ 2024-11-19 08:28  sec875  阅读(9)  评论(0编辑  收藏  举报