目录

1. 前言   1.1

2. 恢复符号表概述   1.2

3. 什么是符号表   1.3

4. 恢复符号表前后对比   1.4

5. 如何恢复符号表   1.5

1. 原版restore-symbol   1.5.1

2. crifan版restore-symbol   1.5.2

6. 常见问题   1.6

1. Address not found in the image   1.6.1

7. 附录   1.7

1. 参考资料   1.7.1

iOS逆向分析：恢复符号表

- 最新版本： v0.5

- 更新时间： 20240507

简介

介绍关于iOS逆向期间的，恢复符号表相关的各种内容。

源码+浏览+下载

本书的各种源码、在线浏览地址、多种格式文件下载如下：

HonKit源码

- crifan/ios_re_restore_symbol: iOS逆向分析：恢复符号表

如何使用此HonKit源码去生成发布为电子书

详见：crifan/honkit_template: demo how to use crifan honkit template and demo

在线浏览

- iOS逆向分析：恢复符号表 book.crifan.org

- iOS逆向分析：恢复符号表 crifan.github.io

离线下载阅读

- iOS逆向分析：恢复符号表 PDF

- iOS逆向分析：恢复符号表 ePub

- iOS逆向分析：恢复符号表 Mobi

版权和用途说明

此电子书教程的全部内容，如无特别说明，均为本人原创。其中部分内容参考自网络，均已备注了出处。如发现有侵权，请通过邮箱联系我  admin 艾特 crifan.com ，我会尽快删除。谢谢合作。

各种技术类教程，仅作为学习和研究使用。请勿用于任何非法用途。如有非法用途，均与本人无关。

鸣谢

感谢我的老婆陈雪的包容理解和悉心照料，才使得我 crifan 有更多精力去专注技术专研和整理归纳出这些电子书和技术教程，特此鸣谢。

其他

作者的其他电子书

本人 crifan 还写了其他 150+ 本电子书教程，感兴趣可移步至：

crifan/crifan_ebook_readme: Crifan的电子书的使用说明

关于作者

关于作者更多介绍，详见：

关于CrifanLi李茂 – 在路上

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-05-29 22:07:14

恢复符号表概述

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-03 17:53:45

什么是符号表

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-03 17:53:45

恢复符号表前后对比

恢复符号表之前

- 效果

- Xcode调试iOS程序 -》 查看函数调用堆栈 -》只能看到无名函数或错误的函数名 -》 无法看到期望的（ObjC等）函数名

- Xcode给iOS的ObjC函数加断点 -》 通过（ObjC的）函数名加断点，加不上

恢复符号表之后

- 效果

- Xcode调试iOS程序 -》 查看函数调用堆栈 -》就能看到函数名了

- Xcode给iOS的ObjC函数加断点 -》断点就能加上了

- 举例

- WhatsApp

- -[WARootViewController updateOfflineAssignABProperties]

用工具辅助验证

且可以用其他工具辅助验证：的确加上了函数名=符号表了：

- MachOView

- Dynamic Symbol Table -> Indirect Symbols

- 之前=没有恢复符号表： AwemeCore_noSymbol 、 AwemeCore_restoredSymbol

- 之后=已恢复符号表： AwemeCore_restoredSymbol_HeiTanBc

- IDA

- 之后=已恢复符号表： AwemeCore_restoredSymbol_HeiTanBc

- (Xcode中)lldb

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-04 09:59:08

如何恢复符号表

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-03 17:53:45

原版restore-symbol

此处所说的原始版本的 restore-symbol ，是相对于我自己修改的版本来说的。

而演示版本的 restore-symbol ，又分几个版本：

- 最原始版本：  tobefuturer 的 restore-symbol

- https://github.com/tobefuturer/restore-symbol

- 改进版本： HeiTanBc 的 restore-symbol

- https://github.com/HeiTanBc/restore-symbol

但是总体用法是一样的，下面以 HeiTanBc 版本的 restore-symbol 为例，来说明如何使用：

准备

下载、编译、确认：

git clone --recursive https://github.com/HeiTanBc/restore-symbol.git

cd restore-symbol

make

./restore-symbol

用restore-symbol恢复ObjC符号表

下面举例说明：

AwemeCore

➜  AwemeCore.framework /Users/crifan/dev/DevSrc/iOS/restore-symbol/HeiTanBc/restore-symbol/restore-symbol AwemeCore_noSymbol -o AwemeCore_restoredSymbol_HeiTanBc

=========== Start =============

Scan OC method in mach-o-file.

Scan OC method finish.

restore 329610 symbols

