Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)

前言

最近一直在看Python,也很喜欢Python的灵活性;今天主要想说的是iOS的代码混淆,为什么想做代码混淆?为了APP的安全,为了防止别人破壳轻易破解我们代码;还有就是做 马甲包 了,我们知道马甲包的市场需求很大,但是不能花费过多的精力在开发上,毕竟只是个马甲,没必要花费太多的成本!

混淆工具

网上搜了一下,开源免费的混淆都在转载 念茜大姐大 的 sh脚本 的混淆方法,或者在念茜的脚本基础上二次开发,大家去看过就知道念茜的这篇博客是在14年写的,那时我刚做iOS没多久 ,而且那时候中国区审核还没有那么严格,若果你现在还使用那种方法进行混淆,你肯定会收到苹果的 2.3.1 大礼包 ,所以我们还是探索别的混淆方法吧,不要再挖坟了!

我这里主要是通过Python写的混淆工具,具体功能有方法混淆、属性混淆、类名混淆、添加垃圾代码、删除注释、修改资源文件Hash值、 加密字符串 、翻新资源名、 模拟人工混淆 、混淆文件名、混淆文件目录、混淆词库、混淆日志、映射列表、图片压缩、爬虫服务,具体的如下:

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第1张图片

软件界面

1.下载地址:

链接: pan.baidu.com/s/1esdfDdjO… 密码:2lbr

:clap::clap::clap:进群免费拿邀请码:clap::clap::clap:365152048:clap::clap::clap:

2.教学视频:

链接: pan.baidu.com/s/1pqUkgU8Y… 密码:9sll

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第2张图片

开始混淆

import addRubbishCode    as addCode
import cunfusionObjName  as conObjN
import confusionFun      as conFunc
import cunfusionProperty as conPro
import confusionLog      as conLog
import deleteNotes       as delNot
import updateSourceHash  as updHash
import encryptString     as encStr
import sourceName        as soName
import missFolder
from singletonModel import ZFJPersoninfo

def start_fun(file_dir, funMap = {}):
	personinfo = ZFJPersoninfo()
	personinfo.isMissing = True
	if len(file_dir) == 0:
		return
	if int(funMap['property']) > 0:
		# 混淆属性
		conLog.tips('*' * 30 + 'Fun:开始混淆属性' + '*' * 30)
		conPro.startConfusionPro(file_dir)

	if int(funMap['funName']) > 0:
		# 混淆方法
		conLog.tips('*' * 30 + 'Fun:开始混淆方法' + '*' * 30)
		conFunc.startConfusionFun(file_dir)

	if int(funMap['objName']) > 0:
		# 混淆类名
		conLog.tips('*' * 30 + 'Fun:开始混淆类名' + '*' * 30)
		prefix = funMap['funNamePrefix'].replace('0', '')  #-添加类名前缀
		personinfo.prefix = prefix #前缀存到单利里面
		fixObjName = funMap['fixObjName'] #-自动修复过滤文件夹中引用的类名
		conObjN.startObfuscatedObjName(file_dir, prefix)

	if int(funMap['souHashKey']) > 0:
		# 修改资源文件的hash值 
		conLog.tips('*' * 30 + 'Fun:修改资源HASH值' + '*' * 30)
		updHash.startUpdateSourceHash(file_dir)

	if int(funMap['upSouName']) > 0:
		# 翻新资源文件名
		conLog.tips('*' * 30 + 'Fun:翻新资源文件名' + '*' * 30)
		soName.startSourceName(file_dir)

	if int(funMap['encryStr']) > 0:
		# 加密明文字符串
		conLog.tips('*' * 30 + 'Fun:加密明文字符串' + '*' * 30)
		encStr.startEncryptStr(file_dir)

	if int(funMap['rubbishCode']) > 0:
		# 垃圾代码
		conLog.tips('*' * 30 + 'Fun:添加垃圾代码' + '*' * 30)
		amount = int(funMap['rubbishLine']) # -添加行数
		addCode.startAddRubbishCode(file_dir, amount)

	if int(funMap['deleteNotes']) > 0:
		# 混淆或者删除注释
		conLog.tips('*' * 30 + 'Fun:开始删除注释' + '*' * 30)
		delNot.startDeleteNotes(file_dir)

	if int(funMap['missFolder']) > 0:
		# 混淆文件夹名
		conLog.tips('*' * 30 + 'Fun:开始混淆文件夹名' + '*' * 30)
		missFolder.startMissFolder(file_dir)

	conLog.tips('*' * 30 + 'End:混淆结束' + '*' * 30)
	personinfo.isMissing = False
Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
复制代码

