代码混淆

iOS代码混淆的探索

只愿长相守 提交于 2019-12-05 05:52:40
目的 为了进一步增加应用的安全性,防止我们的应用程序很容易的被攻击者分析、破解、重打包,提高攻击者逆向分析应用的难度 应用的加固方案 数据加密:静态字符串、本地存储和网络传输的加密 静态混淆:类名、方法名、属性的混淆 动态保护:反调试、注入检测、hook检测、越狱检测、签名检测等 代码混淆:将代码分快、扁平化、增加干扰代码,以提高分析者的分析难度 下面结合具体应用场景说明下各个加固方案 数据加密 :在我们的应用中已经有了,对数据进行加密之后,实质上我们已经给攻击者提高了逆向分析的难度了,但是攻击者依然可能通过动态调试或者编写IDA脚本的方式来还原算法。 静态混淆 :程序中的类名和方法名,在逆向分析中只要通过class-dump获取程序中的所有类、定义的方法和属性,就能很快从名字中猜到某个方法的作用是什么,所以,我们就需要做混淆了。 tips: 1. 类名和方法名混淆有很多坑,一个类是通过文件、网络或者字符串动态获取的,如果被混淆了就会出错,相同名称但不同功能的参数进行混淆,也会造成错误,还有其他很多坑需要踩踩才知道了 2. 目前AppStore对应用代码混淆的审核比较严格,一旦做了混淆,有可能会导致延迟审核或者直接驳回,具体可参考 混淆上架风险参考1 和 混淆上架风险参考2 有可能就很不幸就收到这样的审核反馈 3. 那怎么办呢?别慌

iOS攻防 - (三)iOS应用的代码打包前混淆,不影响源代码

99封情书 提交于 2019-12-05 05:52:23
iOS攻防 - (三)iOS应用的代码打包前混淆,不影响源代码 出于iOS应用的安全考虑,如:银行类型APP, 金融相关APP, 登录功能,支付功能等; 某些时候,我们需要对iOS应用的重要函数或名称进行混淆,因为即使是App Store下载的应用亦可以使用class-dump进行导出应用的所有头文件,这就太不安全了。为了加大程序结构的逆向或破解难度,此文讲解如何对iOS应用的源代码进行混淆处理 1.混淆的常规思路 花指令,花代码,在程序中加入迷惑人的代码指令 易读字符替换 此文讲解对易读字符替换 Objective-C/Swift的方法名、属性名或类名混淆 混淆的时机是在编译前 混淆后,不影响源代码 混淆生成的规则,可以是随机不重复的字符串 混淆后,为了方便后续排查问题,需要使用SQLite3进行记录 混淆脚本,需要加入 ProjectName --> Build Phases --> Run Script --> 添加你要混淆脚本文件的完整路径 方法selector,如 无参数函数,直接通过#define funcName 方法selector,如 有一个参数,直接通过#define funcName 方法selector,如 有多个参数,分别通过#define funcNameA、funcNameB、funcNameC 2.脚本代码如下: #!/bin/bash #

iOS 对源代码进行混淆

我的未来我决定 提交于 2019-12-05 05:52:08
转载自: http://www.jianshu.com/p/a17640cb32b9 该方法只能针对有.m.h的类进行混淆,静态库等只有.h文件的没法进行混淆 代码混淆,刚刚看到是不是有点懵逼,反正我是最近才接触到这么个东西,因为之前对于代码和APP,只需要实现功能就好了,根本没有考虑什么安全问题。 而这一次应用交付时,客户进行安全评估提出一个问题: 使用classdump对原程序进行dump,可以dump出所有源程序的函数所有信息:源程序所有函数类型,变量全部泄露。这样的话,让攻击者,也就是黑客们了解了程序结构方便逆向。 因为在工程中,我们这些变量或函数命名都是有一定可读性的,例如跟用户名相关的,那一般里面会有 userName,跟密码相关的一般会有 passWord,这样定义也是为了我们自己代码可读性更强,我们修改的时候才更加的方便。但是我们相信,这么个定义法,我们只是希望方便我们自己,我们可不希望方便黑客们去破解我们的APP。 那我们先来看看用这个所谓的 classdump 对原程序进行 dump,究竟用 dump 出些什么东西来: 所有的 .h 文件 .h 文件全暴露了,那点开的话,你里面的函数名,属性名也一样清清楚楚: 属性、函数 惊了个呆,那为了防止这样全裸,这时候我们就需要用到代码混淆了。 大概什么个意思呢?简单点讲,就是把你的这些个用户名和函数名弄得没有可读性

代码混淆工具

