ios混淆_ios代码混淆 - CSDN
精华内容
参与话题
  • iOS混淆工具

    2020-06-03 23:32:43
    简单配置工程路径等参数,工具自动添加混淆代码,非常方便
  • ios代码混淆小工具

    千次阅读 2018-11-12 18:14:20
     写在前面的话:之前做了五年ios开发,现在转了开发方向(数据科学/大数据),今天帮以前ios开发小组的同学,写了一个ios代码混淆小工具,下面介绍下。  这种方式不是最佳方案,更好的方案是confuse.h里写入一段...

    一  绪言

            写在前面的话:之前做了五年ios开发,现在转了开发方向(数据科学/大数据),今天帮以前ios开发小组的同学,写了一个ios代码混淆小工具,下面介绍下。

            这种方式不是最佳方案,更好的方案是confuse.h里写入一段脚本就可以了,给下链接好了,传送门1传送门2

           这里提供一个获取工程中所有属性名、方法名、文件名的工具,有排重功能。

    二  ios代码混淆的一点看法

    很多时候因为赶项目,或者因为工程的历史原因,我们的代码没有着手做代码混淆,或者代码混淆处理大量的文件名字、属性名字、方法名字浪费大量时间,又觉得没意义。

    我们希望得到的结果:1  最好写代码的时候按照自己的喜好与习惯写,没有固定前缀限制

                                          2  代码混淆后让别人越看不懂越好

                                          3  方法名字最好不要一个一个手动复制粘贴到混淆配置文件里

    三  提供给你的一个小工具

    提供的小工具是python3.6版本的,用于批量获取Xcode工程中的所有属性、方法、文件名字

    小工具使用方法:1  需要混淆的.h、.m都存放到一个独立的文件夹里,这里文件夹不能有子文件夹

                                  2 在代码里修改存放代码文件夹的路径与存储结果的路径

    import os
    import numpy as np
    
    # 工具类说明:用于ios代码混淆提取文件名、方法名、属性名,提取的内容已经去掉重复的名字
    # 工具适用说明:适用时需要传入存储代码的最后一层文件夹路径,以及一个读取结果存储路径
    class TransformTool(object):
    
        def __init__(self, readpath, savepath):
    
            self.readpath = readpath     # 代码文件夹路径
            self.savepath = savepath     # 结果文件存储路径
    
            return
    
        def ReadFileNames(self):  # 文件格式的转换:.h与.m文件转换为txt文件
    
            global refilenames
            for a, b, c in os.walk(self.readpath):
                print(a)  # 路径
                print(b)  # []
                print(c)  # 子文件夹名字
                refilenames = list(c)
                if len(c) > 0:
                    c = list(c)
                    if c[0] == '.DS_Store':
                        c.remove(c[0])
                    print('c=', c)
                    for filename in c:
                        name1 = str(filename)
                        #print('name1=', name1)
                        f_name = name1.split('.')
                        if f_name[1] == 'm':
                            newname = f_name[0] + 'm' + '.txt'
                            filename = self.readpath + filename
                            newname = self.readpath + newname
                            os.rename(filename, newname)
                        elif f_name[1] == 'h':
                            newname = f_name[0] + 'h' + '.txt'
                            filename = self.readpath + filename
                            newname = self.readpath + newname
                            os.rename(filename, newname)
    
            refilenames = np.array(refilenames)
            keep1 = np.unique(refilenames, return_counts=True, return_inverse=True)
            refilenames = keep1[0]
            refilenames = refilenames.tolist()
            refilenames = '\n'.join(refilenames)
            return refilenames
    
        def WriteNewValues(self):  # 读取txt文件内容,并把方法名结果与属性名结果写入文件
    
            filenames = os.listdir(self.readpath)  # 文件夹下的文件名字
            global  textlist1
            textlist1 = list([])    # 方法名
            textlist2 = list([])    # 属性名
            for name in filenames:
                list1 = name.split('.')
                if list1[1] == 'txt':
                    p_all = self.readpath + name
                    with open(p_all, 'r') as f:
                        strlist = f.read()
                        strlist = strlist.split('\n')
                        #print('strlist=', strlist)
                        #print('strlist=', type(strlist), 'len=', len(strlist))
                        for str in strlist:
                            # print('str=', str)
                            list2 = list(str)
                            if len(list2) > 0 and list2[0] == '-':
                                templist1 = self.ResetFuntionString(str)
                                #print('templist1=', templist1)
                                textlist1 = textlist1 + templist1
                            elif len(list2) > 0 and list2[0] == '+':
                                templist1 = self.ResetFuntionString(str)
                                #print('templist2=', templist1)
                                textlist1 = textlist1 + templist1
    
                            elif len(list2) > 1 and list2[0] == '@' and list2[1] == 'p':
                                temparray = np.array(list2)
                                index1 = np.where(temparray == ';')
                                index1 = index1[0]
                                if len(index1 > 0):
                                    list3 = str.split(';')
                                    tempstr = list3[0] + ';'
                                    textlist2.append(tempstr)
    
            re_data1 = np.array(textlist1)
            keep1 = np.unique(re_data1, return_counts=True, return_inverse=True)
            re_data1 = keep1[0]
            re_data1 = re_data1.tolist()
            restr1 = '\n'.join(re_data1)
            #print('restr1=', restr1)
    
            re_data2 = np.array(textlist2)
            keep2 = np.unique(re_data2, return_counts=True, return_inverse=True)
            re_data2 = keep2[0]
            re_data2 = re_data2.tolist()
            restr2 = '\n'.join(re_data2)
            #print('restr2=', restr2)
    
            return restr1, restr2
    
        def WriteResutl(self, str0, str1, str2):  # 三种数据结果写入文件
    
            filelist = list(['filenames', 'functions.txt', 'propertynames.txt'])
            strlist = list([str0, str1, str2])
            i = 0
            for str in strlist:
                path = self.savepath + filelist[i]
                fh = open(path, 'w', encoding='utf-8')
                fh.write(str)
                fh.close()
                i = i + 1
    
            return
    
        def ResetFuntionString(self, string):   # 分割方法名字
    
            global arr1
            list1 = list(string)
            arr1 = np.array(list1)
            index0 = np.where(arr1 == '+')
            index0 = index0[0]
            index1 = np.where(arr1 == '-')
            index1 = index1[0]
            index2 = np.where(arr1 == '(')
            index2 = index2[0]
            index3 = np.where(arr1 == ')')
            index3 = index3[0]
            #print('arr1=', arr1)
            if len(index1) > 0:
                arr1[index1] = '#'
            elif len(index0) > 0:
                arr1[index0] = '#'
            #print('1: arr1=', arr1)
    
            len1 = len(index2)
            len2 = len(index3)
            if len1 == len2:
                for i in range(len1):
                    n1 = index2[i]
                    n2 = index3[i]
                    indexs_arr = np.linspace(start=n1, stop=n2, num=(n2 - n1 + 1))
                    indexs_arr = indexs_arr.astype(int)
                    #print('indexs_arr=', indexs_arr)
                    arr1[indexs_arr] = '#'
            #print('2: arr1=', arr1)
            index4 = np.where(arr1 == '#')
            index4 = index4[0]
            arr1 = np.delete(arr1, index4)
            #print('3: arr1=', arr1)
            index5 = np.where(arr1 == '')
            index5 = index5[0]
            arr1 = np.delete(arr1, index5)
            #print('4: arr1=', arr1)
            index6 = np.where(arr1 == ';')
            index6 = index6[0]
            arr1 = np.delete(arr1, index6)
            #print('5: arr1=', arr1)
    
            index8 = np.where(arr1 == '}')
            index8 = index8[0]
            arr1 = np.delete(arr1, index8)
    
            index9 = np.where(arr1 == '{')
            index9 = index9[0]
            arr1 = np.delete(arr1, index9)
    
    
            list2 = arr1.tolist()
            restr = ''.join(list2)
            list3 = restr.split(' ')
            list5 = list([])
            if len(list3) > 0:
                for str2 in list3:
                    list4 = str2.split(':')
                    if len(list4) > 0:
                        str4 = list4[0]
                        list5.append(str4)
            list5 = np.array(list5)
    
            index7 = np.where(list5 == '')
            index7 = index7[0]
            list5 = np.delete(list5, index7)
    
            redata = list5.tolist()
            print('redata=', redata)
    
            return redata
    
        def Steps(self):
    
            print('Work start!')
            str0 = self.ReadFileNames()
            str1, str2 = self.WriteNewValues() # str1 -- 方法名  str2 -- 属性名
            self.WriteResutl(str0, str1, str2)
            print('Work end!')
    
            return
    
    readpath = '/Users/alisa/Desktop/licaibang/'        # 代码文件夹路径
    savepath = '/Users/alisa/Desktop/Sam/'      # 结果文件存储路径
    TSF = TransformTool(readpath, savepath)
    TSF.Steps()

     

    展开全文
  • iOS 代码混淆

    千次阅读 2018-07-05 18:23:39
    混淆分许多思路,比如: 1.cd到你的工程目录下,创建两个文件 2.打开工程,把刚才创建的两个文件添加到工程中,在工程中再创建两个文件分别是pch文件和一个.h文件,并在pch中引入刚一同创建的.h 3.配置Phases 4.向...

    混淆分许多思路,比如:

    1)花代码花指令,即随意往程序中加入迷惑人的代码指令

    2)易读字符替换

    具体步骤:

    1.cd到你的工程目录下,创建两个文件

    confuse.sh: 存放混淆的脚本
    func.list:  需要混淆的方法、变量名
    

    这里写图片描述

    2.打开工程,把刚才创建的两个文件添加到工程中,在工程中再创建两个文件分别是pch文件和一个.h文件,并在pch中引入刚一同创建的.h

    这里写图片描述

    pch不会配置的童鞋看过来,会的童鞋可自动忽略这一步:

    这里写图片描述

    然后点击4的后边输入:$(SRCROOT)然后把pch拖进来,删除前边多余路径。
    如图:
    这里写图片描述

    (初学者尽量名字用这两个,否则可能会在后边的配置中出错)

    3.配置Phases

    这里写图片描述

    填写 $PROJECT_DIR/confuse.sh(注:这儿的confuse.sh的路径随你创建这个文件的位置而改变)

    这里写图片描述

    4.向脚本confuse.sh中添加代码

    #!/usr/bin/env bash
    
    TABLENAME=symbols
    SYMBOL_DB_FILE="symbols"
    STRING_SYMBOL_FILE="func.list"
    
    CONFUSE_FILE="$PROJECT_DIR/HXTest"
    
    HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/Confuse.h"
    
    export LC_CTYPE=C
    
    #取以.m或.h结尾的文件以+号或-号开头的行 |去掉所有+号或-号|用空格代替符号|n个空格跟着<号 替换成 <号|开头不能是IBAction|用空格split字串取第二部分|排序|去重复|删除空行|删掉以init开头的行>写进func.list
    grep -h -r -I  "^[-+]" $CONFUSE_FILE  --include '*.[mh]' |sed "s/[+-]//g"|sed "s/[();,: *\^\/\{]/ /g"|sed "s/[ ]*</</"| sed "/^[ ]*IBAction/d"|awk '{split($0,b," "); print b[2]; }'| sort|uniq |sed "/^$/d"|sed -n "/^hx_/p" >$STRING_SYMBOL_FILE
    
    
    #维护数据库方便日后作排重,以下代码来自念茜的微博
    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 Confuse_h
    #define CodeConfuse' >> $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
    

    其中

    STRING_SYMBOL_FILE="func.list"
    
    CONFUSE_FILE="$PROJECT_DIR/HXTest"
    
    HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/Confuse.h"
    #这里也要做修改
    echo '#ifndef Confuse_h

    均需要根据自己的进行修改(如果名字和位置和我的创建的一样,目前不需要修改)

    hx_是你在代码中要混淆的方法名和变量的前缀,方法变量前增加前缀是为了和系统方法区分开,可以根据自己写的方法自定义。

    5.编译

    此时编译应该会报一个没有权限的错误,此时,切换到工程目录下,输入命令行 chmod 755 confuse.sh 给我们的脚本本间授权,如图:

    这里写图片描述

    此时应该能顺利编译通过,混淆成功。

    这里写图片描述

    前边是混淆前的,后边是混淆后的名字。

    注意:

    1、 系统的方法

    2、XIB中拖线的控件名

    这些都不能用这个方法混淆,因为会导致运行的时候出错。

    参考

    念茜女神http://blog.csdn.net/yiyaaixuexi/article/details/29201699

    附反编译:

    1.1 Class-Dunp 简介

    Class-Dump是一款可以导出头文件的命令行工具,改程序用于检查objective - c运行时信息存储在Mach-O文件,它生成类的声明,类别和协议。

    1.2 Class-Dump 下载地址

    http://stevenygard.com/projects/class-dump/

    1.3 安装

    双击.dmg 文件打开,把里面的文件拖到 /usr/local/bin 目录下,因为是修改了系统的路径,所以需要输入本机的密码,这样就可以在终端使用 class-dump 命令了。

    1.4 使用

    注意这里dump的是应用后缀是.app而不是.ipa:

    然后打开终端,输入命令

    class-dump -H XXX.app -o XXX

    这里写图片描述

    -H 后面的内容为需要dump的 .app 文件路径

    -o 后面的内容为输出的头文件保存路径

    因为我是保存到桌面的,所以等命令执行完成之后,我就可以在桌面上找到Dump这个名字的文件夹了,并且里面已经装满了我们想要的头文件了

    打开ViewController.h,已经是混淆过的代码了

    2.1 什么是Hopper

    Hopper Disassembler是Mac上的一款二进制反汇编器,基本上满足了工作上的反汇编的需要,包括伪代码以及控制流图(Control Flow Graph),支持ARM指令集并针对Objective-C的做了优化。

    2.2 下载地址

    官网地址:https://www.hopperapp.com

    2.3 使用

    这个工具的强大之处,在于二进制文件在它面前,基本是毫无遮掩的,所有函数名,方法名,代码逻辑结构,你都可以一览无遗。

    展开全文
  • iOS混淆

    千次阅读 2018-01-23 10:27:35
    最近发现了苹果审核对于该方法的混淆包给予拒绝通过,解释原因苹果自己有自己的加密方法去保证安全性,防止反编译不需要你去做混淆。我猜测和最近严打马甲包也有关吧。 回顾一下混淆方法,这个方法和脚本出自念茜。...

    最近发现了苹果审核对于该方法的混淆包给予拒绝通过,解释原因苹果自己有自己的加密方法去保证安全性,防止反编译不需要你去做混淆。我猜测和最近严打马甲包也有关吧。
    回顾一下混淆方法,这个方法和脚本出自念茜。
    1、新建confuse.sh和func.list文件
    confuse.sh就是脚本文件,将需要混淆的属性名和方法名用随机字符串替换。
    func.list文件用来罗列我们的需要进行混淆的方法和属性名。
    注意:这个两个文件都需要在项目根目录下。如图
    这里写图片描述
    2、Targets->Build Phases->Run Script
    在这添加$PROJECT_DIR/confuse.sh运行脚本文件,如果没有Run Script在左上角加号处添加:
    这里写图片描述
    3、在你的PrefixHead文件添加引用codeObfuscation.h文件
    如果不清楚PCH文件的使用,请移步 iOS开发小技巧-PCH的使用
    codeObfuscation.h是脚本里面创建的文件,用来对应记录方法名和对于生成的替换随机字符串。
    这里写图片描述
    4、把confush.sh和func.list添加到工程下,Command+B会出现codeObfushcation.h文件,不行就直接新建好这个头文件一样。然后编译运行对应的方法名就被随机字符替换覆盖了。编译结果如图:
    这里写图片描述
    示例:
    需要混淆的方法名:
    - (void)openVideoChat;
    + (void)startAudioChatByNav:(UINavigationController )nav sessionID:(NSString )sessionID;
    func.list添加:
    这里写图片描述
    编译运行后codeObfuscation.h如图:
    这里写图片描述
    贴上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
    展开全文
  • iOS安全攻防(二十三):Objective-C代码混淆

    万次阅读 多人点赞 2014-06-07 17:00:52
    iOS安全攻防(二十三):Objective-C代码混淆class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄。所以,我们迫切的希望混淆自己的代码...
    iOS安全攻防(二十三):Objective-C代码混淆


    class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄。

    所以,我们迫切的希望混淆自己的代码。



    混淆的常规思路


    混淆分许多思路,比如:

    1)花代码花指令,即随意往程序中加入迷惑人的代码指令

    2)易读字符替换

    等等

    防止class-dump出可读信息的有效办法是易读字符替换。




    Objective-C的方法名混淆



    混淆的时机

    我们希望在开发时一直保留清晰可读的程序代码,方便自己。

    同时,希望编译出来的二进制包含乱七八糟的混淆后的程序代码,恶心他人。

    因此,我们可以在Build Phrase 中设定在编译之前进行方法名的字符串替换。



    混淆的方法

    方法名混淆其实就是字符串替换,有2个方法可以,一个是#define,一个是利用tops。
    利用#define的方法有一个好处,就是可以把混淆结果合并在一个.h中,在工程Prefix.pch的最前面#import这个.h。不导入也可以编译、导入则实现混淆。

    单段的selector,如func: ,可以通过#define func 来实现字符串替换。
    多段的selector,如a:b:c: ,可以通过分别#define a 、b、c 来实现字符串替换。




    我的混淆工具


    我写了个简易的混淆脚本,主要思路是把敏感方法名集中写在一个名叫func.list的文件中,逐一#define成随机字符,追加写入.h。

    脚本如下:

    #!/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
    


    操作步骤



    1.将混淆脚本confuse.sh放到工程目录下 
    mv confuse.sh your_proj_path/


    2.修改Prefix.pch
    打开Xcode,修改XXX-Prefix.ch ,添加混淆头文件:
    #ifdef __OBJC__
        #import <UIKit/UIKit.h>
        #import <Foundation/Foundation.h>
        //添加混淆作用的头文件(这个文件名是脚本confuse.sh中定义的)
        #import "codeObfuscation.h"
    #endif


    3.配置Build Phase
    在工程Build Phase中添加执行脚本操作,执行confuse.sh脚本,如图:







    4.创建函数名列表func.list,写入待混淆的函数名,如:
    -(void)sample;
    -(void)seg1:(NSString *)string seg2:(NSUInteger)num;


    就这样写:
    sample
    seg1
    seg2


    并将文件放置于与confuse.sh脚本同级
    mv func.list your_proj_path/




    5.编译查看结果
    直接build,混淆脚本会在编译前运行,进行字符随机替换,并且每次build的随机字符不同,如图:








    展开全文
  • iOS代码混淆

    千次阅读 2018-11-13 15:18:32
    这不安全检测没过����,这里面的问题就提到了代码混淆问题 准备工作 cd到你自己的项目目录级 创建confuse.sh文件和func.list文件 选中项目选择运行脚本。这里需要注意的是$PROJECT_DIR/confuse....
  • iOS代码混淆初探

    2019-09-18 11:38:55
    iOS代码混淆初探 在没有对应用的代码做过特殊处理的情况下,一般应用的代码中的类名和方法都是明文的。在逆向分析中,通过class-dump获取MachO可执行文件中的所有类、定义的方法和属性,就能很快的从名字入手猜到这...
  • ios混淆工具

    2020-07-30 23:31:46
    xcode混淆代码工具,利用mac端打开操作,混淆ios项目工程代码,更改类名,资源名,方法名等。
  • iOS混淆代码工具

    2020-07-29 14:21:49
    iOS工程进行混淆,通过修改工程名,混淆文件名,类名,方法名,以及生成辣鸡代码来实现对工程的修改
  • iOS混淆--OLLVM在iOS中的实践(Xcode9.2)

    千次阅读 2018-06-13 16:40:16
    OLLVM简介OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加对逆向工程的难度。后期转向商业项目strong.protect。...
  • ios混淆方法名生成器

    千次阅读 2016-08-02 13:54:28
    有待整理,下记录一下。 #import @interface DJRandomMethodName : NSObject /** 随机一个实例方法名*/ + (NSString *)randomMethodName; /** 随机一个类方法名*/ + (NSString *)randomClassName;...
  • 混淆工具可以修改工程名、修改类名前缀、扫描工程中的代码,生成垃圾代码。 修改 xxx.xcassets 文件夹中的 png 资源文件名。 删除代码中的所有注释和空行。
  • iOS混淆代码

    2018-06-19 10:27:21
    混淆代码之前class-dump下代码。如图,发现方法名称完美的暴露了。混淆之前混淆之后,发现syn_loginWithName:password:方法名变成了毫无意义的名称。混淆之后好,混淆的作用已经演示清楚。那么接下来就说说如何实现...
  • 橘光混淆工具-iOS混淆工具 链接导航 工具使用教程-OC 工具使用教程-Flutter 摘要 iOS混淆 iOS代码混淆 iOS过审工具 iOS上架 iOS代码混淆工具 iOS工具 iOS马甲包 iOS马甲包工具 iOS混淆 iOS过4.3 iOS过审 iOS ...
  • 2.优化类名混淆重名问题; 3.优化代码和项目结构; 更新说明 https://gitee.com/zfj1128/ZFJObsLib_dmg ----------------------------------------分割线-------------------------------------...
  • iOS代码混淆原理初探

    2019-11-25 15:49:09
    我们在手游平台SDK的iOS版本中, 除了AppStore官方支付之外还集成了第三方支付(微信支付H5和支付宝支付H5版本)。 如果用于企业签,不需要做处理,直接使用即可。 但是如果需要上架AppStore,我们需要屏蔽第三方...
  • 直接在ListInside.txt 或者 ListOutside.txt 中写上 需要混淆的 字符串 (每一个字符串单独一行,回车换行) 运行之后 控制台会输出 ,或者根据控制台打印出来的地址查询输出文件 在文件中写有完整的。ListInside和...
  • iOS实现代码混淆

    2019-04-30 16:17:04
    总是认为iOS APP一般是通过AppStore发布的,况且苹果的系统又很难攻破,根本就无需加密,但使用class-dump和Hopper这两款工具就可以导出头文件和分析代码逻辑,还有马甲包过审这快也需要代码代码混淆的功能,下面就...
  • iOS代码混淆的探索

    2019-05-05 10:36:19
    静态混淆:类名、方法名、属性的混淆 动态保护:反调试、注入检测、hook检测、越狱检测、签名检测等 代码混淆:将代码分快、扁平化、增加干扰代码,以提高分析者的分析难度 ####下面结合具体应用场景说...
1 2 3 4 5 ... 20
收藏数 13,941
精华内容 5,576
关键字:

ios混淆