=========== Finish ============

Aweme

➜  Aweme.app /Users/crifan/dev/DevSrc/iOS/restore-symbol/HeiTanBc/restore-symbol/restore-symbol Aweme_noSymbol -o Aweme_restoredSymbol_HeiTanBc

=========== Start =============

Scan OC method in mach-o-file.

Scan OC method finish.

restore 0 symbols

=========== Finish ============

注：此处0个symbol，说明：没有可用符号。

WhatsApp

➜  WhatsApp.app git:(main) ✗ /Users/crifan/dev/dev_src/ios_reverse/symbol/restore-symbol/HeiTanBc/restore-symbol/restore-symbol WhatsApp -o WhatsApp_restoredSymbol_HeiTanBc

=========== Start =============

2023-10-26 17:20:10.440 restore-symbol[16809:360862686] Unknown load command: 0x00000032

Scan OC method in mach-o-file.

2023-10-26 17:20:10.539 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s15UILibraryShared23PTTTranscriptionManagerCN (addr 10345a998)

2023-10-26 17:20:10.541 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s5WAOTP12CopyCodeBaseCN (addr 10345f418)

2023-10-26 17:20:10.544 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core13DeviceManagerCN (addr 10346a1c0)

2023-10-26 17:20:10.545 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core21MessageEditDataSourceCN (addr 10346e370)

2023-10-26 17:20:10.550 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core21MessagingDataProviderCN (addr 10347c0b0)

2023-10-26 17:20:10.561 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core17MessageDataSourceCN (addr 1034922a8)

2023-10-26 17:20:10.561 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core24StatusThumbnailProcessorCN (addr 103492500)

2023-10-26 17:20:10.561 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core20MessagePinDataSourceCN (addr 103492618)

2023-10-26 17:20:10.565 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core18ReactionDataSourceCN (addr 103497ef0)

2023-10-26 17:20:10.566 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core20KeepInChatDataSourceCN (addr 1034998e0)

2023-10-26 17:20:10.567 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core28NewsletterReactionDataSourceCN (addr 10349acb0)

2023-10-26 17:20:10.573 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s4Core27ScheduledCallEditDataSourceCN (addr 1034a2568)

2023-10-26 17:20:10.578 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s25WAPaymentsTransactionBase20PaymentStanzaBuilderCN (addr 10364b0b8)

2023-10-26 17:20:10.589 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s25WAPaymentsTransactionBase20PaymentStanzaBuilderCN (addr 10364b0b8)

2023-10-26 17:20:10.596 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s15UILibraryShared13TextFieldCellCN (addr 1034fe858)

2023-10-26 17:20:10.597 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s25WAPaymentsTransactionBase20PaymentStanzaElementCN (addr 103503180)

2023-10-26 17:20:10.597 restore-symbol[16809:360862686] Warning: Unknown prefix on symbol name... _$s25WAPaymentsTransactionBase20PaymentStanzaBuilderCN (addr 10365ce38)

...

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, botEncryptionRequest

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, primaryEncryptionRequest

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, Log

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, signalManager

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, result

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, sessionId

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, keychainWrapper

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, credentialQueue

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, cachedUser

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, repository

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, credentialStore

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, userJid

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, logger

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, fetchPromise

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, log

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, fileHandle

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, mapPointer

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, size

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, nameFieldLength

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, lengthFieldLength

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, parameters

2023-10-26 17:20:11.511 restore-symbol[16809:360862686] Warning: Parsing instance variable type failed, query

Scan OC method finish.

=========== Finish ============

➜  WhatsApp.app git:(main) ✗

MusicallyCore

crifan@licrifandeMacBook-Pro  ~/dev/dev_src/ios_reverse/symbol/restore-symbol/HeiTanBc/restore-symbol   master  ./restore-symbol /Users/crifan/dev/dev_root/iosReverse/tiktok/ipa/Payload/TikTok.app/Frameworks/MusicallyCore.framework/MusicallyCore -o /Users/crifan/dev/dev_root/iosReverse/tiktok/ipa/Payload/TikTok.app/Frameworks/MusicallyCore.framework/MusicallyCore_addSymbol

=========== Start =============

Scan OC method in mach-o-file.

Scan OC method finish.

restore 261142 symbols

=========== Finish ============

RzGame

✘ crifan@licrifandeMacBook-Pro  ~/dev/dev_src/ios_reverse/symbol/restore-symbol/HeiTanBc/restore-symbol   master ●  ./restore-symbol /Users/crifan/dev/dev_root/iosReverse/undecember/ipa/Payload/RzGame.app/RzGame -o /Users/crifan/dev/dev_root/iosReverse/undecember/ipa/Payload/RzGame.app/RzGame_addSymbol

