概述
在对Swift反向工程没有任何经验的情况下, 我将在这篇文章中开始我的个人探索,也许你们也可以和我一起,深入Swift语言的内部,将其拆解,弄清楚它的构造.
Swift对象
我创建了一个简单的Swift iOS应用程序来进行我们的研究.
class myClass {
var var1 : String
var var2 : Int
init(var1: String, var2 : Int) {
self.var1 = var1 self.var2 = var2 }}class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let mc = myClass(var1: "rotlogix", var2: 100)
print(mc.var1);
print(mc.var2);
正如你所看到的,这里有一个非常简单的类—— myClass,以及两个实例变量var1、var2。我们将这个类初始化,并且输出实例变量的值。
在谷歌进行了一些浏览后,我发现下面的文章对Swift的对象进行了分解。
在__objc_classlist这一片段内部,一个Mach-O二进制的__DATA部分内就是二进制里的每一个类的条目。使用otool和下面的命令后,我们就可以很容易地观察到这种结构,命令如下:
otool -s __DATA __objc_classlist <Target_Executable>
-s表示我们想要丢弃一段二进制
__DATA是目标段
__objc_classlist是目标部分
这并不是很有帮助,而我们可能会想要了解更多关于类条目的东西。那么,让我们用Hopper在这个过程中帮助我们。
__objc_classlist结构的内部有三个条目,并且我们可以看到,第一项似乎和我们的类很像。
__TtC17SwiftClassExample7myClass
识别解码
这里我们看到的是Swift用来存储对象的元数据的方式,其被称为“识别编码”。让我们手动对这个对象进行“识别解码”:
T是所有Swift符号的前缀
t可能与一个种类有关(如果我错了,请纠正我)
类型种类
Swiftexample是对模块名称的描述
myclass是对类名称的描述
现在,当我们试图理解__objc_classlist内的条目时,可以选择手动执行 “识别解码”的步骤,或者使用一个叫做Swift-demangle的附带Xcode的REPL工具。
xcrun swift-demangle --compact _TtC17SwiftClassExample7myClass SwiftClassExample.myClass
Swift-demangle的输出将会以在我们的源代码中被定义的方式,给我们提供确切的对类的表示。Hopper也将会显示objc数据部分内的对象的确切信息:
这给我们提供了两个不同并且有效的自动“识别解码" Swift对象的方式。
结论
希望这能为大家在对Swift对象结构和内部进行静态分析时提供一些帮助。
还没有评论,来说两句吧...