之前有写过【如何给 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 防篡改,完整性爱护
避免应用程序中的代码及资源文件被歹意篡改,杜绝盗版或植入广告等二次打包行为。
以上是依据顶象的加固产品操作指南出具的流程,如须要更具体的阐明,能够自行返回用户核心~