类名加密
众所周知的是大部分iOS代码一般不会做加密加固,因为iOS
APP一般是通过AppStore发布的,而且苹果的系统难以攻破,所以在iOS里做代码加固一般是一件出力不讨好的事情。万事皆有例外,不管iOS、adr还是js,加密的目的是为了代码的安全性,虽然现在开源畅行,但是不管个人开发者还是大厂皆有保护代码安全的需求,所以iOS代码加固有了生存的土壤。下面简单介绍下iOS代码加密的几种方式。
iOS代码加密的几种方式
1.字符串加密
字符串会暴露APP的很多关键信息,攻击者可以根据从界面获取的字符串,快速找到相关逻辑的处理函数,从而进行分析破解。加密字符串可以增加攻击者阅读代码的难度以及根据字符串静态搜索的难度。
一般的处理方式是对需要加密的字符串加密,并保存加密后的数据,再在使用字符串的地方插入解密算法。简单的加密算法可以把NSString转为byte或者NSData的方式,还可以把字符串放到后端来返回,尽量少的暴露页面信息。下面举个简单例子,把NSString转为16进制的字符串:
2.符号混淆
符号混淆的中心思想是将类名、方法名、变量名替换为无意义符号,提高应用安全性;防止敏感符号被class-mp工具提取,防止IDA Pro等工具反编译后分析业务代码。目前市面上的IOS应用基本上是没有使用类名方法名混淆的。
别名
在编写代码的时候直接用别名可能是最简单的一种方式,也是比较管用的一种方式。因为你的app被破解后,假如很容易就能从你的类名中寻找到蛛丝马迹,那离hook只是一步之遥,之前微信抢红包的插件应该就是用hook的方式执行的。
b.C重写
编写别名的方式不是很易读,而且也不利于后续维护,这时你可能需要升级一下你的保护方式,用C来重写你的代码吧。这样把函数名隐藏在结构体中,用函数指针成员的形式存储,编译后,只留下了地址,去掉了名字和参数表,让他们无从下手( from 念茜)。如下例子:
c.脚本处理
稍微高级一点的是脚本扫描处理替换代码,因为要用到linux命令来编写脚本,可能会有一点门槛,不过学了之后你就可以出去吹嘘你全栈工程师的名头啦。。。
linux脚本比较常用的几个命令如下:
脚本混淆替换是用上述几个命令扫描出来需要替换的字符串,比如方法名,类名,变量名,并做替换,如果你能熟练应用上述几个命令,恭喜你,已经了解了脚本的一点皮毛了。
如以下脚本搜索遍历了代码目录下的需要混淆的关键字:
替换的方式可以直接扫描文件并对文件中的所有内容替换,也可以采用define的方式定义别名。例如:
d.开源项目ios-class-guard
该项目是基于class-mp的扩展,和脚本处理类似,是用class-mp扫描出编译后的类名、方法名、属性名等并做替换,只是不支持隐式C方法的替换,有兴趣的同学可以使用下。
3.代码逻辑混淆
代码逻辑混淆有以下几个方面的含义:
对方法体进行混淆,保证源码被逆向后该部分的代码有很大的迷惑性,因为有一些垃圾代码的存在;
对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低,这很容易把破解者带到沟里去;
它拥有和原始的代码一样的功能,这是最最关键的。
一般使用obfuscator-llvm来做代码逻辑混淆,或许会对该开源工具做个简单介绍。
4.加固SDK
adr中一般比较常见的加固等操作,iOS也有一些第三方提供这样的服务,但是没有真正使用过,不知道效果如何。
当然还有一些第三方服务的加固产品,基本上都是采用了以上一种或几种混淆方式做的封装,如果想要直接可以拿来使用的服务,可以采用下,常用的一些服务如下:
几维安全
iOS加密可能市场很小,但是存在必有道理,在越狱/开源/极客的眼中,你的APP并没有你想像的那么安全,如果希望你的代码更加安全,就应给iOS代码加密。
⑵ Android APP加密方法都有哪些
伪加密是Android4.2.x系统发布前的Android加密方式之一,通过java代码对APK(压缩文件)进行伪加密,其修改原理是修改连续4位字节标记为”P K 01 02”的后第5位字节,奇数表示不加密偶数表示加密。
Android APP加密方法都有哪些?
2
虽然伪加密可以起到一定防破解作用,但也会出现问题,首先使用伪加密对其 Android APK加密后市场无法对其进行安全检测,导致部分市场会拒绝这类APK上传;其次,伪加密的加密方式和解密方式也早已公布导致它的安全程度也大大降低;再次,Android4.2.x系统无法安装伪加密的APK;最后伪加密只是对APK做简单保护,在java层源码加壳保护、核心so库、资源文件、主配文件、第三方架包方面却没有任何保护处理。Android APP加密方法都有哪些?
END
混淆保护
1
把原来有具体含义的类名,变量名,方法名,修改成让人看不懂的名字,例如方法名getUserName编程了方法名。Android APP加密方法都有哪些?
2
混淆保护只是增加了代码阅读难度,对于破解基本上是没有实质性作用的!Android APP加密方法都有哪些?
END
运行时验证
1
运行时验证,主要是指在代码启动的时候本地获取签名信息然后对签名信息进行检验来判断自己的应用是否是正版,如果签名信息不是正版则提示盗版或者直接崩溃。当然你可以把必要的数据放在服务器端。Android APP加密方法都有哪些?破解:找到smali文件中,判断是否相等的部分。改为常量true,即失效。
2
总之,反编译一些apk之后,只要是java代码写的总会有smil文件。对于smil文件,如果耐心读的话,还是可以查看到一些关键代码的。
3
相较于应用来说,游戏apk因为采用cocos2d-x或者 unity3D,采用的是c++和c# 编写的跨平台程序,在apk采用JNI的方式。所以没有smali,可以防止静态被破解apk包。Android APP加密方法都有哪些?
4
当然游戏包apk在运行的时候,会把.*so加载到内存中。动态也是可以在内存中抓取相应的数据。只不过NDK相对于smali破解来说,根部不是一个层级的关系。Android APP加密方法都有哪些?
END
使用第三方Android加密平台
以一个例子分析
该classes.dex是原来的代码。没有混淆,没有做任何的Android APP加密保护。反编译的话,源代码暴露无疑。
该classes.dex是经过爱加密Android APP加密之后的,现在看看反编译之后的效果。Android APP加密方法都有哪些?
NativeApplication类,加载exec.so和execmain.so ,里面应该是固定的代码,是对源码
SuperApplication继承自Application,程序主入口:
6
在Android APP加密之后的apk包中,多了一个assets目录,该目录下,有一些ijiami.dat,其实这个就是原来的classex.dex. Android APP加密方法都有哪些?
END
总结
1
爱加密Android APP加密步骤:
1.把原来的classex.dex 用Android APP加密算法实现加密成assets/ijiami.dat
2.把事先写好的jni代码和相应的classex.dex替换到原有的位置
3.程序安装完运行起来以后,先运行Android APP加密 爱加密的加壳程序,在jni里面动态加载原来的classex.dex代码,从而达到Android APP加密保护的目的。源classex.dex
⑶ java如何加密int类型数据
String加密 实际上也是对String的 byte[] 加密。
通常一种加密算法,都针对的是字节数组,而非String 或者int。
因为所有上述这些类型都可以用 byte[]表示,只要开发一次就可以针对所有类型加密了
把int转化成 byte[]加密就可以了
byte[4] intbytes = new byte[4]; 然后用位移运算,得到int的每一个byte
int value = 1000 ;
intbytes[0] = (byte)(value & 0x000000FF)
intbytes[1] = (byte)((value & 0x0000FF00) >> 8)
intbytes[2] = (byte)((value & 0x00FF0000) >> 16)
......
String换算成byte就更容易了 String.getBytes("utf-8") ; 参数是字符集名字 可以不用指定,但是你就不确定它到底用的哪种字符集。
⑷ 使用.net内置的DES进行加密
好了,明白了它的License种类,我们得看看它是如何验证合法的License的,换句话说就是它的License是如何构成的。它通过定位/bin目录下的License文件,License文件由类名(FreeTextBox)+ “.lic”构成。FreeTextBox.Lic文件内容分三个部分,第一部分为明文FreeTextBox License,也就是类名+ License”字符串,第二部分为[License种类的加密文本],加密算法采用的.NET内置的DES,用于DES加密的密钥和偏移量均为{ 0x39, 0x48, 0x42, 50, 0x38, 0x31, 70, 0x36 },当然它不是直接对文本加密的,做了一个小小的处理,这个处理就是加上原文本的长度,并预留5位,不够则补零,例如字符串DistributionLicense,那用于加密的就是00019DistributionLicense,因为字符串DistributionLicense的长度是19位,前面还有3个空位就补3个零。这样加密后的结果就是=,注意需要用[]分隔,FreeTextBox设计者出于方便使用正则匹配所以使用[]来分隔,第三部分就是你注册标识的加密文本,当然也有[],处理方式跟第二部分的一样,例如我的域名为Ycweb.Net,我想以此作为标识来生成License,于是对字符串00009Ycweb.Net进行DES加密,结果为tyn3Gf1Y5GH2VphAJ2U++g==,所以综合这个三个部分的内容,就构成了一个完整的License文件内容,整理一下就是: FreeTextBox License [=] [tyn3Gf1Y5GH2VphAJ2U++g==] 这是Distribution的License,如果是Professional的License,内容就是: FreeTextBox License [tyn3Gf1Y5GH2VphAJ2U++g==] 补充: 我现在是要加密的方法,求一个函数,将原文:00019DistributionLicense,加密为密文:=],不知所谓,连内容都不看就回答了 补充: 又多一个不看内容的,文章里面不是说了吗: