我有一个Config.h文件,其中包括基于环境的各种预处理器条件。该项目有2个目标。通过预处理器参数,如果环境是第一个目标,我们可能会有BASE_URL=@"https://firsttarget.com/",而如果环境是第二个目标,我们可能会有BASE_URL=@"https://secondtarget.com/".
出于法律目的,如果有人重新编译程序集,并搜索字符串等……我们不能让人找到字符串@"https://firsttarget.com/"如果他们正在研究第二个目标应用程序的二进制文件。
所以我的问题是…如果预处理器条件后面的字符串不相关,那么它们在归档过程中会被删除吗?
除非定义了ifdef行上给定的符号,否则编译器不会看到代码中#ifdef
和#endif
(或#else
)之间的部分。您可以通过编写一些不会在这样的小节中编译的内容来轻松地展示这一点。由于编译器看不到该代码,因此该定义的值不可能以二进制形式结束。
要确切了解编译器将使用什么,您可以在Xcode中选择一个实现文件,并从菜单中选择"产品>执行操作>预处理"。这将向您展示编译器将使用的确切内容。当然,也会有来自所有导入的system.h文件的内容,所以您的代码很可能在最后。#define
行也将被剥离,因此要真正检查将使用哪些字符串,您需要选择一个实际使用这些宏的文件。
最后,您可以做攻击者可能做的同样的事情——在编译的二进制文件上使用strings
实用程序,看看里面有什么。在Xcode中构建你的应用程序,并从产品组中为你的应用捆绑包选择"在Finder中显示"选项。在那里选择"显示包内容"打开应用程序您的实际应用程序捆绑包。实际的二进制文件与捆绑包的名称相同,但没有文件扩展名。然后打开一个终端窗口,键入"字符串"(即后面跟着空格的字符串),并将二进制文件拖到上面。然后返回确认。您将获得二进制文件中每个可读字符串的长列表(包括每个选择器)。