iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用
在网上搜“代码混淆”关键词,可以看到n多教程。包括本篇博客,大部分重要内容也是从网上各位大神的博客里面看到然后摘取和总结出来的。虽然网上都有,但是对于我个人来说,很难找到一篇博客概括完全的,所以还是总结一下,也算是学习的纪录。
首先看看代码混淆是什么。
总的来说,代码混淆有两种重要功能。其一,混淆代码。其二,优化代码。
进行代码混淆的程序被称为代码混淆器(混淆工具)。进行代码混淆的意义主要在于对代码进行一定程度的加密。那么,混淆器是如何进行代码加密的呢,或者说,混淆过的代码为什么会有加密的效果呢?
首先说一点我比较坚持的观点“我们写的代码是给人看的,不是给机器看的”。通常,我们写代码的时候,代码都需要有一定的规范,而且变量名、函数名一般要能让人看到就知道是什么功能。所以,当我们不进行混淆的情况下发布了一个包,别人就可以通过反编译工具对包进行反编译,基本还原我们的源码。这样肯定是对我们不利的。此时就需要用到代码混淆。
代码混淆的基本方法就是将我们写的易于读懂的代码,等价的替换为难以读懂而逻辑正确的代码,就是说,机器能够运行这段代码,但是一般人读不懂这段代码。这样,别人反编译了我们的apk包,得到的混淆后的代码看起来基本就是一堆杂乱无章、无法阅读的代码。
代码混淆的时候还会进行一些优化,例如删除某些没用被使用到的代码,以及简单的重组代码,减少中间过程。
比较重要的一点是,代码混淆并不能完全的加密代码,只是提高了程序包被反编译的难度,对代码起到一定的保护作用。
关于如何代码混淆的定义,详情可以看这里:怎么保护苹果手机移动应用程序ios ipa中的代码 | ipaguard使用教程
现在了解了代码混淆,就看看如何使用代码混淆吧。
我自己用来测试的是使用cocos2d-x 3.10创建的工程,其中包括了多平台的工程。测试代码混淆,主要用到了其中的eclipse工程,android-studio工程。(通过这种方式创建的工程在文件结构方面可能和直接使用eclipse或android-studio创建的工程有略微差别,但是影响不大)
在android 2.3之后,sdk中就已经集成了混淆器proguard(目录在sdk\tools\proguard),所以我们可以很方便的直接在工程中开启代码混淆。
eclipse android工程开启混淆功能,我们需要手动在项目文件.properties(我的是project.properties文件)中添加下面的代码
To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
某些方式创建的项目中可能已经有如上两行了,只是默认被注释掉了,只要把proguard.config这一行解注释就好了。这样代码混淆功能就开启了,在打签名包时,项目会自动进行代码混淆。
对于eclipse工程来说,代码混淆的规则,在 proguard-project.txt 文件中,我们需要根据规则去选择哪些代码需要混淆,哪些代码(一般我们引用的第三发jar包,如果已经被混淆过,就不能再混淆,否则会报错。一般我们对外开放的借口不需要混淆哦)不需要混淆。编写proguard-project.txt文件的规则,后面介绍咯。
android-studio工程开启混淆功能,我们需要在 app/build.gradle文件中添加如下代码
buildTypes {
debug {
//启用代码混淆
minifyEnabled false
//混淆规则配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//
signingConfig signingConfigs.debug
}
release {
//是否优化zip
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
//启用代码混淆
minifyEnabled true
//混淆规则配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//
signingConfig signingConfigs.release
}
}
按照上面的配置,在debug模式和release模式下build都会进行代码混淆(一般为了方便调试,在debug模式下不需要进行代码混淆)。混淆规则配置文件与eclipse工程略有不同,android-studio工程的混淆规则文件是 app/proguard-rules.pro 。虽然文件名和eclipse中的不同,但是配置规则都是相同的。
自己动手配置代码混淆应该不是问题。不过我们使用代码混淆的时候可能还有一些坑,例如工程中引用了很多外部的库,导致代码中函数数量超过了65535,混淆的时候可能会出错。此时需要分文件混淆,也就是把所有的代码分成两个部分来进行混淆。这些内容后面补充吧。
还有一点比较重要的,不止是Java代码可以混淆,理论上来说,任何代码都可以混淆,只要有对应的混淆器。关于如何使用其他混淆器,如何对其他语言的代码进行混淆,以后了解到了再补充。。。

iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用的更多相关文章
- 推荐一个C#代码混淆器 .NET Reactor【转】
C#的代码辛苦写出来之后,一个反射工具,就可以完全显露出来. 当然,在做项目时,这个功能还不错.因为我就曾在一个项目上使用C#,没有进行任何混淆.结果在项目二年多之后,需要做一些调整,自己保存的源代码 ...
- iOS App的加固保护原理
本文由 网易云发布. 本文从攻防原理层面解析了iOS APP的安全策略.iOS以高安全性著称,但它并非金刚不坏之身.对于信息安全而言,止大风于青萍之末是上上策,杭研深入各个细节的研发工作,正是网易产 ...
- iOS开发Swift篇—(三)字符串和数据类型
iOS开发Swift篇—(三)字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容 let website = "http://www ...
- iOS安全攻防(二十三):Objective-C代码混淆
iOS安全攻防(二十三):Objective-C代码混淆 class-dump能够非常方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完好的程序给同行留下笑柄. 所以 ...
- MATLAB的PLOT函数线型设置及横坐标为字符串的代码实例
2.横坐标为字符串的代码实例 cell={‘PLS’,’SVM’,’RF’,’NNET’,’NB’,’PLR’,’C5.0′,’PDA’,’KNN’,’GLM’,’BCT’};%分类方法yData=[ ...
- Python之字符串小代码解析
本篇只是拿一段代码来对python中的字符串的一些使用做解释,来让大家更加了解python Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25: ...
- Dotfuscator可以实现混淆代码、变量名修改、字符串加密
C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一些商业用途的C#软件来说,因为盯着的人多,更是极易被攻破.使用VS自带的Dotfuscator可以实现混淆代 ...
- iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)
iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController) 这里我们就直接上实例: 一:新建一个项目singleV ...
- 典型的字符串处理代码(page50)
Page50: public class TypicalString{//典型的字符串处理代码 public static boolean isPlalindrom(String s){//判断字符串 ...
- asp正则过滤重复字符串的代码
asp下过滤重复字符串的代码,有时候我们需要过滤一些重复的字符串,下面的代码即可解决这个问题 比如 1223445677777778aabbcccccccccc 经过过滤之后就是12345678abc ...
随机推荐
- CSP-2023 复赛游记
10.15 决定以后每天晚上都来. 洛天依也是. 10.16 想住 首旅京伦. 大巴车要求车况良好,保险齐全,进校后限速 20 km是什么鬼啊,新型速度单位. 距离最远的考区相距4公里 懂了,大巴车开 ...
- BABYRE
一道SMC,第一次做 主函数的伪代码,judge函数是关键函数,不过啥都没有 发现 judge 方法是判断的主要逻辑,在第 15 行时调用判断. 但是静态分析时不能生成 judge 的伪代码. 原因是 ...
- van-dialog弹窗异步关闭-校验表单
van-dialog弹窗异步关闭 有时候我们需要通过弹窗去处理表单数据,在原生微信小程序配合vant组件中有多种方式实现,其中UI美观度最高的就是通过van-dialog嵌套表单实现. 通常表单涉及到 ...
- 生命游戏(4.2leetcode每日打卡)
根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞都具有一个初始状 ...
- 从管易云到MySQL通过接口配置打通数据
从管易云到MySQL通过接口配置打通数据 数据源平台:管易云 管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌,先后开发了C-ERP.EC-OMS.EC-WMS.E店管家.BBC.B2B.B2C商 ...
- EXCEL中逆向查找的十种方法
逆向查找在Excel中指的是根据某个数值或条件,查找该数值或条件所在的单元格位置.逆向查找可以帮助用户快速定位数据,对于数据分析和处理非常有用.下面将详细介绍在Excel中进行逆向查找的十种方法. 一 ...
- Django学习(二) 之 模板的使用
写在前面 昨晚应该是睡的最好一天吧,最近一个月睡眠好差,睡不着不说,而且半夜总醒,搞的第二天就会超没精神. 昨天下午去姐姐家,小外甥直接进屋就问我说: 老舅,你都很长时间没来啦,**(前女友)怎么哪去 ...
- 一篇文章带你掌握性能测试工具——Jmeter
一篇文章带你掌握性能测试工具--Jmeter 在目前的中大型企业中,仅仅进行功能测试已经不足以满足企业的需求,在重大客户基数下性能测试将会直接影响到用户体验 所以在这篇文章中我们将会学习性能测试的相关 ...
- C++学习笔记五:变量与数据类型(Auto类型)
Auto 允许编译器自己来推断变量的类型,这种新功能是在c++11引入的.这个关键字结合for循环使用可以节省变量类型的重复输入.VS Code可以在鼠标移动到变量上之后直接显示变量的类型. auto ...
- CompletableFuture进阶
CompletableFuture进阶 1.异步任务的交互 异步任务交互指将异步任务获取结果的速度相比较,按一定的规则( 先到先用 )进行下一步处理. 1.1 applyToEither applyT ...