【问题标题】:ios architecture versions - same codeios 架构版本 - 相同的代码
【发布时间】:2017-11-16 16:50:04
【问题描述】:

不同的 iOS 架构二进制文件是否具有相同的整体代码,或者它们可以不同。

如果我要检查这些二进制文件中的某些内容,例如 PIE、ARC 或字符串(如 memcpy 等)。我是否需要检查两个精简二进制文件中的相同内容,或者它们是否相同,只是内存地址不同?

例如a fat binary consisting of armv7 and arm64, if the armv7 binary has PIE enabled, so will the arm64?

if the armv7 binary uses strcpy, the arm64 binary will also use strcpy?

进一步澄清的示例:两个二进制文件包含相同的发现,这意味着在 TLDR 中如下所示?相同的代码,只是每个架构的编译方式不同。

armv7
0x001e7e44   665 _memcpy
0x001e7ea4   770 _strlen
0x001e7eac   772 _strncpy
0x001e85b4   665 _memcpy

arm64
0x00000001001be7f0   645 _memcpy
0x00000001001be904   746 _strlen
0x00000001001be91c   748 _strncpy
0x0000000100220f18   645 _memcpy

TLDR; 2 个 iOS 二进制文件是相同的代码,只是根据架构不同编译不同吗?

【问题讨论】:

    标签: ios binaryfiles arm64 armv7


    【解决方案1】:

    胖二进制文件包含多个独立的 Mach-O 文件,它们根本不需要有任何共同点。

    当只为一个平台编译二进制文件时,这一事实几乎不明显,但在构建跨平台二进制文件时(对于一些研究工具来说很常见,可以同时在 macOS 和越狱的 iDevices 上运行),实际上没有任何办法可以做到这一点手动:

    gcc -o program.macos program.c
    xcrun -sdk iphoneos gcc -arch armv7 -arch arm64 -o program.ios program.c
    lipo -create -output program program.macos program.ios
    

    现在,通常胖 Mach-O 的多个切片包含为不同架构编译的相同代码库 - 毕竟,这是预期用途。但是,这不是要求,您可以staple entirely different object files together (免责声明:由我回答)。但正如我在那篇文章中所写的那样,这样做的用处非常有限,因为您无法控制所选择的切片。

    虽然细微的差异很常见,并且可能来自例如C代码如下:

    void some_function(void)
    {
    #if __LP64__
        // do something
    #else
        // do something else
    #endif
    }
    

    我知道的示例包括使用(官方禁止的)IOKit 框架,其中 io_* 函数在 32 位上导出但不是在 64 位上导出,这允许对前者进行简单导入但需要自制程序 dlsym()-后者的样式扫码。

    总结:

    不同的 Mach-O 的切片通常是从相同的代码库编译的吗? 是的
    他们应该是吗? 是的
    这有任何保证吗?

    【讨论】:

    • 好的,即使它们可以装订在一起,通常是这样吗?我查看并检查了上面的示例的每个 iOS 应用程序,饼图、堆栈粉碎、弧等,两个 MAch-O 文件都是相同的......我会遇到任何差异吗,我还需要检查两个 armv7和 arm64?
    • 我们在这里也只讨论 iOS 应用,而不是 macOS 应用
    • 嗯,你到底想检查什么?最终,关于 Mach-O's 内容的任何事情都 100% 取决于作者。
    • OP中的东西,二进制检查,字符串,不安全的函数使用通过grep找到的其他函数。
    • 更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多