DLKit

一个面向下标的接口,用于访问动态链接器维护的符号表。

DLKit 旨在成为一个“Swifty”风格的封装,将从各种手册页和系统头文件中收集的动态链接器 API 封装起来。加载的镜像(主可执行文件或框架)会被封装在 ImageSymbols 类中,您可以使用它来查找符号,或者查找小于或等于某个指针的地址处的符号以及它所封装的镜像。ImageSymbols 实例也可以在循环中迭代,以查找该镜像中的所有符号定义。可以将它们视为将镜像/目标文件表示为双向字典。

一些 ImageSymbols 子类代表镜像组,例如 DLKit.allImages 代表应用程序中加载的所有镜像,或者 DLKit.appImages 代表过滤后的镜像列表,仅包含应用程序包中的镜像。

要查找符号,请使用 allImages 伪镜像

if let pointer = DLKit.allImages["main"] {

或者,您可以找到某个地址的符号和封装的镜像

if let (name, image) = DLKit.allImages[pointer] else {

存在一个 UnsafePointer<CChar> 的类型别名 ImageSymbols.SymbolName,以及一个对此类型别名的扩展,可以将 Swift 符号 "demangle" 为 Swift 语言表示的符号。 还有一个 image 的方法mangle,如果符号在该 image 中定义或引用,则可以将此表示“重新 mangle”为符号名称。

let swift = name.demangled
let name = image.mangle(swift: swift)

下标运算符是可设置的,您还可以通过将其分配给指向新的实现来在应用程序中“重新绑定”或“插入”一个符号

DLKit.appImages["function_name"] = new_implementation

如果应用程序已使用 “Other Linker Flags” -Xlinker -interposable 链接,并且使用 Facebook 的 fishhook 重新绑定间接符号,则此“重新绑定”可以在框架边界之间或应用程序内部工作。

$Date: 2024/04/03 $