Swift逆向工程:swift函数名称规则?

我有一个关于swift函数名称规则的问题。 正如我在IDA Pro试图分析一个iOS应用程序(也许OS X是相同的情况下)写在swift,如swift-2048,我得到这样的函数名称:

EXPORT __TFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ __text:00022FAC __TFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ ... __text:00022FCC __TToFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ 

第一个和第二个函数的名字看起来很相似 只有一个区别是“TFC”和“TToFC”。 有什么不同? 我看到一些function子是不一样的:

 __text:00022FAC EXPORT __TFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ __text:00022FAC __TFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ __text:00022FAC ; DATA XREF: __objc_data:0004A51Co __text:00022FAC STMFD SP!, {R4,R7,LR} __text:00022FB0 MOV R4, R0 __text:00022FB4 MOV R0, R1 __text:00022FB8 ADD R7, SP, #4 __text:00022FBC BL _objc_release __text:00022FC0 MOV R0, R4 __text:00022FC4 LDMFD SP!, {R4,R7,LR} __text:00022FC8 B _objc_release __text:00022FC8 ; End of function __TFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ __text:00022FC8 __text:00022FCC __text:00022FCC ; =============== SUBROUTINE ======================================= __text:00022FCC __text:00022FCC __text:00022FCC __TToFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ __text:00022FCC ; DATA XREF: __objc_const:00049A28o __text:00022FCC BX LR __text:00022FCC ; End of function __TToFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ 

但其中一些非常相似:

 __text:000230B4 EXPORT __TFC10swift_204811AppDelegatecfMS0_FT_S0_ __text:000230B4 __TFC10swift_204811AppDelegatecfMS0_FT_S0_ __text:000230B4 ; DATA XREF: __objc_data:0004A530o __text:000230B4 __text:000230B4 var_10 = -0x10 __text:000230B4 var_C = -0xC __text:000230B4 __text:000230B4 STMFD SP!, {R7,LR} __text:000230B8 MOV R7, SP __text:000230BC SUB SP, SP, #8 __text:000230C0 MOV R1, #(:lower16:(__TWvdvC10swift_204811AppDelegate6windowGSqCSo8UIWindow_ - 0x230D4)) __text:000230C4 MOV R2, #0 __text:000230C8 MOVT R1, #(:upper16:(__TWvdvC10swift_204811AppDelegate6windowGSqCSo8UIWindow_ - 0x230D4)) __text:000230CC LDR R1, [PC,R1] ; __TWvdvC10swift_204811AppDelegate6windowGSqCSo8UIWindow_ __text:000230D0 STR R2, [R0,R1] __text:000230D4 STR R0, [SP,#0x10+var_10] __text:000230D8 MOV R0, #(__TMdC10swift_204811AppDelegate - 0x230E8) __text:000230E0 ADD R0, PC, R0 ; __TMdC10swift_204811AppDelegate __text:000230E4 ADD R0, R0, #8 __text:000230E8 STR R0, [SP,#0x10+var_C] __text:000230EC MOV R1, #(:lower16:(selRef_init - 0x23100)) __text:000230F0 MOV R0, SP __text:000230F4 MOVT R1, #(:upper16:(selRef_init - 0x23100)) __text:000230F8 LDR R1, [PC,R1] ; selRef_init ; "init" __text:000230FC BL _objc_msgSendSuper2 __text:00023100 MOV SP, R7 __text:00023104 LDMFD SP!, {R7,PC} __text:00023104 ; End of function __TFC10swift_204811AppDelegatecfMS0_FT_S0_ __text:00023104 __text:00023108 __text:00023108 ; =============== SUBROUTINE ======================================= __text:00023108 __text:00023108 __text:00023108 __TToFC10swift_204811AppDelegatecfMS0_FT_S0_ __text:00023108 ; DATA XREF: __objc_const:00049A64o __text:00023108 __text:00023108 var_10 = -0x10 __text:00023108 var_C = -0xC __text:00023108 __text:00023108 STMFD SP!, {R7,LR} __text:0002310C MOV R7, SP __text:00023110 SUB SP, SP, #8 __text:00023114 MOV R1, #(:lower16:(__TWvdvC10swift_204811AppDelegate6windowGSqCSo8UIWindow_ - 0x23128)) __text:00023118 MOV R2, #0 __text:0002311C MOVT R1, #(:upper16:(__TWvdvC10swift_204811AppDelegate6windowGSqCSo8UIWindow_ - 0x23128)) __text:00023120 LDR R1, [PC,R1] ; __TWvdvC10swift_204811AppDelegate6windowGSqCSo8UIWindow_ __text:00023124 STR R2, [R0,R1] __text:00023128 STR R0, [SP,#0x10+var_10] __text:0002312C MOV R0, #(__TMdC10swift_204811AppDelegate - 0x2313C) __text:00023134 ADD R0, PC, R0 ; __TMdC10swift_204811AppDelegate __text:00023138 ADD R0, R0, #8 __text:0002313C STR R0, [SP,#0x10+var_C] __text:00023140 MOV R1, #(:lower16:(selRef_init - 0x23154)) __text:00023144 MOV R0, SP __text:00023148 MOVT R1, #(:upper16:(selRef_init - 0x23154)) __text:0002314C LDR R1, [PC,R1] ; selRef_init ; "init" __text:00023150 BL _objc_msgSendSuper2 __text:00023154 MOV SP, R7 __text:00023158 LDMFD SP!, {R7,PC} __text:00023158 ; End of function __TToFC10swift_204811AppDelegatecfMS0_FT_S0_ 

