【问题标题】:Will code inside a preprocessor conditional enter the binary?预处理器中的代码是否会条件输入二进制文件?
【发布时间】:2017-06-11 05:01:02
【问题描述】:

我有一个 Config.h 文件,其中包含基于环境的各种预处理器条件。该项目有2个目标。通过预处理器参数,如果环境是第一个目标,我们可能有 BASE_URL = @"https://firsttarget.com/",而如果环境是第二个目标,我们可能有 BASE_URL = @"https://secondtarget.com/"。

出于法律目的,如果有人要重新编译程序集,并寻找字符串等...如果他们正在查看第二个目标应用程序的二进制文件,我们将无法让某人找到字符串 @"https://firsttarget.com/"。

所以我的问题是......如果它们不相关,是否在归档期间删除预处理器条件后面的字符串?

【问题讨论】:

    标签: objective-c xcode cocoa-touch c-preprocessor


    【解决方案1】:

    除非定义了 ifdef 行中给出的符号,否则编译器看不到 #ifdef#endif(或 #else)之间的代码部分。您可以通过编写在此类部分中无法编译的内容来轻松展示这一点。而且由于编译器看不到该代码,因此该定义的值不可能最终出现在二进制文件中。

    要查看编译器将使用的确切内容,您可以在 Xcode 中选择一个实现文件,然后从菜单中选择“产品 > 执行操作 > 预处理”。这将准确地向您展示编译器将使用的内容。当然也会有来自所有系统 .h 文件的内容被导入,所以你的代码很可能在最后。您的#define 行也将被删除,因此要真正检查将使用哪些字符串,您需要选择一个实际使用这些宏的文件。

    最后你可以做攻击者可能做的事情——在编译后的二进制文件上使用strings 实用程序,看看里面有什么。在 Xcode 中构建您的应用程序,然后从产品组中为您的应用程序包选择“在 Finder 中显示”选项。选择“显示包内容”以打开应用程序您的实际应用程序包。实际的二进制文件与您的包同名,但没有文件扩展名。然后打开一个终端窗口,输入“strings”(即字符串后面跟一个空格)并将二进制文件拖到上面。然后返回确认。您将从二进制文件(包括每个选择器)中获得每个可读字符串的长列表。

    【讨论】:

    • 您能否详细解释一下如何使用字符串实用程序查看编译后的二进制文件中的内容。
    猜你喜欢
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多