Hikari使用手册

Hikari 是iOS编译混淆工具,可以更好地保护我们的代码,不被轻松地恶意分析破解。他可以根据参数灵活的去配置变混淆变异的选项,但是也有很多不足之处,例如安装包增大,存在提神被拒的风险等,而且目前开源版本最高只能兼容到xcode10,xcode10以后的版本变成了商业版本,需要收费才能使用。

操作手册

Build Settings -> Other C Flags 中可根据实际需求加入混淆标记:

  1. -mllvm -enable-bcfobf 启用伪控制流(启用之后的大小增大为原来的3倍左右)

  2. -mllvm -enable-cffobf 启用控制流平坦化(原生开启此项导入项目会崩溃)

  3. -mllvm -enable-splitobf 启用基本块分割(将基本快随机分割编号), 开启此项之后编译非常慢

  4. -mllvm -enable-subobf 启用指令替. 换所谓指令替换仅仅是对标准二进制运算(比如加、减、位运算)使用更复杂的指令序列进行功能等价替换,当存在多种等价指令序列时,随机选择一种。 这种混淆并不直截了当而且并没有增加更多的安全性,因为通过重新优化可以很容易地把替换的等价指令序列变回去。然而,提供一个伪随机数,就可以使指令替换给二进制文件带来多样性

  5. -mllvm -enable-acdobf 启用反class-dump,使用之后能导出头文件,但是文件里面的内容是经过处理的, 类的属性会被修改,并且只能显示部分属性,类或者对象的函数一般显示不出来(分类除外).遗憾的是使用Hopper依旧可以看到属性和方法,除了一丁点的汇编结构变化,可以说对Hopper基本不起作用

  6. -mllvm -enable-indibran 启用基于寄存器的相对跳转,配合其他加固可以彻底破坏IDA/Hopper的伪代码(俗称F5)(编译报错)

  7. -mllvm -enable-strcry 启用字符串加密(大概率编译不通过,因为不支持相同文件名例如main.c.ll, main.c.t, 而且使用extern引用的全局字符串也不支持,多线程加解密很难实现)

  8. -mllvm -enable-funcwra 启用函数封装

  9. -mllvm -enable-allobf 依次性启用上述所有标记

相关工具

  1. class-dump:专门针对OC的, 如果项目中有swift混编那么可能无法导出头文件,所有暂时不适用我们的要求
  2. hopper disassembler: 轻量级的IDA,能满足一般的逆向需求,基本够用
  3. MonkeyDev:非越狱插件开发神器,配合hopper disassembler 分析之后,使用它来针对砸壳应用做一些牛逼的功能.

Hiraki存在的问题

  1. 目前 Hiraki中的clang是8.0版本, 可能不支持目前项目项目中所用的 swift4.2, 经过测试纯oc项目是OK的

关于class-dump无法使用的相关问题

  1. 问题:Error: Cannot find offset for address 0x200000000100d256 in stringAtAddress:

原因:class-dump是利用Object-C语言的runtime特性,提取头文件,class-dump目前没法作用于Swift,如果项目中用到了OC和Swift混编,class-dump会失败。

编译framework问题

  1. 如果集成混淆后的framework之后编译报错:

    1
    2
     clang-8: error: unable to execute command: Abort trap: 6
     clang-8: error: clang frontend command failed due to signal (use -v to see invocation)
    

​ 解决办法: 点击查看

使用混淆选项详情

混淆参数(编号对应操作手册中的编号,多个编号为组合件) | 打包大小 | 运行内存 :——–:|:———-:|:——-: 0 | 3.8M |4M 1 | 13.3M | 4.9M 2 | 5.9M | 4.5M 3 | 5.1M | 4.1M 1234568 |50M | 8.5M 124568 | 25M |6.5M 12568

  1. 如果添加所有的混淆选项1234568(除了字符串加密)打包出来的sdk大小为50M左右(原始包3.8M左右), 不仅包的体积增大, 在运行时内存消耗也会骤然增加,运行起来什么都不做的情况下运行内存在8.5M左右(原始包3.8M),由于插件的内存限制,很容易OM
  2. 混淆选项添加124568,

其他问题

  1. 集成framework的时候一定要将配置文件在app 和插件的 copy bundle resource 中添加
  2. 源代码调试和打包的时候注意修改如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
     + (NSString *) sharedGroupIdentifier {
     //打包framework的时候使用
         NSString *str1 = [[NSBundle mainBundle] pathForResource:@"LocalConfig.json" ofType:nil];
         //源代码调试的时候使用
     //    NSString *str2 = [[NSBundle bundleWithIdentifier:@"com.taoyin.greenh5"] pathForResource:@"LocalConfig.json" ofType:nil];
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:str1] options:NSJSONReadingMutableLeaves error:nil];
         NSLog(@"sharedGroupIdentifier:oooook%@===",dic);
         return dic[@"group_id"];
     }
    

n2n

https://zhuanlan.zhihu.com/p/25344743

https://www.cnblogs.com/my_life/articles/1908552.html

https://github.com/zerotier/ZeroTierOne

升级shadowsocks-libev

ares 和

-#define DEFAULT_KEEP_ALIVE_TIMEOUT 180 +#define DEFAULT_KEEP_ALIVE_TIMEOUT 120

  • config->max_client_connections = 128;
  • config->socket_timeout = 300; /* XXX: Should be a macro. */
  • config->max_client_connections = 256;
  • config->socket_timeout = 30; /* XXX: Should be a macro. */

// maximum number of clients -#define DEFAULT_MAX_CLIENTS 3 +#define DEFAULT_MAX_CLIENTS 2

// maximum connections for client #define DEFAULT_MAX_CONNECTIONS_FOR_CLIENT 256

-static NSString *groupId = @”group.com.x.route.dev.data”;//group id -static NSString *encryptKey = @”86712786e2205b50e80721462334364d”;//enctypt key +//static NSString *groupId = @”group.com.x.route.dev.data”;//group id +//

  • profile.timeout = 600;
  • profile.timeout = 20;