面试题答案
一键面试常见代码混淆方法
- 重命名标识符:将有意义的变量名、函数名等标识符替换为无意义的名称。例如将
NSString *userName;
改为NSString *a;
。 - 添加无用代码:插入一些不会影响程序实际功能的代码,增加代码阅读难度。比如在方法中添加
int temp = 0; temp++;
这样的语句。 - 拆分复杂逻辑:把原本简单的逻辑拆分成多个步骤。例如原本
int result = a + b;
可以拆分成int temp1 = a; int temp2 = b; int result = temp1 + temp2;
- 使用宏定义:通过宏定义来隐藏实际的代码逻辑。比如
#define ADD(a, b) ((a) + (b))
,使用ADD
宏来代替简单的加法运算。
举例说明重命名标识符操作
假设原本有一个简单的Objective-C类,用于计算两个整数的和:
// 原始代码
#import <Foundation/Foundation.h>
@interface Calculator : NSObject
@property (nonatomic, assign) int num1;
@property (nonatomic, assign) int num2;
- (int)calculateSum;
@end
@implementation Calculator
- (int)calculateSum {
return self.num1 + self.num2;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Calculator *calc = [[Calculator alloc] init];
calc.num1 = 5;
calc.num2 = 3;
int sum = [calc calculateSum];
NSLog(@"Sum is: %d", sum);
}
return 0;
}
进行重命名标识符混淆后:
// 混淆后代码
#import <Foundation/Foundation.h>
@interface a : NSObject
@property (nonatomic, assign) int b;
@property (nonatomic, assign) int c;
- (int)d;
@end
@implementation a
- (int)d {
return self.b + self.c;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
a *e = [[a alloc] init];
e.b = 5;
e.c = 3;
int f = [e d];
NSLog(@"Sum is: %d", f);
}
return 0;
}
在这个例子中,类名从Calculator
改为a
,属性名从num1
、num2
改为b
、c
,方法名从calculateSum
改为d
,使得代码逻辑更难被直接理解。