=========== Start =============

Scan OC method in mach-o-file.

Scan OC method finish.

restore 28136 symbols

=========== Finish ============

导出Block符号表

用restore-symbol去恢复=导出，ObjC的符号表后，对于更加完整的用法，则还可以继续去导出block符号表

需要借用相关的工具： ida_search_block.py 的IDA插件

ida_search_block.py的版本

而关于 ida_search_block.py 的文件，此处代码仓库中是有的：

- https://github.com/HeiTanBc/restore-symbol/blob/master/search_oc_block/ida_search_block.py

但该版本有些bug，而我Crifan修改后的：修复该bug+额外优化后的最新版本是：

- https://github.com/crifan/restore-symbol/blob/master/tools/IDAScripts/search_oc_block/ida_search_block.py

举例

此处举例说明如何使用：

MusicallyCore

最后会输出：

...

Result file: ./block_symbol.json

restore block num 1530

origin  block num: 49422(GlobalBlock: 10, StackBlock: 49412)

对应的输出文件：

- /Users/crifan/dev/dev_root/iosReverse/tiktok/ipa/Payload/TikTok.app/Frameworks/MusicallyCore.framework/block_symbol.json

[

{

"address": "0x5F4000C",

"name": "-[UIView makeToastActivity:]_block"

},

{

"address": "0xD900034",

"name": "+[APMAnalytics logEventWithOrigin:isPublicEvent:name:parameters:]_block_block"

},

{

"address": "0xBE4005C",

"name": "-[UITableView fd_reloadRowsAtIndexPaths:withRowAnimation:]_block_block"

},

{

"address": "0x5F40120",

"name": "-[UIView hideToastActivity]_block"

},

{

"address": "0x5F40130",

"name": "-[UIView hideToastActivity]_block"

},

{

"address": "0xD9001BC",

"name": "+[APMAnalytics logEventWithOrigin:isPublicEvent:name:parameters:timestamp:ignoreEnabled:ignoreInterceptor:]_block"

},

{

"address": "0x9F00278",

"name": "-[NSObject validatedArraryOfStrings]_0_block"

},

...

{

"address": "0xA2BF6E4",

"name": "-[UIScrollView dzn_reloadEmptyDataSet]_block"

},

{

"address": "0x463F778",

"name": "-[AppsFlyerLib callServerWithEventName:eventValues:options:completion:]_block_block"

},

{

"address": "0xBE3F7B8",

"name": "-[UITableView fd_insertRowsAtIndexPaths:withRowAnimation:]_block"

},

{

"address": "0x463F7F0",

"name": "-[AppsFlyerLib callServerWithEventName:eventValues:options:completion:]_block"

},

{

"address": "0xBE3F878",

"name": "-[UITableView fd_insertRowsAtIndexPaths:withRowAnimation:]_block_block"

},

{

"address": "0xBE3FB20",

"name": "-[UITableView fd_deleteRowsAtIndexPaths:withRowAnimation:]_block"

},

{

"address": "0x74FFBA4",

"name": "-[UIImageView p_loadImageURLs:placeholder:options:isReloadURL:size:userID:hitImageInCache:enabledOptimisation:enableDemotionImage:completion:]_block"

},

{

"address": "0xBE3FC7C",

"name": "-[UITableView fd_deleteRowsAtIndexPaths:withRowAnimation:]_block"

},

{

"address": "0xBE3FD6C",

"name": "-[UITableView fd_deleteRowsAtIndexPaths:withRowAnimation:]_block_block"

},

{

"address": "0xD8FFEB8",

"name": "+[APMAnalytics logInternalEventWithOrigin:name:timestamp:parameters:]_block"

},

{

"address": "0xD8FFF30",

"name": "+[APMAnalytics logEventWithOrigin:isPublicEvent:name:parameters:]_block"

},

{

"address": "0xBE3FF9C",

"name": "-[UITableView fd_reloadRowsAtIndexPaths:withRowAnimation:]_block"

}

]

用restore-symbol恢复ObjC+block符号表

此处，想要一次性恢复ObjC和Block的符号表，则用 -j 参数即可

举例说明：

YouTube

/Users/crifan/dev/DevSrc/iOS/symbol/restore-symbol/HeiTanBc/restore-symbol/restore-symbol YouTube -o YouTube_objcBlockSymbol -j

block_symbol.json

Module_Framework

