之前有寫過【如何給iOS APP加固】,但是經(jīng)過一段時(shí)間的思考,我找到了更具有實(shí)踐性的代碼,具體可以看下面。
技術(shù)簡(jiǎn)介
iOS加固保護(hù)是基于虛機(jī)源碼保護(hù)技術(shù),針對(duì)iOS平臺(tái)推出的下一代加固產(chǎn)品??梢詫?duì)iOS APP中的可執(zhí)行文件進(jìn)行深度混淆、加固,并使用獨(dú)創(chuàng)的虛擬機(jī)技術(shù)對(duì)代碼進(jìn)行加密保護(hù),使用任何工具都無法直接進(jìn)行逆向、破解。對(duì)APP進(jìn)行完整性保護(hù),防止應(yīng)用程序中的代碼及資源文件被惡意篡改。
技術(shù)功能
目前iOS加固主要包含邏輯混淆、字符串加密、代碼虛擬化、防調(diào)試、防篡改以及完整性保護(hù)這三大類功能。通過對(duì)下面的代碼片段進(jìn)行保護(hù)來展示各個(gè)功能的效果:
- (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中進(jìn)行分析,可以得到這樣的控制流圖,只有6個(gè)代碼塊,且跳轉(zhuǎn)邏輯簡(jiǎn)單,可以很容易地判斷出if-else以及while的特征:
將其反編譯為偽代碼,代碼邏輯及源代碼中使用的字符串均清晰可見,與源代碼結(jié)構(gòu)基本一致,效果如下
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 代碼邏輯混淆
通過將原始代碼的控制流進(jìn)行切分、打亂、隱藏,或在函數(shù)中插入花指令來實(shí)現(xiàn)對(duì)代碼的混淆,使代碼邏輯復(fù)雜化但不影響原始代碼邏輯。
對(duì)代碼進(jìn)行邏輯混淆保護(hù)后,該函數(shù)的控制流圖會(huì)變得十分復(fù)雜,且函數(shù)中穿插了大量不會(huì)被執(zhí)行到的無用代碼塊,以及相互間的邏輯跳轉(zhuǎn),逆向分析的難度大大增強(qiáng):
若開啟防反編譯功能,則控制流圖會(huì)被完全隱藏,只剩下一個(gè)代碼塊,且無法反編譯出有效代碼(如下圖所示),這對(duì)于對(duì)抗逆向分析工具來說非常有效,包括但不限于(IDA Pro, Hopper Disassembler, Binary Ninja, GHIDRA等)
void __cdecl -[ViewController test](ViewController *self , SEL a2)
{
JUMPOUT (__CS__, sub_100005A94(6LL, a2));
}
2 字符串加密
把所有靜態(tài)常量字符串(支持C/C++/OC/Swift字符串)進(jìn)行加密,運(yùn)行時(shí)解密,防止攻擊者通過字符串進(jìn)行靜態(tài)分析,猜測(cè)代碼邏輯。
對(duì)代碼中的字符串進(jìn)行加密之后,所有的字符串都被替換為加密的引用,任何反編譯手段均無法看到明文的字符串。你好,世界!,Hello, World!等字符串原本可以被輕易的反編譯出來,但保護(hù)之后已經(jīng)看不到了:
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 代碼虛擬化
將原始代碼編譯為動(dòng)態(tài)的DX-VM虛擬機(jī)指令,運(yùn)行在DX虛擬機(jī)之上,無法被反編譯回可讀的源代碼,任何工具均無法直接反編譯虛擬機(jī)指令。
采用代碼虛擬化保護(hù)后,對(duì)函數(shù)進(jìn)行反編譯將無法看到任何與原代碼相似的內(nèi)容,函數(shù)體中只有對(duì)虛擬機(jī)子系統(tǒng)的調(diào)用:
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 防調(diào)試
防止通過調(diào)試手段分析應(yīng)用邏輯,開啟防調(diào)試功能后,App進(jìn)程可以有效地阻止各類調(diào)試器的調(diào)試行為:
5 防篡改,完整性保護(hù)
防止應(yīng)用程序中的代碼及資源文件被惡意篡改,杜絕盜版或植入廣告等二次打包行為。文章來源:http://www.zghlxwxcb.cn/news/detail-468230.html
以上是根據(jù)頂象的加固產(chǎn)品操作指南出具的流程,如需要更詳細(xì)的說明,可以自行前往用戶中心~文章來源地址http://www.zghlxwxcb.cn/news/detail-468230.html
到了這里,關(guān)于iOS加固保護(hù)新思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!