字符串以及静态混淆

0x01 字符串加密

0x01

在开发中我们总是会用到加解密,有些同学可能不注意会直接把对称加密的key直接写到程序中,这样使用Hopper或者IDA静态分析的时候是可以直接看到加密的key,这样容易被别人破解,所以需要采用一些方法对文件里面的key进行加密,使得在静态分析阶段无法直接获取加密的key,增加逆向难度。

0x02

在这里我们可以使用异或计算方法对某一个key进行加密,异或的原理是如果二进制位相同则为0,不相同则为1,如果a^b = c,那么b^c=a。
代码参考如下:

#define XOR_KEY 0xBB

void xorString(unsigned char *str, unsigned char key)
{
    unsigned char *p = str;
    while( ((*p) ^=  key) != '\0')  p++;
}

- (void)testFunction
{
    unsigned char str[] = {(XOR_KEY ^ 'e'),
                           (XOR_KEY ^ 'n'),
                           (XOR_KEY ^ 'k'),
                           (XOR_KEY ^ 'e'),
                           (XOR_KEY ^ 'y'),
                           (XOR_KEY ^ '\0')};
    xorString(str, XOR_KEY);
    static unsigned char result[6];
    memcpy(result, str, 6);
    NSLog(@"%s",result);      //output: enkey
}

0x03

如果在工程中需要加密的字符串很多,这个时候就要遍历文件进行加密,这个时候如果手动查找的话那工作量就会很大,还好Clang可以帮助我们完成这个事情。iOS中有一个libClang提供了Clang的C接口,用于源代码转换成抽象语法树,并对抽象语法树进行便利和分析。具体的操作思路可以看iOS加固浅谈之字符串加密

0x02 类和方法加密

0x01

如果对程序的安全要求更高一点,可以对程序中所有的类和方法进行混淆,也就是用一些乱序无意义的字符串来对程序的类和方法进行替换。但是这个方法有一个弊端,至于什么弊端会在0x04说明

0x02

第一种混淆方法是宏定义,通过增加一个pch文件,在pch文件中将类名和方法名定义成一些无意义的字符串,然后配置prefix Header的路径为pch的路径,这样在静态分析的时候看到的就是乱序的字符串。以下为PCH的内容

#ifndef PrefixHeader_pch
#define PrefixHeader_pch
// Classes
#ifndef TestClass
#define TestClass l4prfxSkn
#endif
// Methods
#ifndef testClasssMehtod
#define testClasssMehtod l9b0e29rLKJNqI23
#endif // testClasssMehtod
#ifndef testInstanceMethod
#define testInstanceMethod e0lvc2hezXEA2jIBNw
#endif // testInstanceMethod

#endif /* PrefixHeader_pch */

下面是testClass.h

#import 

@interface TestClass : NSObject
@property (nonatomic,copy) NSString *name;
- (void)testInstanceMethod;
+ (void)testClasssMehtod;
@end

静态分析截图


image.png

通过上面我们已经可以看到静态分析之后完全看不出上面是哪个类调用了哪个方法。

0x03

和字符串加密一样,一个项目中肯定有很多类和很多方法,如果我们手动去宏定义的话那这是一个巨大的工作量,不过还好Github已经有现成的项目来帮我们生成宏定义。ios-class-guard这个项目可以把所有使用系统库符号的dump下来并过滤掉,只生成用户需要混淆的符号。然后将生成的符号添加到pch文件里面即可

0x04

上面无序随机字符串加密的弊端就是在提交到AppStore审核的时候,苹果会认为你的APP可能会存在隐藏的功能然后拒接你的上架。
另外一种解决方法就是将上线无序随机字符串换成有意义的单词,使得方法名看起来是有意义的,但是它的意义却不是该方法真正的作用。

你可能感兴趣的:(字符串以及静态混淆)