ios代码混淆小工具

一  绪言

        写在前面的话:之前做了五年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开发)