乐趣区

关于安全:iOS加固保护新思路

之前有写过【如何给 iOS APP 加固】,然而通过一段时间的思考,我找到了更具备实践性的代码,具体能够看上面。

技术简介

iOS 加固爱护是基于虚机源码爱护技术,针对 iOS 平台推出的下一代加固产品。能够对 iOS APP 中的可执行文件进行深度混同、加固,并应用独创的虚拟机技术对代码进行加密爱护,应用任何工具都无奈间接进行逆向、破解。对 APP 进行完整性爱护,避免应用程序中的代码及资源文件被歹意篡改。

技术性能

目前 iOS 加固次要蕴含逻辑混同、字符串加密、代码虚拟化、防调试、防篡改以及完整性爱护这三大类性能。通过对上面的代码片段进行爱护来展现各个性能的成果:

- (void) test {if (_flag) {test_string(@"Hello, World!",@"你好,世界!","Hello, World!");
    } else {dispatch_async(dispatch_get_mian_queue(), ^{do_something();
          });
    }
    int i=0;
    while (i++ < 100) {sleep(1);
           do_something();}
}

将代码编译后拖入 IDA Pro 中进行剖析,能够失去这样的控制流图,只有 6 个代码块,且跳转逻辑简略,能够很容易地判断出 if-else 以及 while 的特色:

将其反编译为伪代码,代码逻辑及源代码中应用的字符串均清晰可见,与源代码构造基本一致,成果如下

void __cdecl -[ViewController test](ViewController *self, SEL a2)
{
   signed int v2; // w19
   __int64 v3;  //x0

   if (self->_flag)
      sub_100006534 (CFSTR("Hello, World!"),CFSTR("你好,世界!"), "Hello, World!" );
   else
      dispatch_async (&_dispatch_main_q, &off_10000C308);
   v2 = 100;
   do
   {v3 = sleep( 1u);
       sub_100006584(v3);
       --v2;
    }
    while (v2);
}

1 代码逻辑混同

通过将原始代码的控制流进行切分、打乱、暗藏,或在函数中插入花指令来实现对代码的混同,使代码逻辑复杂化但不影响原始代码逻辑。

对代码进行逻辑混同爱护后,该函数的控制流图会变得十分复杂,且函数中交叉了大量不会被执行到的无用代码块,以及相互间的逻辑跳转,逆向剖析的难度大大加强:

若开启防反编译性能,则控制流图会被齐全暗藏,只剩下一个代码块,且无奈反编译出无效代码(如下图所示),这对于反抗逆向剖析工具来说十分无效,包含但不限于(IDA Pro, Hopper Disassembler, Binary Ninja, GHIDRA 等)

void __cdecl -[ViewController test](ViewController *self , SEL a2)
{JUMPOUT (__CS__, sub_100005A94(6LL, a2));
}

2 字符串加密

把所有动态常量字符串 (反对 C /C++/OC/Swift 字符串) 进行加密,运行时解密,避免攻击者通过字符串进行动态剖析,猜想代码逻辑。

对代码中的字符串进行加密之后,所有的字符串都被替换为加密的援用,任何反编译伎俩均无奈看到明文的字符串。你好,世界!,Hello, World! 等字符串本来能够被轻易的反编译进去,但爱护之后曾经看不到了:

void __cdecl -[ViewController test](ViewController *self, SEL a2)
{
   __int64 v2;  //x0
   __int64 v3;  //x0
   signed int v4; // w19
   __int64 v5;  //x0

   if (self->_flag)
   {v2 = sub_100008288();
      v3 = sub_10000082E8(v2);
      sub_100008228(v3);
      sub_100007FB0(&stru_100010368, &stru_10001038, &unk_100011344);
   }
   else
      dispatch_async (&_dispatch_main_q, &off_100010308);
   }
   v4 = 100;
   do
   {v5 = sleep( 1u);
       sub_100008004(v5);
       --v4;
    }
    while (v4);
}

3 代码虚拟化

将原始代码编译为动静的 DX-VM 虚拟机指令,运行在 DX 虚拟机之上,无奈被反编译回可读的源代码,任何工具均无奈间接反编译虚拟机指令。

采纳代码虚拟化爱护后,对函数进行反编译将无奈看到任何与原代码类似的内容,函数体中只有对虚拟机子系统的调用:

void __cdecl -[ViewController test](ViewController *self, SEL a2)
{
     SEL v2;  // x19
     __int64 v3;  //  x21

     v2 = a2;
     v3 = sub_10000C1EC;
     ((void (*)(void))sub_10000C1D8)();
     sub_10000C1D8(v3, v2);
     sub_10000C180(v3, 17LL);
}

4 防调试

避免通过调试伎俩剖析应用逻辑,开启防调试性能后,App 过程能够无效地阻止各类调试器的调试行为:

5 防篡改,完整性爱护

避免应用程序中的代码及资源文件被歹意篡改,杜绝盗版或植入广告等二次打包行为。

以上是依据顶象的加固产品操作指南出具的流程,如须要更具体的阐明,能够自行返回用户核心~

退出移动版