混淆日志

混淆的部分日志,混淆的时候回通过import logging自动生成混淆日志《 ZFJ混淆日志.log 》,便于开发者修改部分报错:

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第3张图片

忽略路径

我们在混淆的时候,没必要全部进行混淆,特别是第三方库,或者Pods管理的第三方库;毕竟混淆的越多问题也就越多,所以我添加了混淆忽略文件:open_file_folder:,如下图:

import confusionLog as conLog
 
ignore_Files = ['/Pods/', '/Vendor/', '/LIB/', '/Util/']
conLog.tips('已忽略的路径 === ' + str(ignore_Files))
 
# 判断是否是忽略的文件夹
def isIgnoreFiles(tmp_path):
	# if '+' in tmp_path:
	# 	return True
	for item in ignore_Files:
		if item in tmp_path:
			return True
	return False
Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
复制代码

特别说明

混淆以后肯定会有或多或少的报错,所以要求使用者必须会iOS开发技能,一般报错都是因为一下两点:

1.方法名相同,被多次混淆覆盖;

2.忽略的文件夹中包含了已被混淆的类或者方法;

3.图片如果不显示,可能原因是代码中图片名采用的是拼接的,手动替换一下就可以了;

4.如果发现文本丢失,一般是在文本中有<*** 注释 *>类型的注释了,找到原项目替换一下;

5.如果使用混淆工程目录因为PCH和Infor.plist报错,需要手动到project.pbxproj修改路径(详见路径混淆部分);

6.如果出现项目路径修改了,但是本地实体路径没有修改,自己手动把本地路径修改一下;

7.utf-8编码错误和[Errno 13] Permission denied权限错误不用管;

以上错误都可以在日志文件中找到对应的混淆字段,然后手动替换上去就行!

还有就是,该混淆工具目前只适用于OC项目工程,不支持swift项目,但是我打算等OC混淆工具全部OK以后(包括图形界面),会把swift的混淆加进去的!

混淆结果

1.函数混淆

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第4张图片

2.属性混淆

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第5张图片

3.类名混淆

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第6张图片

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第7张图片

4.添加垃圾代码

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第8张图片

垃圾代码的调用与实现

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第9张图片

5.去除注释

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第10张图片

6.修改Hash值

针对项目中的资源文件,我们可以通过修改Hash的方式来进行混淆,运行如下:

