Timmoc 的技术小屋

Timmoc 的技术小屋

这里记录技术笔记与日常思考,欢迎常来逛逛 👋

Windows内核学习笔记(五)

一点定义 作业(job) 是由执行体支持的一种内核对象,它能够将一个或多个进程视为一个整体来进行管理和控制。管理程序借助 Windows API,能够对作业所使用的系统资源(包括 CPU 或内存)的诸多限制进行控制,比如用户模式 CPU 时间的限制、进程的处理器亲和性、工作集的最大值与最小值、虚拟内存的使用限制等。 迁程(fiber) 是一种用户线程,对于内核来说是不可见的,是由 kernel32.dll 来实现的。应用程序可以在一个线程环境中创建多个迁程,并且可以手动控制这些迁程的执行。迁程不会自动执行,应用程序需要明确地选择某个迁程来执行。一旦迁程开始运行,它会一直运行,直到它退出,或者它显式地切换到另一个迁程。 目前没有看到这俩的用处,先记录下来,像这种定义却没有实际接触的东西可不好背,记下来方便以后回顾 同步、自旋锁 Windows根据执行环境中的IRQL大于APC_LEVEL 或者等于PASSIVE_LEVEL,将同步机制分为“不依赖线程调度的同步机制”和“基于线程调度的同步机制”。 不依赖线程调度的同步机制主要是在IRQL的高优先级下执行的,通常用于中断处理程序和内核模式代码中,以确保在处理中断或执行关键内核代码时,不会被其他线程打断。常见的不依赖线程调度的同步机制包括: 自旋锁(Spin Lock):自旋锁用于在多个线程之间互斥的访问共享资源,本质上是一种忙等待(busy-wait),意思是线程会一直自旋(忙等待)直到锁可用为止,而不会被挂起等待。常使用在高IRQL下,因为此时是不允许切换线程的,使用自旋锁可以确保关键代码不会被其他线程打断。一些自旋锁扩展:执行体自旋锁(支持共享和独占的语义)、排队自旋锁(queued spin lock)和栈内排队自旋锁(in-stack queued spin lock)。 中断服务例程(ISR):ISR用于响应硬件中断,当硬件设备触发中断时,操作系统会立即执行ISR来处理中断。ISR运行在IRQL的高优先级下,不允许进行线程调度,以确保快速响应中断。 延迟过程调用(Deferred Procedure Call,DPC):DPC用于延迟执行一些代码块或处理程序,常与中断处理有关。当硬件设备触发中断时,操作系统会将中断服务例程(ISR) 用于快速响应中断,但有时需要执行一些耗时的操作,例如数据传输或资源释放,这时就会使用DPC来延迟执行这些操作。 另一种基于线程调度的同步机制:当一个线程的执行条件不满足时,该线程进入等待状态,系统将控制权交由其他满足执行条件但没有得到处理器资源的线程;以后,当该线程的执行条件满足时,它又有机会继续执行。这里的执行条件正是Windows提供的线程同步机制中的语义。Windows定义了统一的机制来支持各种线程同步原语:分发器对象(dispatcher object),其数据结构头部为DISAPATCH_HEADER。 ...

March 9, 2025 · 3 min

Windows内核学习笔记(六)

常见的分发器对象 事件(event):用于线程之间的通信和同步,它有俩种状态:已触发和未触发。事件可以用于线程等待某个事件发生,或者通知其他线程事件的发生。 互斥量(Mutex)(或互斥锁):互斥量用于确保在同一时刻只有一个线程能够访问共享资源。它允许线程请求锁定,当一个线程获得锁定时,其他线程必须等待,直到锁被释放。 信号量(Semaphore):用于控制对共享资源的并发访问。它维护一个计数器,允许指定数量的线程同时访问资源。 条件变量(Condition Variable):条件变量用于线程之间传递信号和等待特定条件的发生。通常与互斥量一起使用,用于等待某个条件满足后执行操作。 读写锁(Read-Write Locks):读写锁用于控制对共享资源的读和写,它允许多个线程同时读取资源,但只允许一个线程写入资源。 计数器对象(Counting Semaphore):一种特殊的信号量,它可以增加和减少计数器的值,通常用于跟踪资源的可用性或完成的任务数量。 关于互斥锁和自旋锁:互斥锁基于线程调度,而自旋锁不依赖线程调度;还有一个区别是线程尝试获取锁时,如果该锁被占用,线程是被挂起还是一直自旋;互斥锁适用于长时间的临界区和资源竞争激烈的情况,而自旋锁适用于非常短暂的临界区。 Windows在上述基础上,实现了同步语义更为丰富的一些同步机制,包括:快速互斥体(fast mutex)、守护互斥体(guarded mutex)、执行体资源(executive resource)和推锁(push lock)。 一听又是历史,见过fastcall的都知道。 SSDT **系统服务描述表(System Services Descriptor Table,SSDT)**其在内核中的实际名称是 “KeServiceDescriptorTable”。 ...