本小妞迷上赌 提交于 2019-12-05 05:51:59
VirboxProtector Standalone 加壳工具可对代码加密的技术有:代码混淆、代码虚拟化、代码加密。 代码混淆 :利用花指令和代码非等价变形等技术,将程序的代码,转换成一种功能上等价,但是难于阅读和理解的代码,可充分干扰静态分析。 虚拟化 :将指令编译为虚拟代码,放在指定虚拟机中运行,目前对指令有一定的格式要求,有的函数可能不能被保护。 代码加密 :将代码块作为数据,用许可加密函数存储,程序执行到该函数时验证许可并解密,内存中不会暴露完整的代码块,目前有的函数不可添加到保护中。 Virbox Protector Standalone 将被保护的程序代码转换为虚拟机代码,程序运行时,虚拟机将模拟程序执行,进入和离开虚拟机都有高级代码混淆。虚拟机配合代码混淆可以达到很好的保护效果,尤其是开发者的私有逻辑。高级混淆利用花指令和代码非等价变形等技术,将程序的代码,转换成一种功能上等价,但是难于阅读和理解的代码,可充分干扰静态分析。应用程序的解压缩含有动态密码,让一切自动脱壳工具失效,有效的阻止.Net、PE 程序的直接反编译。 使用Virbox Protector Standalone时,选择被保护的函数列表,添加需要保护的函数,可以使用性能分析功能,对程序进行分析,并选择重要的函数来保护。 性能分析:点击性能分析按钮,运行需要保护的程序,执行正常的业务操作

Python代码混淆工具

被刻印的时光 ゝ 提交于 2019-12-05 05:50:20
简介 介绍Python代码混淆工具,可以对源代码进行混淆处理,保证功能不变但代码基本不可读。 注意大部分混淆工具都是可逆的,例如编译生成pyc文件可以用 https://github.com/wibiti/uncompyle2 来解码。 pyminifier pyminifier是一个对Python文件进行压缩、混淆的工具,项目地址 https://github.com/liftoff/pyminifier 。 ​ 使用方式比较简单,通过pip安装。 pip install pyminifier 然后直接运行命令,把混淆后的输出重定向文件即可。 pyminifier ./sparse_classifier.py > new.py 默认命令只是对代码顺序进行重排和减少注释,如果需要混淆代码需要加上参数。 pyminifier -O ./sparse_classifier.py > new.py 注意,目前pyminifier只能处理单个文件,而且部分脚本混淆后不可运行,需要手动测试。 Oxyry Python Obfuscator Oxyry Python Obfuscator是一个在线混淆代码的工具,地址是 http://pyob.oxyry.com/ 。 ​ 注意目前Oxyry也只能混淆单个Python文件,测试过混淆后代码可用。 Opy Opy也是一个代码混淆工具

iOS开发系列--代码混淆

柔情痞子 提交于 2019-12-05 05:50:07
由于iOS系统的封闭性,相对于安卓来说,iOS开发过程中代码混淆可能就显得并不是得非有不可了。但是在安全性(可通过 class-dump 反编译暴露出类的方法名)和特殊需求上(例如马甲包的混淆过审)还是有一定需求的! 此脚本借鉴于 kaich/codeobscure 。在使用原作者脚本的过程中,发现了一些BUG和不足,比如正则表达式的判断不准确,生成过多无用的替换宏,需要花费过多时间去人工排错... 由于本人对python并不是很熟,所以只是在原作者的基础上作了一些完善修改。 优化内容: 修改正则表达式,更精准地找出关键词。 替换规则更改:随机字符串==>随机生成2个单词拼接。防止苹果审核过程被误认加入混淆乱码。 增加-k选项,通过ignoreKey.txt文件添加需要过滤的关键词,可避免每次生成都要手动删除部分关键词的麻烦。 增加property关键词、懒加载方法名过滤,减少无用宏的生成。 增加IBAction方法关键词的二次过滤(原脚本存在自定义方法跟IBAction方法重名,无法排除的情况)。 以下内容大部分来源于 kaich/codeobscure 实现原理 其实插件的实现方式十分简单,提取用户编写的文件中的方法名,使用宏定义将其更换为任意的无规则字符串。但这种方式有一些需要注意的点: 对于系统库产生的方法名,不可替换;对于系统使用到的关键字,也不可以替换;否则会报错;

脚本代码混淆-Python篇-pyminifier(1)

