【问题标题】:Swift reverse engineering:swift function name rule?Swift 逆向工程:swift 函数命名规则?
【发布时间】:2014-08-08 15:30:08
【问题描述】:

我有一个关于 swift 函数名称规则的问题。当我尝试在 IDA Pro 中分析一个用 swift 编写的 iOS 应用程序(可能 OS X 也是如此)时,例如 swift-2048,我得到了这样的函数名称:

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

第一个和第二个函数名称看起来非常相似。只有一个区别是“TFC”和“TToFC”。有什么不同?我看到一些函数 sub 是不同的:

__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 ; =============== S U B R O U T I N E =======================================
__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 ; =============== S U B R O U T I N E =======================================
__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_

【问题讨论】:

  • 您是否也注意到其他函数上的这种行为?

标签: ios swift reverse-engineering


【解决方案1】:

Swift 使用Name Mangling 来命名方法、类.....我遇到了这个article,它描述了 swift 名称修改。关于 mangling 的部分如下所示。


名称修改

Swift 将有关函数(以及更多)的元数据保存在它们各自的符号中,这称为名称修饰。此元数据包括函数的名称(显然)、属性、模块名称、参数类型、返回类型等。以此为例:

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

simpleDescription 方法的错误名称是_TFC9swifttest5Shape17simpleDescriptionfS0_FT_Si

这是细分:

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

  • F – 功能。

  • C – 类的功能。 (方法)

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

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

  • 17simpleDescription – 函数名称。

  • f – 函数属性。在这种情况下,它是“f”,它只是一个 正常功能。我们马上就会讲到。

  • S0_FT – 我不确定这意味着什么,但它似乎标志着 参数和返回类型的开始。

  • ‘_’ – 此下划线将参数类型与返回值分开 类型。由于该函数不带参数,因此它直接出现在 S0_FT。

  • S – 这是返回类型的开始。 “S”代表 迅速;返回类型是 Swift 内置类型。下一个字符 确定类型。

  • i – 这是 Swift 内置类型。小写的“I”,代表 诠释。


摘自:Inside Swift

实际链接好像坏了,找镜像here

【讨论】:

  • 这并不能解释为什么函数名称不同。
  • 谢谢,但还有一个关于函数名称的问题。
  • @Anil 不幸的是,“Inside Swift”链接已关闭。有镜子吗?
  • @vArDo 看起来实际链接已损坏。在这里找到镜子cnblogs.com/Proteas/p/3782638.html
【解决方案2】:

使用 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 属性的函数。

不幸的是,我对 swift 的内部结构和 Objective-c 运行时没有足够的了解,无法告诉您这些函数的作用。我认为可以安全地假设它是 Objective-c 到 Swift 桥接过程的一部分。

【讨论】:

    猜你喜欢
    • 2020-07-29
    • 2014-09-29
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2016-07-25
    • 2012-03-12
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多