Python实现性能自动化测试竟然如此简单

如何简单用Python来实现性能自动化测试 一、思考什么是性能自动化测试? 性能 系统负载能力 超负荷运行下的稳定性 系统瓶颈 自动化测试 使用程序代替手工 提升测试效率 性能自动化 使用代码模拟大批量用户 让用户并发请求 多页面多用户并发请求 采集参数,统计系统负载能力 生成报告 二、Python中的性能自动化测试库 locust库 使用Python 使用代码来创建批量用户 分布式 可以在多台服务器上,进行分布式性能测试 可伸缩性强 稳定、应用广泛 经得住各种场 阅读详情

前言

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

混淆工具

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

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

Python资源共享群:484031800

 

 

 

 

 

软件界面

1.下载地址:

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

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

2.教学视频:

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

 

 

 

 

 

开始混淆

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
复制代码

混淆日志

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

 

 

 

 

 

忽略路径

我们在混淆的时候,没必要全部进行混淆,特别是第三方库,或者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
复制代码

特别说明

混淆以后肯定会有或多或少的报错,所以要求使用者必须会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.函数混淆

 

 

 

 

 

2.属性混淆

 

 

 

 

 

3.类名混淆

 

 

 

 

 

 

 

 

 

 

4.添加垃圾代码

 

 

 

 

 

垃圾代码的调用与实现

 

 

 

 

 

5.去除注释

 

 

 

 

 

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
......等等......
复制代码

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];
}
复制代码

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

 

 

 

 

 

 

 

 

 

 

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

8.翻新资源名

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

 

 

 

 

 

9.混淆工程目录

 

 

 

 

 

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

 

 

 

 

 

10.图片压缩工具

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

 

 

 

 

系统加固基础知识 - 2015.12.08-chen 系统加固基础知识 - 2015.12.08-chen系统加固基础知识 - 2015.12.08-chen 立即下载

相关推荐

Immich vs Nextcloud照片管理实测:自建私有云相册到底选哪个?

本文深度评测了Immich与Nextcloud在私有云相册管理中的表现,涵盖核心功能、性能基准、本土化实践及进阶功能。Immich凭借微服务架构和AI优化在照片管理、移动端体验上表现优异,而Nextcloud则强在生态整合。文章还提供了Docker部署优化和国内网络适配方案,帮助用户根据需求选择最佳方案。

seed的博客 329

字节5年经验之谈 —— Python实现性能自动化测试竟然如此简单!

max_wait = 5000 # 使用min_wait、max_wait覆盖父类的类属性。task_set = MyTasks # 指定测试任务类,使用task_set覆盖父类的类属性。现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛。学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。创建测试任务类,需要继承TaskSet。

2401_84264429的博客 803

Python实战:逐笔高频因子构建与回测全流程解析

本文详细解析了使用Python构建与回测逐笔高频因子的全流程。从逐笔数据的价值与清洗入手,通过实战代码演示了‘大买成交金额占比’因子的计算逻辑,并重点阐述了因子正交化处理的重要性以剔除风格影响。最后,提供了一个经典的分位数回测框架来验证因子有效性,并分享了数据质量、计算效率与过拟合等核心避坑指南。

grass的博客 391

python 性能测试自动化

python性能自动化

weixin_43997024的博客 529

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别总结

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别。

qq_30713721的博客 3471

异步复位同步释放:如何确保复位信号的可靠性与时序安全

本文深入探讨了异步复位同步释放技术在数字电路设计中的关键作用,详细分析了复位信号的可靠性与时序安全问题。通过对比异步复位与同步复位的本质区别,揭示异步复位的优势与潜在风险,并提供了标准的Verilog实现方案。文章还涵盖了多时钟域下的复位同步策略、复位网络时序约束方法以及实际工程中的经验教训,为数字系统设计者提供了全面的复位信号处理指南。

weixin_29213655的博客 400

Python实现性能自动化测试竟然如此简单【颠覆你的三观】

一、思考❓❔ 1.什么是性能自动化测试? 性能系统负载能力 超负荷运行下的稳定性 系统瓶颈 自动化测试使用程序代替手工 提升测试效率 性能自动化使用代码模拟大批量用户 让用户并发请求 多页面多用户并发请求 采集参数,统计系统负载能力 生成报告 2.Python中的性能自动化测试库? locust库 使用Python 使用代码来创建批量用户 分布式 可以在多台服务器上,进行分布式性能测试 可伸缩性...

爱码小哥 793

①Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网

MS-A1-50X1系列作为MODBUS TCP通信的服务器进行动作。可通过MODBUS TCP 通信,将 MS-A1-50X1 系列产品通过 RS485 采集的仪器仪表之类的值作为通信数 据输出到 PLC,上位机等。

2401_89571741的博客 1398

关于自动化测试的简单介绍

一、思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力 超负荷运行下的稳定性 系统瓶颈 自动化测试 使用程序代替手工 提升测试效率 性能自动化 使用代码模拟大批量用户 让用户并发请求 多页面多用户并发请求 采集参数,统计系统负载能力 生成报告 2.Python中的性能自动化测试库? locust库 使用Python 使用代码来创建批量用户 分布式 可以在多台服务器上,进行分布式性能测试 可伸缩性强 稳定、应用.

daidadeguaiguai的博客 394

避坑指南:Ubuntu 22.04上源码编译Autoware.universe(Humble版)的完整流程与常见错误修复

本文详细介绍了在Ubuntu 22.04上源码编译Autoware.universe(Humble版)的完整流程与常见错误修复方法。从环境准备、依赖安装到编译优化,提供了实用的避坑指南和解决方案,帮助开发者高效完成安装并避免常见问题。特别针对源码安装过程中的疑难杂症给出了具体修复建议。

weixin_33712987的博客 382

YOLOv8改进---BiFPN特征融合

yolov8结合BiFPN进行改进

qq_41920323的博客 4523

Python实现性能自动化测试果然如此简单

摘要:本文介绍Python性能自动化测试工具Locust的使用方法。主要内容包括:1.性能自动化测试概念,即通过模拟多用户并发请求测试系统负载能力;2.Locust特点,支持分布式测试、WebUI展示结果;3.安装配置指南,使用pip安装并创建测试脚本;4.实战演示,编写测试任务类,通过命令行启动测试并查看Web界面统计报告。Locust具有接口简单、易于编写测试代码等优点,是高效的性能测试解决方案。文末还提供了软件测试学习资源获取方式。

nhb687095的博客 702

Android CCodec (十七) 硬件解码调用分析-1(基于V4l2)

简单的分析V4L2DecodeComponent和其相关内容,后续针对解码调用单独分析。

给大佬递杯卡布奇诺的博客 6593

Python实现性能自动化测试,还可以如此简单

​ 1.安装locust 使用官方pypi源来安装 pip install locustio 使用豆瓣pypi源来安装(推荐) pip install -i https://pypi.douban.com/simple locustio 安装成功之后,在cmd控制台将会新增一条命令,可输入如下命令查看: locust --help 2.基本用法 ​

weixin_67553250的博客 620

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: Python实现性能自动化测试竟然如此简单!
下一篇: Python对接六大主流数据库,只需三步!
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值