大城市里の小女人 提交于 2019-12-05 05:49:36
前言 最近研究了一下脚本语言的混淆方法,比如 python,javascript 等。脚本语言属于动态语言,代码大多无法直接编译成二进制机器码,发行脚本基本上相当于暴露源码,这对于一些商业应用是无法接受的。因此对脚本代码进行加固,成为很多应用的首选。代码加固的一项措施是代码混淆,增加逆向人员阅读代码逻辑的难度,拖延被破解的时间。 今天讲解一下Python代码的混淆方法,Python代码一般用作web,提供服务接口,但也有一些桌面的应用,这一部分就需要对代码进行混淆保护。以一个开源项目pyminifier (https://github.com/qiyeboy/pyminifier)来说明混淆的技巧方法,这个项目已经有4年没更新,有一些bug,但是依然值得我们学习和入门。 项目结构 框架详情: analyze.py - 用于分析Python代码 compression.py - 使用压缩算法压缩代码 minification.py - 用于简化Python代码 obfuscate.py - 用于混淆Python 代码 token_utils.py - 用于收集Python Token    从项目代码中,可以看到pyminifier的混淆方法是基于Token的,即基于词法分析,假如大家之前做过混淆的话,这应该属于混淆的初级方案,因为这样的混淆并不会修改代码原有的逻辑结构。

ZFJPyMix-Python代码混淆加密

孤街浪徒 提交于 2019-12-05 05:49:23
本次更新V1.0.1(2019年11月14日) 1.优化函数混淆,过滤‘__’开头函数; 2.优化网络服务更换https; 3.优化登录注册UI视图; 更新说明 https://gitee.com/zfj1128/ZFJPyMix ----------------------------------------分割线---------------------------------------- 前言 Python 作为一门脚本语言,我们可以用它做很多事,比如数据分析、多媒体处理、web开发、网络编程、游戏编程、人工智能等等方面都被广泛的应用;如果我们用Python来开发商业化项目的时候,难免会遇到一些闲得蛋疼的 小人 ,总想着来破解你的项目或者软件,来破坏别人的劳动成果;所以针对商业化项目做一些必要的加密和混淆是在所难免的! 混淆加密 网上有很多混淆的方法和技术,混淆都是为了增加代码的阅读难度;还有就是加密了,最基本的方法是发布pyc文件, 也就是将所有的.py源文件转换成pyc对外发布;还有一种方案是方案是借助cython. cython可以将python文件转换成c, 并编译成pyd文件;这里我们主要讲的是通过 ZFJPyMix 来混淆Python源码,以达到增加代码的阅读难度的目的! 混淆工具 ZFJPyMix 具有混淆文件名、混淆类名、混淆属性变量名

iOS马甲包混淆方案怎么做?

心已入冬 提交于 2019-12-05 05:49:13
如何查看竞争对手马甲包 首先,由于是从主APP上拉的分之进行开发,所以这个马甲包的scheme和工程名都没有变化,于是我们首先从这里进行开刀。我们把project名称完全换成了另一个。 API 首先base64加密API肯定不能再使用了,苹果都说了,加密特征太过明显。 幸好之前已经把所有自定义的API名称都加上了ab_前缀,使得我们写脚本很好识别。我们将所有扫描出的API放到一个plist文件中保存在本地,然后我们建立了6个数组,每个数组中有6个单词,每次从每个数组中随机抽取一个单词。将6个单词拼接成一段方法名保存在另一个plist文件中,当然,在保存前,先去重,如果这个方法名已经用过了,那我们随机再换,这样一共可以生成46656种方法名,对于我们的工程已经够用了。 图片 我们利用脚本遍历本地所有png文件,当然你可以自行添加.jpg格式遍历。根据自己的命名规则将所有图片重新命名了一波。另外我们也发现网上有个轮子可以利用shell命令对所有图片资源进行超轻量级的压缩,在不影响图片质量的情况下,改变图片的hash值。当然我们的马甲包中图片没有和主界面相似的,所以的这一步我们没有实践。 类前缀替换 这一步主要是更改文件名。程序扫描绝对地址下的所有文件,只要是带”XX”开头的文件都替换成”AB”这种,另外每次替换一个文件都要遍历所有文件,将所有用到这个头文件的文件内容进行更换。 注意

LLVM代码混淆分析及逻辑还原

安稳与你 提交于 2019-12-05 05:48:57
LLVM代码混淆分析及逻辑还原 概述 LLVM Obfuscator是一款工业级别的代码混淆器,在过去几年的CTF里我们经常会遇到经过代码经过它混淆的情况。这片博文记录了我们对混淆器原理的研究以及从中发现的有关混淆器的设计实现的脆弱之处。基于我们的研究结果,我们在Binary Ninja平台上写了一个插件,通过这个插件可以自动化的解决掉由于代码混淆带来的逆向分析困难。 LLVM Obfuscator简介 LLVM Obfuscator是一个基于LLVM框架实现的一个开源代码混淆器,整个项目包含了三个相对独立的LLVM pass, 每个pass实现了一种混淆方式,通过这些混淆手段,可以模糊原程序的流程或者某一部分的算法,给逆向分析带来一些困难。 由于上述的三个pass是基于LLVM IR实现的, 因此从理论上来说, 这种混淆器是支持世界上任何一种语言和机器架构的。 关于每种pass的详细文档,可以查看下面的这三个链接: Instructions Substitution(指令变换) Bogus Control Flow(流程伪造) Control Flow Flattening(流程平坦化) 上面的这几个链接里面是各个pass的作者维护的一份简单文档,如果你觉得文档不够详尽,建议直接参考相应的源码即可,可能对你来说会又直观又准确。 如果说看代码,其实是比较费劲的一个事情