一 绪言
写在前面的话:之前做了五年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()