iOS工程加固

前言

企业级App在交付给客户时(尤为是国企)一般会进行一项步骤:等保测评
那么除了一些第三方的付费加固方案,咱们开发者本身还能作哪些操做呢 ?
接下来,我将摘取咱们iOS应用安全风险评估报告中的几个高风险进行操做。git

程序被恶意调试风险

风险描述

攻击者能够利用GDB、IDA、Ptrace等调试器跟踪运行的目标程序,查看、修改内存中的代码和数据,甚至分析/篡改程序的业务逻辑,对客户关键数据或者服务器进行恶意攻击,例如修改客户端业务操做的数据,好比转帐帐号、金额等,致使用户的损失。github

修复建议

【开发者修复】集成Native层的反调试保护功能,避免应用被Xcode、IDA等工具调试,进而保护业务安全。sql

修复操做

反调试数据库

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <dlfcn.h>
#import <sys/types.h>

typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr ,int _data);
#if !defined(PT_DENT_ATTACH)
#define PT_DENT_ATTACH 31
#endif

void disable_gdb() {
    void * handle = dlopen(0, RTLD_GLOBAL|RTLD_NOW);
    ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
    ptrace_ptr(PT_DENT_ATTACH, 0, 0, 0);
    dlclose(handle);
}
int main(int argc, char * argv[]) {
    disable_gdb();
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
复制代码

程序代码被恶意注入风险

风险描述

应用程序运行时会在内存中产生一些敏感数据,好比密钥Key、本地解密数据、通讯解密数据,攻击者能够利用frida等工具,对程序关键函数注入代码,经过破坏业务逻辑能够获取明文数据或直接对服务器发起攻击。安全

修复建议

【开发者修复】集成防注入/防Hook保护功能,避免应用被注入/HOOK。bash

修复操做

fishhook服务器

#import "AppDelegate.h"
#import "fishhook.h"
#import <objc/runtime.h>

@implementation AppDelegate
#pragma mark ---- 防御代码------
//函数指针变量
void(*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);

//static NSMutableArray *methods;
void myExchange(Method _Nonnull m1, Method _Nonnull m2)
{
//    if (!methods) {
//        methods = [NSMutableArray array];
//    }
    
//    SEL oriMethodName = method_getName(m1);
    SEL oriMethodName2 = method_getName(m2);
//    IMP myMethodImp = method_getImplementation(m1);
//    IMP myMethodImp2 =method_getImplementation(m2);
    
// 先从项目中找到目前所有的   method_exchangeImplementations 方法 
// 项目中没有的就是不安全的,直接exit。

    NSString *newMethod = NSStringFromSelector(oriMethodName2);
//    [methods addObject:newMethod];
//    HTLog(@"%@",methods);
    
    NSArray *wzArr = @[
        @"af_resume", @"af_suspend",@"sd_setText:",@"sd_layoutSubviews",
        @"sd_button_layoutSubviews",@"sd_reloadData",@"sd_reloadRowsAtIndexPaths:withRowAnimation:",
        @"sd_deleteRowsAtIndexPaths:withRowAnimation:",
                           @"mj_reloadData",
                           @"mj_reloadData",
                           @"fd_reloadData",
                           @"fd_insertSections:withRowAnimation:",
                           @"fd_deleteSections:withRowAnimation:",
                           @"fd_reloadSections:withRowAnimation:",
                           @"fd_moveSection:toSection:",
                           @"fd_insertRowsAtIndexPaths:withRowAnimation:",
                           @"fd_deleteRowsAtIndexPaths:withRowAnimation:",
                           @"fd_reloadRowsAtIndexPaths:withRowAnimation:",
                           @"fd_moveRowAtIndexPath:toIndexPath:"];

    if (![wzArr containsObject:newMethod]) {
        HTLog(@"恶意代码HOOK:%@",newMethod);
        exit(0);
    }
}

+(void)load{
    /**
     防御代码:
     这里使用fishHOOK 对method_exchangeImplementations进行HOOK替换便可
     */
    struct rebinding bd;
    bd.name = "method_exchangeImplementations";
    bd.replacement = myExchange;
    bd.replaced = (void *)&exchangeP;
    struct rebinding rebs[1] = {bd};
    rebind_symbols(rebs, 1);
}

复制代码

缺乏代码加密保护

风险描述

iOS应用的核心代码编译以后会生成Mach-O文件,“黑客”利用IDA Pro等逆向工具,能够轻松反编译未采起任何保护措施的Mach-O文件,生成近似源代码的C代码,业务逻辑、核心技术将直接暴露在攻击者的眼前。进一步形成核心技术泄漏、隐私数据泄漏、业务逻辑恶意篡改等危害。markdown

修复建议

【开发者修复】建议对重要的C/C++/Objective-C/Swift等代码采用虚拟化或者混淆保护技术,对关键的函数进行高强度的安全加密。dom

修复操做

#define 代码混淆函数

一、打开终端 cd到你的项目根目录,配置confuse.sh和func.list文件

二、将文件加入到你的项目

三、添加Run Script

四、设置脚本相对路径 $PROJECT_DIR/confuse.sh

五、编写 脚本文件 内容 (将脚本内容复制到 confuse.sh文件里)
#!/usr/bin/env bash

TABLENAME=symbols
SYMBOL_DB_FILE="symbols"
STRING_SYMBOL_FILE="func.list"
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/codeObfuscation.h"
export LC_CTYPE=C

#维护数据库方便往后做排重
createTable()
{
echo "create table $TABLENAME(src text, des text);" | sqlite3 $SYMBOL_DB_FILE
}

insertValue()
{
echo "insert into $TABLENAME values('$1' ,'$2');" | sqlite3 $SYMBOL_DB_FILE
}

query()
{
echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE
}

ramdomString()
{
openssl rand -base64 64 | tr -cd 'a-zA-Z' |head -c 16
}

rm -f $SYMBOL_DB_FILE
rm -f $HEAD_FILE
createTable

touch $HEAD_FILE
echo '#ifndef Demo_codeObfuscation_h
#define Demo_codeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE
cat "$STRING_SYMBOL_FILE" | while read -ra line; do
if [[ ! -z "$line" ]]; then
ramdom=`ramdomString`
echo $line $ramdom
insertValue $line $ramdom
echo "#define $line $ramdom" >> $HEAD_FILE
fi
done
echo "#endif" >> $HEAD_FILE


sqlite3 $SYMBOL_DB_FILE .dump
复制代码
六、设置脚本权限,先cd到项目,而后输入chmod 755 confuse.sh

七、运行项目,会自动生成一个codeObfuscation.h文件,拉入工程目录

八、在func.list里添加要混淆的方法名,属性名,在运行会自动在codeObfuscation.h里生成随机方法名称

九、注意事项

1.导入codeObfuscation.h前先设置权限
2.确保func.list文件与confuse.sh文件在同一个文件夹里面
3.目录中不要含有空格

结束

相关文章
相关标签/搜索