之前有写过【如何给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 防篡改,完整性爱护

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

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