引言
iOS常用预处理指令:
- 移除程序中的指定标识符。
- DEBUG宏区分调试模式和发布模式进行特殊处理。
- 导出和隐藏符号。
I 移除程序中的指定identifier(标识符)
#pragma clang poison identifier
应用场景:禁止使用ObjC 的运行时API
- 例子:
#pragma
II DEBUG 宏的应用
1、原文:kunnan.blog.csdn.net/article/det… 2、应用场景:区分调试模式和发布模式进行特殊处理 3、The DEBUG preprocessor macro setting in an Xcode project
4、发布模式关闭NSLog
//调试模式
#ifdef
#define
#define
//#define NSLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else//发布模式
#define
#define
#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
- 在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
2、对指定符号增加visibility(“default”)来导出符号
#define EXPORT __attribute__((visibility("default")))
see also
进一步交流,欢迎搜索小程序:iOS逆向。