Swift使用Name Mangling命名方法,类…..我遇到这篇文章 ,描述了有关swift名称的修改。 下面显示了有关修剪的部分。


名字摆弄

Swift在它们各自的符号中保存了关于函数(和更多)的元数据,这就是所谓的名称修改。 这个元数据包括函数的名称(显然),属性,模块名称,参数types,返回types等等。 以此为例:

 class Shape{ func numberOfSides() -> Int { return 5 } } 

simpleDescription方法的名称为_TFC9swifttest5Shape17simpleDescriptionfS0_FT_Si

这是细节:

  • _T – 所有Swift符号的前缀。 一切都将从此开始。

  • F – function。

  • C – 一个类的function。 (方法)

  • 9swifttest – 模块名称,带有前缀长度。

  • 5Shape – 函数所属的类名,同样具有前缀长度。

  • 17simpleDescription – 函数名称。

  • f – 函数属性。 在这种情况下,它是'f',这只是一个正常的function。 我们会在一分钟内得到。

  • S0_FT – 我不完全确定这是什么意思,但它似乎标志着参数和返回types的开始。

  • '_' – 该下划线将参数types与返回types分开。 由于函数没有参数,它直接在S0_FT之后。

  • S – 这是返回types的开始。 “S”代表Swift; 返回types是Swift内置types。 下一个字符决定了types。

  • 我 – 这是Swift内置types。 小写字母“I”代表Int。


摘自: Swift内部

看起来像实际的链接被打破,在这里找镜子

使用swift-demangle命令行工具可以看到两个函数之间的区别。

 _TToFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ ---> @objc swift_2048.AppDelegate.applicationWillResignActive (swift_2048.AppDelegate)(ObjectiveC.UIApplication) -> () _TFC10swift_204811AppDelegate27applicationWillResignActivefS0_FCSo13UIApplicationT_ ---> swift_2048.AppDelegate.applicationWillResignActive (swift_2048.AppDelegate)(ObjectiveC.UIApplication) -> () 

_T所有的swift函数的前缀,它看起来像To对应于具有@objc属性的函数。

如果你对更多的细节感兴趣的话,Evan Swick对Swift这个名字的修改过程有很好的评论。

不幸的是,我没有足够的关于swift的内部知识和objective-c运行库来告诉你每个函数的function。 我认为这是安全的,尽pipe它是快速桥接过程的目标的一部分。