独钓寒江雪

用C++的优雅,驯服Windows的狂野

传统的进程树模型不仅是系统管理的图谱,更是安全审计与调查的关键线索。然而,通过特定的技术手段,一个进程完全可以“认贼作父”——将其父进程信息伪装成另一个合法或高权限进程,从而隐匿自己的真实起源,逃逸监控,混淆侦查视线。这不仅是攻击者用于规避检测的方法,也为防御方深入理解系统底层机制打开了另一扇窗。本文将探索这项技术在 Windows 系统下的实现原理。

阅读全文 »

在 macOS 上分发 Qt 应用,开发者常被多架构编译、代码签名、公证流程所困扰。本文基于 Qt6.9.2 实战经验,系统梳理了从编译配置到最终分发的完整路径。你将了解如何通过 CMake 管理多架构构建,使用 macdeployqt 打包依赖,配置正确的 entitlements 文件,并完成 Apple 强制要求的签名与公证。更提供自动化脚本示例,助你告别重复操作,确保应用在 Intel 和 Apple Silicon(M 芯片) 设备上均能无缝运行。这份避坑指南,将带你高效跨越 macOS 分发的最后一道门槛。

阅读全文 »

x86架构作为个人计算机和服务器领域的主流计算架构,其汇编语言是理解计算机底层运行机制、进行逆向工程、性能优化及嵌入式开发的核心基础。本文将系统梳理x86架构中的常用寄存器​和常用汇编指令​,并结合实际应用场景说明其作用。

x86常用寄存器

寄存器是CPU内部的高速存储单元,用于临时存放数据、地址或控制信息。x86寄存器按功能可分为通用寄存器、段寄存器、标志寄存器、指令指针、控制寄存器、调试寄存器及浮点/SIMD寄存器等类别。

通用寄存器

(General-Purpose Registers, GPRs)
通用寄存器是最常用的寄存器,支持数据存储、算术运算、内存寻址及栈操作等功能。根据架构位宽(16/32/64位)扩展,以下为核心寄存器:

阅读全文 »

Visual Studio 的断点系统远不止”在代码行上点击左侧边栏”那么简单。掌握其高级功能可以彻底改变你的调试体验,让你能精准定位问题,而不是在无尽的代码执行中盲目搜索。本文将带你全面了解 Visual Studio 断点系统的各项高级功能。

条件断点

条件断点允许你设置特定条件,只有满足这些条件时调试器才会暂停。

支持如下格式的表达式:

1
2
3
4
5
6
7
8
9
10
// 基本条件
i > 100
name == "admin"

// 复合条件
x > 50 && y < 20 && isValid == true

// 字符串操作(C++)
strcmp(filename, "config.xml") == 0
strlen(buffer) > 255

支持的内置函数如下:

  • strlen(str):获取字符串长度
  • strcmp(str1, str2):比较两个字符串
  • strncmp(str1, str2, n):比较前n个字符
  • strstr(haystack, needle):查找子字符串
  • GetLastError():获取系统错误代码
阅读全文 »

nullptr (C++11)

nullptr 专门用于表示空指针,旨在解决传统 NULL 或 0 在类型安全性和代码清晰度上的缺陷。

nullptr 的类型为 std::nullptr_t,只能隐式转换为指针类型(包括原生指针、智能指针、托管句柄等),​不能转换为整数类型,避免了与整型 0 的混淆。

而传统 NULL 是宏(通常定义为 0 或 (void*)0),可能被误解释为整数,导致类型错误。

在函数重载场景中,nullptr 可明确选择指针版本的重载函数,避免因 NULL 被解释为整数导致的错误调用:

1
2
3
4
void foo(int);        // 整型版本
void foo(int*); // 指针版本

foo(nullptr); // 正确调用指针版本

而且在模板中可精确匹配指针类型,避免推导为整数:

1
2
3
4
5
6
7
8
9
10
#include <iostream>

template<typename T>
void check(T ptr) {
std::cout << "ptr type: " << typeid(ptr).name() << std::endl;
}

int main() {
check(nullptr); // ptr type: std::nullptr_t
}
阅读全文 »

自从接触了 JerryScript(见开源库jerryscript使用备忘),本以为再也不会用到 Lua 了,关于 Lua 的记忆已经逐渐在我的脑海中删除,但最近维护的几个老项目又都使用了 Lua,真是命运的捉弄啊。

来吧,刷新记忆!

基础

  • Lua区分大小写
  • 注释格式
    1
    2
    3
    4
    5
    -- 行注释

    --[[
    块注释
    --]]
  • 局部变量使用local声明, 其他的全部为全局变量,变量的默认值为nil
  • 只有false和nil为假,其他的全部为真
  • Lua中字符串都是不可变的常量
  • 使用..可以连接字符串
  • Lua没有整形,都是实数
  • 可以在字符串前放置操作符#来获取字符串长度,某些情况下对table也适用
  • 关系操作符: < > == >= <=,不等于使用~=,而不是!=
  • and, or, not 逻辑操作符返回的不一定是true和false,这点与C++不同,它返回的是对应表达式的运行结果
  • 支持多重赋值
1
2
-- a为0, b为1, c为nil
a,b,c = 0,1
  • 控制结构
1
2
3
4
5
6
7
if exp then
-- something
elseif exp then
-- something
else
-- something
end
1
2
3
while <exp is true> do
-- something
end
1
2
3
repeat
-- something
until <exp is true>
1
2
3
for var=exp1, exp2, exp3 do
-- something
end
1
2
3
for i,v in ipairs(a) do
-- something
end
1
2
3
for i in pairs(a) do
-- something
end
阅读全文 »
0%