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 重新绑定间接符号,则此“重新绑定”可以在框架边界之间或应用程序内部工作。