iOS开发代码混淆Python工具实现与使用指南

5 阅读4分钟

ios代码混淆小工具

一  绪言

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

这种方式不是最佳方案,更好的方案是confuse.h里写入一段脚本就可以了,给下链接好了, www.jianshu.com/p/f3ad9c107… blog.csdn.net/seven_eleve…

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

二  ios代码混淆的一点看法

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

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

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

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

除了手动编写脚本进行代码混淆,开发者还可以考虑使用专业的混淆工具如IpaGuard。IpaGuard是一款 iOS IPA文件混淆工具,无需源码即可对代码和资源进行混淆加密,支持多种开发平台,有效增加反编译难度。它提供代码混淆、资源文件混淆、调试信息清理等功能,混淆强度可控,且混淆后可直接安装测试,方便快捷。

三  提供给你的一个小工具

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

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

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


import os
import numpy as np
class TransformTool(object):
def __init__(self, readpath, savepath):
        self.readpath = readpath
        self.savepath = savepath
return
def ReadFileNames(self):
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)
                    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):
        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')
for str in strlist:
                        list2 = list(str)
if len(list2) > 0 and list2[0] == '-':
                            templist1 = self.ResetFuntionString(str)
                            textlist1 = textlist1 + templist1
elif len(list2) > 0 and list2[0] == '+':
                            templist1 = self.ResetFuntionString(str)
                            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)
        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)
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]
if len(index1) > 0:
            arr1[index1] = '#'
elif len(index0) > 0:
            arr1[index0] = '#'
        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)
                arr1[indexs_arr] = '#'
        index4 = np.where(arr1 == '#')
        index4 = index4[0]
        arr1 = np.delete(arr1, index4)
        index5 = np.where(arr1 == '')
        index5 = index5[0]
        arr1 = np.delete(arr1, index5)
        index6 = np.where(arr1 == ';')
        index6 = index6[0]
        arr1 = np.delete(arr1, index6)
        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()
        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()