12.去符号与恢复符号

一、去符号

我们在做逆向的时候,App的符号都被去掉了,所以我们需要对符号进行符号恢复。 去符号会使应用包更小。

动态库:保留全局符号

1.1 设置去符号的类型

1
  • Deployment Postprocessing

    • YES: 编译也去符号

    • NO: 只在打包时去符号

  • Strip Style

    • All Symbols

      • 所有符号

    • Non-Global Symbols

      • 除了全局符号

    • Debugging Symbols

      • 调试符号

1.2 去符号前后的MachO

a.去符号之前

0

b.去符号之后

1
1

只剩下间接符号一个全局一个本地

1.3 函数的实现地址

1
  • 这里是函数的实现地址

    • 间接符号的地址这里全是0,调用的时候会先去找桩

  • 去符号之前可以看到全局符和本地符号的地址

二、符号类型

3.1 全局符号

我们定义的基本都是全集符号

3.2 本地符号

static 是本地符号

3.3 命令查看类型

objdump --macho -t 你的macho文件名

  • l

    • 本地符号

  • g

    • 全局符号

三、恢复符号表的线索

虽然符号表中没有了符号,但是在MachO中的类的方法列表中还是有的!

3.1 类名

TEXT__objc_classname中:

3.2 方法名

TEXT__objc_methname中:

四、符号表恢复

4.1 脚本

GitHub: restore-symbol

  • 将MachO文件放入目录中

  • 执行脚本./restore-symbol MachO文件名 -o MachO输出文件名

  • 在用MachOView查看符号表,发现在后面已经恢复了!

    • 严谨的说是添加了符号

    • 由于是基于Runtime的,动态派发的可以恢复。

  • 对比发现文件大小也增大了

1

Last updated

Was this helpful?