- 博客(250)
- 收藏
- 关注
原创 Windows中__security_check_cookie与绕过
为了缓解栈溢出漏洞,msvc默认会在函数序言部分放置一个security_cookie(启用GS编译选项)。security_cookie(栈金丝雀)必须放在局部变量和返回地址之间,而不是局部变量之下,否则根本无法检测典型的栈溢出攻击。在函数结尾部分,会验证这个值:如果这个值被改变了,程序就会抛出异常:每次运行程序,这个sercurity_cookie的值都会不同,每次都从rdata节区中选取8字节作为cookie。
2026-06-10 22:40:13
158
原创 Windows内核事件通知机制
Windows内核中提供了一组接口,让我们可以针对某一事件注册通知例程,当这个事件发生的时候,我们注册的通知例程就会执行。
2026-06-08 17:36:10
403
原创 通过KiSystemServiceUser获取SSDT基址
在64位Windows中,SSDT被隐藏起来了,但是通过windbg调试发现,nt中导出了KeServiceDescriptorTable,该数组的第一个元素的第一个字段就是SSDT的基址。下图是KeServiceDescriptorTable数组中元素的类型定义:所以我们如果可以找到KeServiceDescriptorTable,就可以找到SSDT。
2026-06-07 23:05:02
393
原创 Windows堆管理
Windows的堆管理器,负责管理使用页面粒度内存分配函数保留的大内存区中的内存分配。这句话的意思是,堆是基于页粒度内存分配的更高级的内存管理策略。“使用页面粒度内存分配函数保留的大内存区”指的是操作系统底层的内存管理单元。在 Windows 中,虚拟内存管理器以页(Page,通常为 4KB)为基本单位管理物理内存,并且通过 VirtualAlloc等函数分配内存时,实际上是以分配粒度(Allocation Granularity,通常为 64KB) 来保留地址空间的。
2026-06-07 13:38:26
171
原创 Windows x64系统服务原理
64位Windows通过syscall指令进行系统服务调用,系统服务调用号由eax给出;通过sysexit指令返回到用户态。
2026-06-06 10:46:27
210
原创 Windows 64位程序栈帧布局
下面是64位程序在函数调用时的典型栈帧布局:fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;低地址高地址主调函数栈帧影子空间(32字节)返回地址局部变量区被调函数栈帧RSP(栈顶指针)callcall:在x64调用约定中,主调函数先分配影子空间,然后call指令压入返回地址,因此影子空间位于返回地址的方向。
2026-06-03 20:51:01
247
原创 通过进程附加方式读写进程内存
通过调用KeStackAttachProcess,我们可以把当前线程附加到目标进程中,从而允许内核diamond直接访问目标进程的用户模式内存。
2026-06-03 12:17:35
109
原创 Windows认证和安全对象的基本概念
访问令牌(Token):标识进程的身份和权限安全描述符(Security Descriptor):定义对象的安全属性访问控制列表(ACL):通过 DACL 和 SACL 控制访问和审计理解这些概念是进行 Windows 系统编程和安全开发的基础。在实际开发中,合理设置安全描述符可以有效防止未授权访问,而正确使用访问令牌则能实现精细化的权限控制。
2026-05-30 01:10:13
219
原创 x86特权级别
当前正在执行的代码/任务所处的特权级(0-3)。它存储在CS寄存器的低2位中。它由CPU硬件自动维护。当程序控制流转移(如跳转、调用、中断)到不同特权级的代码段时,CPU会更新CS,从而改变CPL。CPL决定了你能执行什么指令、能访问什么数据。 内核代码运行在CPL=0,用户代码运行在CPL=3。
2026-05-28 16:06:35
573
原创 Windows APC注入
隐蔽性要求较高的注入:APC注入不创建新线程,也不使用远程线程创建API(如),因此能绕过部分基于线程创建行为的检测手段。目标进程存在可警报等待线程:当目标进程中有线程处于SleepEx等可警报等待状态时,APC注入的成功率较高。用户态DLL注入:适用于将用户态DLL注入到目标进程,利用加载恶意模块。单次执行任务:APC回调执行完毕后即从队列中移除,适合只需执行一次的注入任务。
2026-05-28 11:00:01
403
原创 Windows用户态下常见的DLL注入技术总结
注入技术是否需要远程线程持久性隐蔽性实现复杂度适用场景否(系统自动加载)低中低有消息循环的GUI进程是低低低通用注入,兼容性最好否(利用APC队列)低中高中目标线程处于可告警等待状态时注册表注入(AppInit_DLLs)否高中低全局注入,Win7及以下系统DLL劫持否高高中针对特定程序,持久化反射式DLL注入是低极高高需要绕过PEB检测的场景导入表注入否高中高持久化注入,修改磁盘文件。
2026-05-28 00:04:36
584
原创 Windows用户态hook技术总结
属于地址hook,通过修改PE文件中导入地址表(IAT)或导出地址表(EAT)中的函数地址,将对目标API的调用重定向到自定义函数。主要利用了Windows用户态异常处理机制,在触发异常时控制权转到我们设置的异常处理器(如调试器、VEH、SEH)中执行。通过SetWindowsHookEx函数安装系统级或线程级的消息过滤器实现,只能拦截消息事件。通过修改目标函数起始处的几个字节,跳转到自定义函数处。
2026-05-27 19:14:43
501
原创 Microsoft Detours的Transaction模型
Detours 的事务机制是将复杂的、容易出错的并发代码修改操作,封装为简单的、原子性的批处理操作。线程状态管理:安全地挂起和恢复线程指令指针重定向:避免执行到被修改的代码原子性修改:确保所有修改要么全部生效,要么全部无效自动回滚:在错误时恢复系统状态这种设计使得开发者能够专注于 Hook 逻辑本身,而无需处理复杂的并发和错误恢复问题,大大提高了 Hook 代码的可靠性和稳定性。
2026-05-27 15:31:50
37
原创 DonCris‘s Time Rift 2026
hash = hash * 33 + 当前字符的ASCII值。这题还挺有意思的,虽然很简单,但是作者设计的情景不错。hash由题目作者指定。
2026-05-25 15:04:08
22
原创 I Pack You加密壳:实现页粒度的动态解密和惰性加密
搭建好基本框架之后,我又向框架中添加了一些基础的静态反调试功能,这篇文章主要记录一下如何实现。
2026-05-24 16:14:59
439
1
原创 表里不一的vs2026:谁偷偷修改了我的字节?
最近在做一个加密壳,本来使用nvim+cmake开发,但是被nvim字符编码的问题搞得有点破防,就切换到了vs。
2026-05-19 17:01:31
200
原创 Windows的堆内存
Windows 堆 API 提供了一种比 C 运行时库(CRT)的更接近系统底层的控制方式。对于需要精细控制内存布局、或在高性能场景下避免锁竞争(通过创建多个私有堆)的开发者来说,直接使用 Heap API 是值得考虑的选择。理解堆的运作机制,有助于写出更稳健的 Windows 应用程序。
2026-05-18 16:19:23
196
原创 I Pack You:实现基本的软件壳框架
记录一下自己开发简易软件壳的过程,参考的开源软件和书籍贴在文末。这只是一个简易的加壳工具,实现了加壳的基本框架,后面会增加更多的功能填充这个框架。这个壳全部使用c/c++进行编写,没有使用汇编。因为在x64下,visual c++不支持内联汇编的语法了。如果要使用汇编,需要将汇编代码作为一个模块供c/c++使用。软件壳分为两个部分:加壳程序和stub。其中stub以dll的形式存在,使用链接器指令将一些节区融合在一起(参考《加密与解密》)。加壳程序对目标PE文件进行加密和变换后,会提取Stub.dll的.t
2026-05-17 23:35:11
549
原创 Windows中的I/O完成通知与事件内核对象
Windows提供了一套灵活机制来处理异步I/O操作,其中事件内核对象是较早期但至今仍有价值的通知方式之一。这种方式让程序能够发起I/O请求后继续执行其他任务,当I/O操作完成时,通过事件对象来通知调用线程。
2026-04-27 14:35:37
328
原创 使用内核对象进行线程同步
在多线程编程中,同步机制帮助线程协调彼此的工作。Windows提供了两套不同的方案:用户模式同步和内核对象同步,每种方案都有其适用的场景。
2026-04-27 11:43:56
381
原创 Windows作业机制
Windows作业对象是一种内核级别的进程管理机制。它允许系统管理员和开发者将多个进程组合成一个逻辑单元,并对这个单元实施统一的资源限制、安全策略和生命周期管理。作业对象在Windows NT架构中已存在多年,是许多系统功能和企业应用的基础。
2026-04-27 08:51:41
50
原创 Windows用户模式下的线程同步
Windows的InterLocked系列函数是用户模式下进行线程同步和数据保护的基础。这组函数的核心是“互锁”,它们依赖CPU提供的硬件原子指令,能够以不可分割的方式对内存中的一个简单变量(通常是32位或64位整数)进行“读取-修改-写回”操作。这个“不可分割”的特性,使得它们成为实现无锁(Lock-Free)编程、构建更高级同步对象(如自旋锁、引用计数)的基石。
2026-04-27 00:26:12
393
原创 调试Windows11启动过程
建议还是跟着张银奎老师的步伐,亲自调试一遍。先对整个过程有个大致的映像,以后需要在哪个步骤中做文章的时候,再仔细研究该步骤的细节。
2026-04-23 23:45:58
481
原创 通过异步的方式处理IO和延迟过程调用
有时候一些高IRQL的代码需要执行一些低IRQL的代码。但是在高IRQL的情况下,低IRQL的代码是不能够执行的。DPC解决了这一问题。
2026-04-18 00:44:40
158
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