逆向修改 macOS Alt+Tab 行为 && 编写沙箱注入器

众所周知 macOS 默认的 Alt/Command+Tab 行为十分智障,已经被吐槽好些年了,有些 APP 没有打开窗口,依然会显示在切换列表中,切换过去的时候什么也不会发生。

虽然有很多第三方软件能解决这个问题,但它们通常是自行实现了切换器,原有系统功能并没有得到改善。我更倾向于使用系统自带的工具。

我预期的行为是 Alt/Command+Tab 列表中应该只显示有窗口存在的 APP,并且每个工作区应该仅持有当前工作区 APP 的列表,我不喜欢 Alt/Command+Tab 切换 APP 会切换到其它工作区以及 “无事发生” 的行为。

系统版本: macOS 26.1 (25B78)

这篇文章记录修改过程。

主要是两个功能:

  1. 从切换列表中剔除所有没有可见窗口的 App。

  2. 各工作区独立管理自己的 App 切换列表,不会再跳到其他工作区。

LuckySpeeder-解

这篇文章记录 LuckySpeeder 的开发过程,是如何在非越狱的 iOS 中实现的。

这篇文章需要懂一些 ARM64架构、Mach-O 文件格式、调试器、链接器、内存、UI渲染逻辑、UI层级设计等诸如此类各种乱七八糟的知识。

编写一个通用指针搜索器(2)

!!!注意,这篇文章中提到的性能优化方式基本仅适用于指针链扫描,不适用其它业务。

!!!这篇文章并不是接着上一篇文章写的,但有很多关联,不过很多代码,逻辑,已经发生变化。

编写一个通用指针搜索器(1)

什么是指针搜索

ASLR导致程序内存地址在启动程序时始终不同。所谓的“静态”地址是相对于程序代码(BinaryFile)的地址。有了静态地址,一旦找到它,你就可以稳定计算出这个地址,因为加载程序(BinaryFile)的地址很容易找到。不幸的是,并非所有感兴趣的内存都是“静态的”,因为这些要么需要代码黑客(通常称为ASM HACK),要么需要指针链(找到此链的过程通常被称为指针搜索)。

Go-Rust 编译器优化对比

Go

release模式 编译为x86-64

我不知道Go除了使用 go build file.go 是否还有其它命令才能真正编译为release模式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func setBit1(reg *uint32, value uint16) {
	for i := 0; i <= 15; i++ {
		bitToSet := ((value >> i) & 1) != 0
		*reg &= ^(1 << (i + 5))
		if bitToSet {
			*reg |= 1 << (i + 5)
		} else {
			*reg &= ^(1 << (i + 5))
		}
	}
}

它生成的汇编是什么样的呢?