8912ab5f77f09cdcb9ba6646145808e7
安全攻与防篇:代码混淆

1.背景

《工具篇:头文件导出工具 class-dump》 中,我们介绍了使用 class-dump,导出可执行文件的头文件的方法。从结果可以看到,包括在 .h、 .m 文件中的变量和方法,都在导出的头文件中会显示出来。这样的话,对于逆向工程师来说,更容易了解程序的结构和功能,大大减小了破解的难度。因为在工程中,我们对变量或函数命名,都会有相应的规范,来提高可读性,例如用户名,那一般会有 userName,密码一般会有 passWord/pwd,这样定义是为了我们自己代码可读性更强,这样修改和维护起来更容易理解。但这种定义的结果,对于逆向工程师也提高了阅读的便捷,使得我们的程序更容易破解。我们该怎么来规避这个问题呢?这就是本篇要聊的:代码混淆。

2.代码混淆

2.1 小示例

新建一个工程,并添加一个用户管理类,假设里面有一个 VIP 账户判断的方法。

#import "GofUserManager.h"

@implementation GofUserManager

- (BOOL)gof_isVipAccount:(NSString *)userName {
    if ([userName isEqualToString:@"Gof"]) {
        return YES;
    }
    return NO;
}

@end

2.2 导出头文件

使用 class-dump 导出头文件,可以看到导出的 GofUserManager.h 如下图所示:

#import <objc/NSObject.h>

@interface GofUserManager : NSObject
{
}

- (BOOL)gof_isVipAccount:(id)arg1;

@end

2.3 代码混淆

这里我们直接使用一个 pch 文件来进行混淆:

top Created with Sketch.