给进程伪造一个父亲
传统的进程树模型不仅是系统管理的图谱,更是安全审计与调查的关键线索。然而,通过特定的技术手段,一个进程完全可以“认贼作父”——将其父进程信息伪装成另一个合法或高权限进程,从而隐匿自己的真实起源,逃逸监控,混淆侦查视线。这不仅是攻击者用于规避检测的方法,也为防御方深入理解系统底层机制打开了另一扇窗。本文将探索这项技术在 Windows 系统下的实现原理。
传统的进程树模型不仅是系统管理的图谱,更是安全审计与调查的关键线索。然而,通过特定的技术手段,一个进程完全可以“认贼作父”——将其父进程信息伪装成另一个合法或高权限进程,从而隐匿自己的真实起源,逃逸监控,混淆侦查视线。这不仅是攻击者用于规避检测的方法,也为防御方深入理解系统底层机制打开了另一扇窗。本文将探索这项技术在 Windows 系统下的实现原理。
在 macOS 上分发 Qt 应用,开发者常被多架构编译、代码签名、公证流程所困扰。本文基于 Qt6.9.2 实战经验,系统梳理了从编译配置到最终分发的完整路径。你将了解如何通过 CMake 管理多架构构建,使用 macdeployqt 打包依赖,配置正确的 entitlements 文件,并完成 Apple 强制要求的签名与公证。更提供自动化脚本示例,助你告别重复操作,确保应用在 Intel 和 Apple Silicon(M 芯片) 设备上均能无缝运行。这份避坑指南,将带你高效跨越 macOS 分发的最后一道门槛。
x86架构作为个人计算机和服务器领域的主流计算架构,其汇编语言是理解计算机底层运行机制、进行逆向工程、性能优化及嵌入式开发的核心基础。本文将系统梳理x86架构中的常用寄存器和常用汇编指令,并结合实际应用场景说明其作用。
寄存器是CPU内部的高速存储单元,用于临时存放数据、地址或控制信息。x86寄存器按功能可分为通用寄存器、段寄存器、标志寄存器、指令指针、控制寄存器、调试寄存器及浮点/SIMD寄存器等类别。
(General-Purpose Registers, GPRs)
通用寄存器是最常用的寄存器,支持数据存储、算术运算、内存寻址及栈操作等功能。根据架构位宽(16/32/64位)扩展,以下为核心寄存器:
Visual Studio 的断点系统远不止”在代码行上点击左侧边栏”那么简单。掌握其高级功能可以彻底改变你的调试体验,让你能精准定位问题,而不是在无尽的代码执行中盲目搜索。本文将带你全面了解 Visual Studio 断点系统的各项高级功能。
条件断点允许你设置特定条件,只有满足这些条件时调试器才会暂停。
支持如下格式的表达式:
1 | // 基本条件 |
支持的内置函数如下:
nullptr 专门用于表示空指针,旨在解决传统 NULL 或 0 在类型安全性和代码清晰度上的缺陷。
nullptr 的类型为 std::nullptr_t,只能隐式转换为指针类型(包括原生指针、智能指针、托管句柄等),不能转换为整数类型,避免了与整型 0 的混淆。
而传统 NULL 是宏(通常定义为 0 或 (void*)0),可能被误解释为整数,导致类型错误。
在函数重载场景中,nullptr 可明确选择指针版本的重载函数,避免因 NULL 被解释为整数导致的错误调用:
1 | void foo(int); // 整型版本 |
而且在模板中可精确匹配指针类型,避免推导为整数:
1 | #include <iostream> |
自从接触了 JerryScript(见开源库jerryscript使用备忘),本以为再也不会用到 Lua 了,关于 Lua 的记忆已经逐渐在我的脑海中删除,但最近维护的几个老项目又都使用了 Lua,真是命运的捉弄啊。
来吧,刷新记忆!
1 | -- 行注释 |
..可以连接字符串#来获取字符串长度,某些情况下对table也适用~=,而不是!=1 | -- a为0, b为1, c为nil |
1 | if exp then |
1 | while <exp is true> do |
1 | repeat |
1 | for var=exp1, exp2, exp3 do |
1 | for i,v in ipairs(a) do |
1 | for i in pairs(a) do |