March 9, 2025 · 2 min

再战博客园美化(十一)

前言 因为有个(五)被我漏掉了,所以这个再战系列跳过了十 对了,这是我修改后的vue项目:git@gitcode.com:Timmoc/goodvue.git 不建议直接克隆使用,因为有很多硬编码。但如果我的项目能帮助到各位就最好了。 起因 我的页面居然只有两页? 切换到页面二以后才正常。 重新切回页面一,注意到也正常。 注意到两个url不一致。 好,行动,怎么能让我的主页只能看到两页呢? 行动 好像有点不对 页面加载不完整。 哦,不对,我想起来我调试的方法了。 博客园特有的调试方法。 好的哥,等我。 再复制过来。 等会,复制到哪里? ...

March 8, 2025 · 1 min

记一次HTTPS server.key私钥泄露事件

前言 在准备进行博客园美化的时候,发现自己的Alist Server.key泄露了。 虽然配套泄露的Server.crt已经过期了,但是我续期的那个Server.crt可以直接访问我的本机获取到 这对我的电脑(和其他信任了TD根证书的电脑与手机)造成了很严重的中间人攻击风险。 因此需要吊销证书 禁止进一步的泄露 将git仓库设置为私有 git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \ --prune-empty --tag-name-filter cat -- --all 清除历史中数据 我注意到,仍然可以访问,只是哈希不同了而已。 这是新建了一个哈希分支。 ...

March 8, 2025 · 1 min

Windows内核学习笔记(四)

杂项 特权模式和内核模式相同 系统进程 笔者学习到此处的时候开始怀疑原作者是否有自己看过他写的文章。(错别字) 我要不要换一篇文章阅读。 系统空闲进程(Idle):该进程的PID为0,其中每个处理器或核对应有一个线程。 System 进程:这是操作系统的核心进程,PID为4。它负责管理内核模式下线程、设备驱动程序、中断处理和其他核心事件。 会话管理器(smss.exe):Windows系统中创建的第一个用户模式进程,在Windows启动过程中创建环境变量,(启动了子系统进程csrss.exe和登录进程winlogon.exe)。另外,它还负责创建新的终端服务器会话,包括建立会话空间的数据结构,为新建的终端服务器加载子系统。 登录进程(winlogon.exe):负责处理交互用户的登录和注销。 Windows子系统进程(csrss.exe):负责为用户提供一个子系统环境。 本地安全权威子系统进程(lsass.exe):负责本地系统安全策略。 Shell进程(explorer.exe):Windows的默认Shell,它提供了系统与用户打交道的各种界面,包括开始菜单、任务栏、资源管理窗口等几乎所有Windows用户都熟悉的界面。 服务控制管理器(services.exe):负责Windows的系统服务,指一些特殊的进程。 services比较常见,会启动注册为服务并且选择开机自启的一些特殊dll,或者在手动模式下被管理员权限的程序要求启动一些服务。 对于病毒来说是其中一个藏身地。另外一个藏身地是任务计划程序。 某些“病毒”会藏身于其中,并且不将自己注册为开机自启,而是每一个小时启动一次,这样可以逃避部分检查开机自启的程序。 只能说,非常天才,不愧是国产,脑子转得就是快。 既然它这样恶心我了,那我也只能把它装进沙盒里面了。 不过沙盒里面它也依旧能恶心我: 在思考他的云同步功能到底有没有那么重要,要不要换office。 ...

March 3, 2025 · 1 min

Sunshine Moonlight 串流 再玩一把

前言 其实我已经配置好了,目前的配置是 不过我额外安装vdd是因为基地版自带的那个显示屏有点问题。 只不过我自己也忘了有什么问题了。 但是现在 什么?有更新? 更新来玩玩。 博主能这样随便更新,是因为这个软件不怎么用,而且喜欢折腾才这样做的,如果经常需要使用建议是稳定就不更新了 啥意思,以前本机外可以直接访问WEBUI吗,这太离谱。 感觉更应该是以前不监听本机外IP 卸载 按照提示卸载即可 安装 直接下一步就完事 修bug 出现了,逃不掉的。 用新的东西以后开始出bug,看不懂,更新一下先 再次卸载 看不懂报错原因,卸载了再说 ...

March 2, 2025 · 1 min

Windows 剪贴板 编程原理学习

