iOS小技能:常用预处理指令

205 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

引言

iOS常用预处理指令:

  1. 移除程序中的指定标识符。
  2. DEBUG宏区分调试模式和发布模式进行特殊处理。
  3. 导出和隐藏符号。

I 移除程序中的指定identifier(标识符)

#pragma clang poison identifier

应用场景:禁止使用ObjC 的运行时API

  • 例子:
#pragma clang poison NSLog

II DEBUG 宏的应用

1、原文:kunnan.blog.csdn.net/article/det… 2、应用场景:区分调试模式和发布模式进行特殊处理 3、The DEBUG preprocessor macro setting in an Xcode project 4、发布模式关闭NSLog

//调试模式
#ifdef DEBUG
#define NSLog(...)     NSLog(__VA_ARGS__)
#define KisDebug 1

//#define NSLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);

#else//发布模式
#define NSLog(...)
#define KisDebug 0
#endif


III 导出和隐藏符号

3.1 导出符号信息

  • 查看导出符号信息:nm -gm tmp_64.dylib

(__DATA,__data) external (undefined) external _CFDataCreate (from CoreFoundation) (undefined) external _CFNotificationCenterGetDarwinNotifyCenter (from CoreFoundation) (__TEXT,__text) external (undefined) external _IOObjectRelease (from IOKit) (undefined) external _IORegistryEntryCreateCFProperty (from IOKit) 000000010ffa3f97 (__DATA,__objc_data) external OBJC_CLASS_BslyjNwZmPCJkVst 000000010ffa3f97 (__DATA,__objc_data) external _OBJC_CLASS__ChiDDQmRSQpwQJgm

3.2 控制符号是否导出

  • static 参数修饰,不会导出符号信息
static char _person_name[30] = {'\0'};

  • 在编译参数中加入-exported_symbols_list export_list
CC = xcrun --sdk iphoneos clang
ARCH = arm64
FRAMEWORK = -framework Foundation
VERSION = -compatibility_version 1 -current_version 1 
EXPORT = -exported_symbols_list export_list
VISIBLE = -fvisibility=hidden
TARGET = target.dylib

SOURCE = Person.mm

target1:$(SOURCE1)
	$(CC) -dynamiclib -arch $(ARCH) $(FRAMEWORK) $(SOURCE) -o $(TARGET) $(VERSION)

target2:$(SOURCE1)
	$(CC) -dynamiclib -arch $(ARCH) $(FRAMEWORK) $(SOURCE) -o $(TARGET) $(VERSION) $(EXPORT)


target3:$(SOURCE1)
	$(CC) -dynamiclib -arch $(ARCH) $(FRAMEWORK) $(SOURCE) -o $(TARGET) $(VERSION) $(VISIBLE)

clean:
	rm $(TARGET)

  • 在Makefile编译参数中指定-fvisibility=hidden,对指定符号增加visibility(“default”)来导出符号

1、在Makefile编译参数中指定-fvisibility=hidden

CC = xcrun --sdk iphoneos clang++
ARCH = arm64
FRAMEWORK = -framework Foundation
VERSION = -compatibility_version 1 -current_version 1
VISIBLE = -fvisibility=hidden
TARGET = target.dylib

SOURCE = Person.m 

$(TARGET):$(SOURCE)
	$(CC) -dynamiclib -arch $(ARCH) $(FRAMEWORK) $(SOURCE) -o $(TARGET) $(VERSION)

.PHONY:clean
clean:
	rm $(TARGET)

2、对指定符号增加visibility(“default”)来导出符号

#define EXPORT __attribute__((visibility("default")))

see also

进一步交流,欢迎搜索小程序:iOS逆向。