:high_brightness:Tips:已忽略的路径 === ['/Pods/', '/Vendor/', '/LIB/', '/Util/']
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/MainWeb_Back_Icon.imageset/fanhui-4.png
:tada:Infor:[UPdHash Meg] Old:dd03889c2e8647b9377d08775333557ff11425dd<->New:4a72c7b640882ae436b18868aa021331169db3fa
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/60.png
:tada:Infor:[UPdHash Meg] Old:2d73347848d7168c09c48efe28a7ac5a9ec7411b<->New:551483123b5cc2c4c5ff2f5bf876db0d075261a1
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/58.png
:tada:Infor:[UPdHash Meg] Old:c0c671fe3707bca8c5accdcadd8aa9f4f1f2726c<->New:d022db1c1f99c263b69bc09c09bc52dd1fa97fb5
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120-1.png
:tada:Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:8bbddfbbbed9023e4537e9e6caeed79c88ef8955
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120.png
:tada:Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:dcc4b47092bca1d6a6bb6d7bd671a0ef7ce2f4da
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/180.png
:tada:Infor:[UPdHash Meg] Old:fee9220dbba52040517a0f77ffe8335e9300a64b<->New:d28a9118e1cf4a2ce9fc2805184ad42e20500c95
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/GUEG_ICON.png
:tada:Infor:[UPdHash Meg] Old:07ed6c66ec7d5550bfa1e32b4848687417027c90<->New:fb780d87591cc86dd0fd24cdfa41e76a091ad657
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/80.png
:tada:Infor:[UPdHash Meg] Old:ca3b3f61fc4c391515fe895d81360d15ec598049<->New:769ebf182fbb3a3fd69c46c3a595c1669c505f63
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/40.png
:tada:Infor:[UPdHash Meg] Old:1bb7908a2ba1295fa69ad476a81003f2f413a3a8<->New:10793e67b27cdf5ad1ee4b9d37aecc62074b8ffc
:tada:Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/87.png
......等等......
Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

6.加密字符串

编译前的代码如下:

- (void)uiConfig{
    ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:@"ZFJ1128"];
    zfjView.backgroundColor = [UIColor yellowColor];
    zfjView.frame = CGRectMake(100, 100, 150, 150);
    [zfjView setZFJViewTitleLab];
    [zfjView setZFJViewTitleLab:@"aaaaaa"];
    [zfjView setZFJViewTitleLab:@"aaa" efg:@"dscvdscsd"];
    [zfjView setZFJViewTitleLab:@"ddscvsdv" efg:@"cdsvdfbdf" hijk:@"cdvsvbdsbdfgnfdhnhdg"];
    [self.view addSubview:zfjView];
    
    [ZFJView svdsvfdsvfdvbzdfb];
}
复制代码
编译后的代码如下:

- (void)uiConfig{
    ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:ZFJ_NSSTRING(((char []) {240, 236, 224, 155, 155, 152, 146, 0}))];
    zfjView.backgroundColor = [UIColor yellowColor];
    zfjView.frame = CGRectMake(100, 100, 150, 150);
    [zfjView setZFJViewTitleLab];
    [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 203, 203, 203, 0}))];
    [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 0})) efg:ZFJ_NSSTRING(((char []) {206, 217, 201, 220, 206, 217, 201, 217, 206, 0}))];
    [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {206, 206, 217, 201, 220, 217, 206, 220, 0})) efg:ZFJ_NSSTRING(((char []) {201, 206, 217, 220, 206, 204, 200, 206, 204, 0})) hijk:ZFJ_NSSTRING(((char []) {201, 206, 220, 217, 220, 200, 206, 217, 200, 206, 204, 205, 196, 204, 206, 194, 196, 194, 206, 205, 0}))];
    [self.view addSubview:zfjView];
    
    [ZFJView svdsvfdsvfdvbzdfb];
}
Python资源分享qun 881982657 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

加密混淆反编译前后Hopper对比如下:

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第11张图片

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第12张图片

我们可以看到再通过Hopper看不到硬编码了!:+1::+1::+1:

8.翻新资源名

找到工程中的图片资源并翻新,然后自动替换代码中的引用。

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第13张图片

9.混淆工程目录

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第14张图片

说明:如果你的项目包含PCH,还有自带的Info.plist,需要你手动到project.pbxproj修改路径;

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第15张图片

10.图片压缩工具

ZFJObsLib集成图片压缩工具,支持一键生成iOS开发三套图标,也支持自定义压缩尺寸,还可以移除Alpha通道,转成RGB图片模式;实现逻辑可参考: zfj1128.blog.csdn.net/article/det…具体如下图:

Python-编写Python脚本进行iOS代码混淆(iOS防黑加固之代码混淆篇)_第16张图片

你可能感兴趣的:(python,ios开发)