前言 好累,终于码完一篇字了。 进入正题吧 与AI对话 https://learn.microsoft.com/zh-cn/windows/win32/dataxchg/standard-clipboard-formats 提问是个好习惯,询问AI可以快速得到回答。 GDI 对象是什么,什么是 GDI 对象? GDI(Graphics Device Interface,图形设备接口)对象是 Windows 操作系统中用于管理和操作图形资源的基本实体。GDI 是 Windows 提供的一组 API(应用程序编程接口),用于在屏幕上绘制图形、文本和图像,同时也用于打印和显示设备的交互。GDI 对象是这些图形操作的核心组成部分。 ...

March 2, 2025 · 2 min

Windows 剪贴板 编程原理引入

前言 不得不说上三休四的生活就是舒服,我都有精力提升自己了。 本文将基于自己在生活中遇到的现象进行探索,因此问题引入对自己较为重要,读者可以跳过。 文章主要探讨剪贴板格式问题,即下面的链接。 https://learn.microsoft.com/zh-cn/windows/win32/dataxchg/standard-clipboard-formats 续前言 我逐渐发现这篇文章越写愈多了,因此编程原理的学习将会另开一篇。 本篇文章是指我在遇到剪贴板在生活中的现象。 问题引入 情境一 从一个复杂格式的软件复制文本到QQ的文本框,复杂格式会被自动清除,但是基本内容仍然保留 不过我认为windows自带的这个才是真正的复制结果。 QQ把这个小圆点作为空格复制过去了。 奇怪的地方在于复制回来会。。。 如果在本软件复制本软件的,当然会正常,毕竟内容是html格式。 情境二 使用sn(忘名了)或者pixpin的人可能看到过这个“复制图像为文件”的选项 在不勾选它的情况下,截图,复制。 可以在QQ中正常粘贴,但是如果尝试粘贴到文件系统会被拒绝。 此时勾选这个剪贴板内容后,再试一次。 ...

March 2, 2025 · 1 min

寻觅Notepad2e

起因 这天,正当我兴致勃勃地编写新的博客时,想要打开windows的notepad,结果居然发现有个奇怪的东西,还占在最优匹配上,还好我看了一眼名字没有回车直接打开 我倒要看看是哪个国产流氓软件(注:刻板印象)给我偷偷装上的新notepad。 哦,原来是TortoiseGit啊,误会国产软件了。 不过我有个问题,你Notepad 2e x64 [ZH] 这个 [ZH] 是否有点自欺欺人了?

March 2, 2025 · 1 min

Windows内核学习笔记(一)

前言 此随笔为本人笔记,并非系统学习应当使用 内核 ntoskrnl.exe 是 Windows 操作系统的核心内核程序文件,全称为 Windows NT Operating System Kernel。它是 Windows 操作系统正常运行的基础 内核层级 R0是内核层,R3是应用层,而R1、R2不使用 这样就解决了我之前不理解R1、R2是什么应用的问题 Windows内核中主要可以分成三层:硬件抽象层(HAL),内核层(也称微内核micro-kernel),执行体层。 Ntdll.dll的功能 作为桥梁:Ntdll.dll是用户模式代码和内核模式系统服务之间的连接纽带。它使得用户模式的应用程序能够方便地调用内核提供的系统服务,而无需直接与内核进行交互,从而保证了系统的稳定性和安全性。 提供存根函数:对于内核提供的每一个系统服务,Ntdll.dll都对应提供一个存根函数。这些存根函数的名称以“Nt”作为前缀,例如NtCreateProcess(用于创建进程)、NtOpenFile(用于打开文件)等。存根函数的作用是为用户模式代码提供一个接口,当用户模式代码调用这些存根函数时,Ntdll.dll会将调用请求转发给相应的内核模式系统服务。 提供系统级支持函数:除了存根函数,Ntdll.dll还提供了许多系统级的支持函数,用于实现各种系统功能。这些支持函数按照功能不同有不同的前缀,例如: 映像加载器函数(以“Ldr”为前缀):用于加载和管理程序的映像文件,例如LdrLoadDll(加载动态链接库)等。 系统时间函数(以“Etw”为前缀):用于与系统时间相关的操作,例如EtwStartTrace(开始跟踪事件)等。 一般的运行支持函数(以“Rtl”为前缀):提供各种运行时支持功能,例如RtlAllocateHeap(分配堆内存)等。 字符串支持函数:用于字符串操作,例如RtlCompareString(比较字符串)等。 中断请求级别 在Windows操作系统中调用内核函数时,必须关注中断请求级别(IRQL,Interrupt Request Level),原因如下: ...

February 25, 2025 · 1 min