iOS瘦身之__Text段移动

之前看过头条的一篇文章,移动Text段来瘦身,主要的原理是因为苹果会对APP加壳,加壳的话会是加到`Text段,将数据从__Text段`,移动到我们所创建的段,并赋予可读可写权限,那么就可以达到瘦身的效果。

  • Data 部分中有 5 个 Segment,依次是:

    • __PAGEZERO
    • __TEXT
    • __DATA_CONST
    • __DATA
    • __LINKEDIT
  • __PAGEZERO__LINKEDIT外,每个段中有多个 Section
  • TEXT、DATA_CONST、__DATA 用于保存程序的代码指令和数据。

  • __LINKEDIT 包含启动 App 需要的信息,比如 bind & rebase 的地址,代码签名,符号表等。

核心但是就是在Build SettingsOther Linker Flags中添加

  1. -Wl,-rename_section,__TEXT,__text,__BD_TEXT,__text
  2. -Wl,-segprot,__BD_TEXT,rx,rx

其中 -Wl 的作用是告诉 Xcode 它后面的参数是添加给Ld链接器的,这些参数将在链接阶段生效

第一行参数会新创建一个 BD_TEXT段,并把TEXT移动到BD_TEXT

第二行参数是给 __BD_TEXT 赋予可读和可执行权限。

可以看到 TEXT 已经被移动到了 __BD_TEXT 中去了
它的地址也由起始的 0x100005e5c 变为了 0x100010000

此时程序仍可以正常的运行,这是因为操作系统只关心段的读/写/执行权限,并不关心段或节的名称。即便是使用了 -rename_p 移动 Segment/Section,各符号的地址也会由链接器修正好,因此段移动后程序也可以正常运行。

我们打开MachO查看两个包可以看到

image.png

新增加了Section64(__BD_TEXT,__text)

打开__Text我们来看一下,发现__text段的确被移动了
image.png


文章标签:

原文连接:https://juejin.cn/post/7055161362015584269

相关推荐

Taro框架完美使用Axios

看完这篇,你也可以搞定有趣的动态曲线绘制

Codable保姆级攻略

iOS CarPlay|使用 CarPlay 为你的 App 提速

零基础教你Unity集成IOS原生本地推送

StoreKit2 实际接入时候的踩坑与解决实录

iOS:runloop 运行循环

第四届青训营阅读打卡活动来啦,奖品、规则全面升级,快来学习吧

支持SwiftUI!Swift版图片&视频浏览器-JFHeroBrowser上线啦

用 JavaScript 复原何同学B站头图、对前端构建工具的一些理解、弹幕的常规设计与实现 丨酱酱的下午茶第31期

现今 Swift 包中的二进制目标

[Android开发学iOS系列] 语言篇: Swift vs Kotlin

LeetCode - #125 验证回文串

通过Vue自定义指令实现前端埋点,我不写单元测试,被批了,利用噪声构建美妙的 CS,Kotlin协程-CoroutineScope丨酱酱的下午茶第30期

iOS 数据存储

iOS怎么用代码实现这样奇怪的动画

利用 UIScrollView 实现六棱柱图片浏览效果

iOS中为什么会有这么多锁呢?

免费ios开发流程和步骤教程

[LD]iOS二进制组件化与Protocol的潜在风险