iOS攻防 - (三)iOS应用的代码打包前混淆,不影响源代码

99封情书 提交于 2019-12-05 05:52:23

iOS攻防 - (三)iOS应用的代码打包前混淆,不影响源代码


出于iOS应用的安全考虑,如:银行类型APP, 金融相关APP, 登录功能,支付功能等;

某些时候,我们需要对iOS应用的重要函数或名称进行混淆,因为即使是App Store下载的应用亦可以使用class-dump进行导出应用的所有头文件,这就太不安全了。为了加大程序结构的逆向或破解难度,此文讲解如何对iOS应用的源代码进行混淆处理生气


1.混淆的常规思路

  • 花指令,花代码,在程序中加入迷惑人的代码指令
  • 易读字符替换

此文讲解对易读字符替换微笑


Objective-C/Swift的方法名、属性名或类名混淆

  • 混淆的时机是在编译前
  • 混淆后,不影响源代码
  • 混淆生成的规则,可以是随机不重复的字符串
  • 混淆后,为了方便后续排查问题,需要使用SQLite3进行记录
  • 混淆脚本,需要加入 ProjectName --> Build Phases --> Run Script --> 添加你要混淆脚本文件的完整路径
  • 方法selector,如  无参数函数,直接通过#define funcName
  • 方法selector,如 有一个参数,直接通过#define funcName
  • 方法selector,如 有多个参数,分别通过#define funcNameA、funcNameB、funcNameC

2.脚本代码如下:微笑
#!/bin/bash

# 这是Shell脚本,如果不懂shell,自行修炼:http://www.runoob.com/linux/linux-shell.html
# 以下使用sqlite3进行增加数据,如果不了解sqlite3命令,自行修炼:http://www.runoob.com/sqlite/sqlite-tutorial.html

#数据表名
TABLENAME="CodeObfuscationOC"

#数据库名
SYMBOL_DB_FILE="CodeObfuscation.db"

#要被替换的方法列表文件
STRING_SYMBOL_FILE="$PROJECT_DIR/func.txt"

#被替换后的宏定义在此文件里
HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/CodeObfuscation.h"


#维护数据库方便日后做bug排查
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
}

#生成随机16位名称
randomString()
{
    openssl rand -base64 64 | tr -cd 'a-zA-Z' | head -c 16
}

#删除旧数据库文件
rm -f $SYMBOL_DB_FILE

#删除就宏定义文件
rm -f $HEAD_FILE

#创建数据表
createTable


#touch命令创建空文件,根据指定的路径
touch $HEAD_FILE
echo '#ifndef CodeObfuscation_h 
#define CodeObfuscation_h' >> $HEAD_FILE
echo "//confuse string at `date`" >> $HEAD_FILE

#使用cat将方法列表文件里的内容全部读取出来,形成数组,然后逐行读取,并进行替换
cat "$STRING_SYMBOL_FILE" | while read -ra line;
do
    if [[ ! -z "$line" ]]
    then
        random=`randomString`
        echo $line $random

        #将生成的随机字符串插入到表格中
        insertValue $line $random

        #将生成的字符串写入到宏定义文件中,变量是$HEAD_FILE
        echo "#define $line $random" >> $HEAD_FILE
    fi
done

echo "#endif" >> $HEAD_FILE

sqlite3 $SYMBOL_DB_FILE .dump


3.配置Build Phases微笑
ProjectName --> Build Phases --> Run Script --> 添加你要混淆脚本文件的完整路径



4.待混淆的函数名列表文件func.txt,该文件放在与你项目源代码文件同级目录,内容如下

isVerified1

isNeedOAuth1

resetPassword1

loginWithName


isVerified

isNeedOAuth

resetPassword


以上这些函数名的源名称如下:

#import <Foundation/Foundation.h>

typedef struct _util {
    BOOL (*isVerified)(void);
    BOOL (*isNeedOAuth)(void);
    void (*resetPassword)(NSString *password);
}ZR_Util;

@interface Util : NSObject

+ (ZR_Util *)shared;
+ (instancetype)sharedUtil;

- (BOOL)isVerified1;
- (BOOL)isNeedOAuth1;
- (void)resetPassword1:(NSString *)password;

- (NSArray *)loginWithName:(NSString *)name password:(NSString *)password token:(NSString *)token;

@end


5.编译并查看结果大笑

CodeObfuscation.h文件内容



使用class-dump,将应用的头文件导出后,




好了,就是这么简单~~吐舌头


参考:http://blog.csdn.net/yiyaaixuexi/article/details/29201699

感谢念茜作者




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!