代码字符串混淆

1,322 阅读2分钟

    在混淆代码的时候,最容易忽略的往往是字符串@"xxx"),例如:

NSString *hello = @"world";
NSString *url = @"http://www.xxx.com";

    被苹果直接在后台回复了一个我们包体中的链接后,我才开始上心这个事情。稍微分析一下,其实很容易发现,这些信息是最容易获取的,也是最容易被交叉对比的部分,下面将介绍:

如何找到二进制中的字符串以及最简单的,对于字符串做出差异化的方法.

    首先,创建一个Cocoa Touch Static Library类型项目(.a静态库),命名为testMachO,testMachO项目会自动生成一个testMachO类,而且只有一个testMachO类(最小化验证问题)。

打开testMachO.m 修改成以下:

#import "testMachO.h"

#define defineTest @"defineTestString111111"
NSString *const constTest = @"constTestString222222";
static NSString *const staticTest = @"staticTestString333333";
static NSString *const staticTestChinese = @"测试44444";

@implementation testMachO

编译后获取libtestMachO.a

machoView下载

https://sourceforge.net/projects/machoview/

用machoView打开libtestMachO.a后 如下图:

图片

左边展开testMacho.o
查看Section64(__TEXT__,cstring)

会发现部分字符串存在于macho文件中

图片

但是!
代码中的defineTest,staticTestChinese对应的字符串没有在这里!

是不是意味着宏和中文字符串不会存在于macho文件中呢?

继续看Section64(__TEXT__,cfstring)

图片

那么宏呢?

在原有基础上增加方法

- (void)testMethod {
    NSLog(@"%@",defineTest);
    NSString *test2 = @"这是测试";
}

图片

总结 : 宏使用的时候才记录了
中文保存在另外一个Section64(__TEXT__,cfstring)

所以,编程时所使用的字符串都是能在二进制中体现的!

换个思路,如果二进制里没有这些,我感觉你在为难程序.

下面我通过我的代码混淆工具对于代码做了混淆后

代码变成了下面这个样子了(又不是不能跑!)

#define defineTest [@[@"d",@"e",@"f",@"i",@"n",@"e",@"T",@"e",@"s",@"t",@"S",@"t",@"r",@"i",@"n",@"g",@"1",@"1",@"1",@"1",@"1",@"1"] componentsJoinedByString:@""]
#define constTest [@[@"c",@"o",@"n",@"s",@"t",@"T",@"e",@"s",@"t",@"S",@"t",@"r",@"i",@"n",@"g",@"2",@"2",@"2",@"2",@"2",@"2"] componentsJoinedByString:@""];
#define staticTest [@[@"s",@"t",@"a",@"t",@"i",@"c",@"T",@"e",@"s",@"t",@"S",@"t",@"r",@"i",@"n",@"g",@"3",@"3",@"3",@"3",@"3",@"3"] componentsJoinedByString:@""]
#define staticTestChinese [@[@"测",@"试",@"4",@"4",@"4",@"4",@"4"] componentsJoinedByString:@""];

- (void)testMethod {
    NSLog(@"%@",defineTest);
    NSString *test = [@[@"t",@"e",@"s",@"t",@"S",@"t",@"r",@"i",@"n",@"g"] componentsJoinedByString:@""];
    NSString *test2 = [@[@"这",@"是",@"测",@"试"] componentsJoinedByString:@""];
}

再看看结果

图片

图片

好像画风不一样了

    对于字符串差异化的时候,需要注意的是,不能加密得太明显, 容易吃模糊代码的审核结果,而且需要能控制字符串混淆比例,链接这种类型的字符串一定要完全处理掉,新版工具增加的字符串差异化功能满足以上条件,但是好像还有些bug,很尴尬。

上面那些截图的内容可以自行验证,纸上得来终觉得浅!

本文使用 文章同步助手 同步