/Users/crifan/dev/DevSrc/iOS/symbol/restore-symbol/HeiTanBc/restore-symbol/restore-symbol Module_Framework -o Module_Framework_objcBlockSymbol -j block_symbol.json

RzGame

cd ~/dev/dev_root/iosReverse/undecember/ipa/Payload/RzGame.app

✘ crifan@licrifandeMacBook-Pro  ~/dev/dev_root/iosReverse/undecember/ipa/Payload/RzGame.app  /Users/crifan/dev/dev_src/ios_reverse/symbol/restore-symbol/HeiTanBc/restore-symbol/restore-symbol RzGame_addSymbol -o RzGame_addedAllSymbol -j block_symbol.json

=========== Start =============

Scan OC method in mach-o-file.

Scan OC method finish.

restore 28136 symbols

Parse symbols in json file.

Parse finish.

=========== Finish ============

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-05-07 09:53:36

crifan版restore-symbol

用crifan版restore-symbol恢复符号表：

- 核心步骤

- 用IDA脚本（exportIDASymbol.py）从IDA中导出符号表

- 导出之前

- 优化变量名=符号名称

- 自动

- 用crifan的IDA脚本AutoRename，自动优化函数名=符号名

- 手动

- 经过（静态或动态）分析代码逻辑后，给函数名等重新命名，优化函数名=符号名称

- 用crifan版restore-symbol去恢复符号表（导入符号表）

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-04 10:01:39

常见问题

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-03 17:53:45

Address not found in the image

- 现象

去用：

/Users/crifan/dev/DevSrc/iOS/symbol/restore-symbol/HeiTanBc/restore-symbol/restore-symbol YouTube -o YouTube_objcBlockSymbol -j

block_symbol.json

去恢复Block符号表，但报错：

2022-04-20 20:35:09.565 restore-symbol[17780:328585] Address(100eaf5a8) not found in the image

- 原因

block的符号表的输入文件中，包含无效的地址的条目

{

"name": "-[YTYouTubeUserDefaultsKeysProvider userSpecificSettingKeys]_block",

"address": "0x100EAF5A8"

},

其中的： 0x100EAF5A8 无法识别

解决办法：

删除这个条目，另存为新的json文件，（比如 block_symbol_removedInvalid.json ）再重新执行

/Users/crifan/dev/DevSrc/iOS/symbol/restore-symbol/HeiTanBc/restore-symbol/restore-symbol YouTube -o YouTube_objcBlockSymbol -j block_symbol_removedInvalid.json

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-05-07 09:12:52

附录

下面列出相关参考资料。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-03 17:51:12

参考资料

- 【未解决】iOS逆向WhatsApp：+[WAURLQueryItem queryItemWithName:value:]

- 【未解决】iOS逆向WhatsApp：SharedModules中的函数加不上如何加上断点且确保能触发

- 【整理】抖音AwemeCore恢复符号表的效果举例

- 【记录】用MachOView对比AwemeCore恢复符号表前后的Symbol变化

- 【记录】用IDA分析加了符号表的抖音AwemeCore二进制

- 【整理】抖音AwemeCore恢复符号表的效果举例

- 【已解决】抖音AwemeCore恢复符号表后导致部分函数显示错乱

- 【已解决】Xcode的lldb调试恢复符号表后的抖音AwemeCore

- 【已解决】restore-symbol给抖音AwemeCore恢复符号表无效

- 【已解决】restore-symbol恢复YouTube的Block符号表报错：Address not found in the image

- 【已解决】用HeiTanBc的restore-symbol去给抖音AwemeCore恢复符号表

- 【已解决】新旧版本HeiTanBc/restore-symbol有何区别和不同

- 【记录】完全用官网版本的HeiTanBc/restore-symbol去给WhatsApp恢复符号表

- 【已解决】iOS逆向WhatsApp：给WhatsApp的普通ObjC函数去恢复符号表

- 【未解决】用restore-symbol给TikTok恢复符号表

- 【未解决】给Tiktok的Block去恢复符号表

- 【已解决】给YouTube恢复符号表方便Xcode调试

- 【未解决】iOS逆向Apple账号：给iOS 15.1的CFNetwork恢复符号表

- 【未解决】iOS逆向AppleStore：恢复符号表

- 【已解决】iOS逆向游戏Undecember：恢复符号表

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-05-07 09:50:58

Table of Contents

前言

恢复符号表概述

什么是符号表

恢复符号表前后对比

如何恢复符号表

原版restore-symbol

crifan版restore-symbol

常见问题

Address not found in the image

附录

参考资料