之前有写过【怎么给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的特征:

iOS加固保护新思路

将其反编译为伪代码,代码逻辑及源代码中运用的字符串均清晰可见,与源代码结构基本共同,作用如下

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 代码逻辑混杂

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

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

iOS加固保护新思路
若开启防反编译功用,则操控流图会被彻底躲藏,只剩下一个代码块,且无法反编译出有用代码(如下图所示),这对于对抗逆向剖析东西来说非常有用,包括但不限于(IDA Pro, Hopper Disassembler, Binary Ninja, GHIDRA等)

iOS加固保护新思路

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进程能够有用地阻止各类调试器的调试行为:

iOS加固保护新思路

5 防篡改,完整性维护

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

结语

以上内容是不限制ios版本的。不过,对于App类型,仅支撑.xcarchive格局,不支撑.ipa格局。并且,有以下注意事项:

  • Build Setting 中 Enable Bitcode 设置为 YES
  • 运用 Archive 形式编译以保证Bitcode成功启用,否则编译出的文件将只包括bitcode-marker
  • 若无法开启Bitcode,可运用辅助东西进行处理,详见五、iOS加固辅助东西 -> 5.2 启用 bitcode
  • 紧缩后体积在 2048M 以内

以上是根据顶象的加固产品操作指南出具的流程,如需求更具体的阐明,能够自行前往用户中心~