iOS恢复符号表

作者: 7b33a23272c4 | 来源:发表于2018-02-01 20:05 被阅读209次

    什么是符号表?

    符号表(Symbol Table)是一种用于语言翻译器(例如编译器和解释器)中的数据结构。在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址 [1]

    在iOS中开发中,我们经常通过Xcode调试代码时,来接触到符号表。在Xcode中添加一个符号断点(Symbolic Breakpoint),我们将App启动完成时的方法添加为符号断点:-[AppDelegate application:didFinishLaunchingWithOptions:] 注意::两边不能有空格

    Add Symbolic Breakpoint 1 Add Symbolic Breakpoint 2

    如图下图,当我们启动App时,触发断点;通过调试信息来看触发断点时都调用了哪些方法,而这些方法名存储在符号表里面

    断点信息 lldb查看没有符号表的断点信息

    获取符号表偏移前的地址

    当App准备上线打生产环境的包时,编译器去掉符号表信息;所以在iOS逆向调试的时候,lldb调试中查看代码的函数调用栈时符号偏移前的地址 = 符号偏移后的地址(lldb断点地址) - ASLR偏移地址,其中 ASLR偏移地址是App启动后系统分配的内存区域的的首地址,在lldb中通过image list -o -f来获取某一进程的ASLR地址。如下图获取QQ的ASLR地址:image list -o -f | grep QQ

    获取QQ的ASLR地址

    恢复符号表

    每次lldb时通过计算器来计算符号的偏移前的地址,然后根据IDA或者Hopper来找方法名是一件很麻烦的事情;所以我们通过恢复符号表来提升我们的调试效率。

    恢复函数的符号表

    1. 克隆第三方库: git clone https://github.com/tobefuturer/restore-symbol
    2. 到库目录里: cd restore-symbol
    3. 编译成功后会在当前目录生成一个 restore-symbol 可执行文件 : make
    4. 在macOS终端运行(设置为全局命令): sudo cp ./restore-symbol /usr/local/bin
    5. cd 到砸壳去签名后文件的目录
    6. lipo -info WeChat.decrypted 查看是否是fat的文件,如果是fat的文件,那么看 7
    7. fat文件瘦身:lipo WeChat.decrypted -thin arm64 -output WeChat.decrypted.arm64
    8. 获取符号表:restore-symbol WeChat.decrypted.arm64 -o WeChat.symbol
    9. 文件 WeChat.symbol 是我们恢复符号表的文件,如果是瘦身回来的直接使用瘦身的,不用合并
    10. WeChat.app 是微信的原包文件,替换掉原先的MatchO文件:cp WeChat.symbol WeChat.app/WeChat
    11. 签名成功后走下面打包。(签名看最下面的介绍)
    12. 准备打包:mkdir Payload & cp -r WeChat.app Payload
    13. 打包成IPA文件:zip -r WeChat.ipa Payload
    14. iTool安装IPA文件,或者不用打包IPA,通过ideviceinstaller -i [ipa文件]

    如下图微信恢复符号表后的调试断点信息:br s -F '-[CMessageMgr AsyncOnAddMsg:MsgWrap:]'

    微信恢复符号表后的调试断点信息

    恢复block的符号表

    iOS中 block 是一段特殊的代码块,反汇编后再汇编语言中以sub_xxxx表示,例如:sub_10272DD3C,我们恢复block的符号表需要借助IDA和python脚本来实现

    1. Mac版IDAfn+Alt+F7打开脚本,或者menu+文件+Script file 加载https://github.com/tobefuturer/restore-symbol/blob/master/search_oc_block/ida_search_block.py这个脚本

    2. IDA控制台输出Search completed表示,恢复完成。在IDA打开文件路径有:block_symbol.json


    3. 在原先恢复函数符号表的Mach-O文件中,继续恢复Block符号表restore-symbol WeChat.symbol -o WeChat.symbol -j block_symbol.json

    4. 然后根据上面流程10重新打包安装

    恢复符号表&没有恢复对比

    恢复符号表&没有恢复对比

    Xcode调试第三方的App

    Xcode 里面调试App能够更加方便我们去查看调试信息。但是通过Xcode调试iPhone里的有个硬性的要求:App必须是通过自己的证书签名的,所以想要调试微信必须要使用自己的证书,对微信重新签名。

    调试第三方App的四个流程,注意必须选中需要调试App所在的iPhone


    调试第三方App的四个流程

    App重新签名&绕过签名

    App重新签名,是一个很麻烦的事情。 在前天签名好的App,打包成IPA后过了两天后重新安装后,日志报错:

    mobile_installation_proxy[1942] <Error>: 0x16e1bb000 handle_install: Installation failed: Error Domain=LaunchServicesError Code=0 "(null)" UserInfo={Error=ApplicationVerificationFailed, ErrorDetail=-402620394, ErrorDescription=Failed to verify code signature of /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.p5PurY/extracted/Payload/WeChat.app : 0xe8008016 (The executable was signed with invalid entitlements.)}
    

    根据上面显示:是entitlements不对,猜测:上次安装时,系统证书缓存问题,所以安装成功。但是,我们在已越狱的设备上面可以绕过这个错误,继续调试。

    1. 获取未修改过的entitlements: ldid -e WechatOri.app/WeChat
    2. 取其中的一个xml ,写入文件: vim Entitlements.plist
    3. Entitlements.plist 内容:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
        <dict>
            <key>com.apple.developer.team-identifier</key>
            <string>88L2Q4487U</string>
    
            <key>com.apple.developer.healthkit</key>
            <true/>
    
            <key>com.apple.developer.networking.networkextension</key>
            <array>
                <string>packet-tunnel-provider</string>
                <string>app-proxy-provider</string>
                <string>content-filter-provider</string>
            </array>
    
            <key>com.apple.developer.networking.HotspotHelper</key>
            <true/>
    
            <key>application-identifier</key>
            <string>532LCLCWL8.com.tencent.xin</string>
    
            <key>aps-environment</key>
            <string>production</string>
    
            <key>com.apple.developer.associated-domains</key>
            <array>
                <string>applinks:help.wechat.com</string>
            </array>
    
            <key>com.apple.security.application-groups</key>
            <array>
                <string>group.com.tencent.xin</string>
            </array>
    
        </dict>
    </plist>
    
    1. 开始签名: codesign -f -s "iPhone Developer: xxxxx" --entitlement Entitlements.plist ./Payload/WeChat.app/WeChat
    2. 打包安装
    3. 如果安装失败,ssh到越狱设备,获取bundle路径: ps -e | grep WeChat
    4. 删除iphone原先的微信Mach-O: rm /var/containers/Bundle/Application/D0FA1648-B7EA-45BA-9A9C-B02EA9F4A7D1/WeChat.app/WeChat
    5. scp拷贝电脑上面重新签名后的Mach-O文件:scp -P 2222 ./Payload/WeChat.app/WeChat root@localhost:/var/containers/Bundle/Application/D0FA1648-B7EA-45BA-9A9C-B02EA9F4A7D1/WeChat.app/WeChat
    6. 注意:必须是重新签名后的Mach-O文件,直接scp恢复符号表的文件会闪退哦

    相关文章

      网友评论

      • 不要动自己人:mach-o中的symbol table 和文中的 符号表是什么关系,怎么理解
        7b33a23272c4:@不要动自己人 1. Symbol Table 对应的是:Value: 符号(方法) 和 offset: 在mach-o文件中的偏移地址的对应关系
        2. 内存地址 = 偏移地址 + 基地址(app启动后系统分配的地址)
        不要动自己人:@LeavesLife
        请教一下,在mach-o文件中 Symbol Table 是用来做什么用来做什么的?是用来建立“符号”与“符号对应的实体”者两者的对应关系的一个表吗?
        例如:
        符号“-[Cat sleep]” 对应的“sleep 方法的实现地址”
        符号“_OBJC_CLASS_$_Cat" 对应"Cat 类的内存地址(objc_class 结构体地址)"
        7b33a23272c4:@不要动自己人 同一个东西
      • 64c7a2d8969e:Mach-O 文件已经有 Symbol table 段了,为什么还要进行恢复呢?跪求解疑
        7b33a23272c4:@不要动自己人 看文章中的恢复和没有恢复的对比图片
      • 小凡凡520:老铁 膨胀了

      本文标题:iOS恢复符号表

      本文链接:https://www.haomeiwen.com/subject/qfbdzxtx.html