目前,移动端应用开发、保护、防作弊等等各个方案、方法都已经非常成熟。
加密,作为最基本的数据保护机制,随处可见。
如果应用程序的数据传输协议中还在发送明文数据,要么是无关紧要的协议,否则就会显得很low。
从逆向的角度看问题、处理问题,有时候需要把Android应用程序中的加解密算法,迁移到PC端使用。虽然加解密算法是固定不变的,但是因为Android系统环境和PC系统环境的差异,有时候单纯的复制粘贴代码,是无法完成迁移的。如果都像MD5算法一样,就不存在迁移的问题。
本文以Android应用开发中常用的AES/CBC/PKCS7Padding加解密算法为例,详细描述迁移的整个流程。相信能够帮助不少小伙伴。
(1)反编译复制伪代码
反编译是分析应用程序的第一步,如果伪代码不是很凌乱,可以直接复制,并根据需要予以调整。
本文涉及到的伪代码,源于一个(在国内)不太合法Android应用程序,不易于传播,因此无法给出样本APK;
重点在于迁移流程。复制代码如下到PC端。
(2)测试加解密算法
写一段代码测试算法是否是有效,代码如下:
运行的时候抛出异常:
java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding
这是因为PC端的JDK/JRE环境,没有提供该算法的支持。既然算法都是通用的,不依赖于编程语言,我们就需要去寻找第三方提供的实现(除非你想自己实现该算法)。
(3)添加加密算法第三方实现
有一个非常有名的第三方加密算法实现,并且非常的全面:Legion of the Bouncy Castle。
官方网址:http://bouncycastle.org/java.html。
Maven仓库查询网址:http://mvnrepository.com/artifact/org.bouncycastle。
有需要的小伙伴,拿走不谢。
本文选择的是1.57版本,maven依赖如下(当然也可以手动下载JAR添加到项目中):
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.57</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-ext-jdk15on</artifactId>
<version>1.57</version>
</dependency>
仅仅添加算法库是不够的,还需要在代码中提供其Provider,代码如下:
(4)替换安全策略库
虽然添加了加解密算法实现,提供了Provider,还这时候还是不能正常运行的,因为会抛出以下异常:
java.security.InvalidKeyException: Illegal key size
这不是算法本身的问题,也不是第三方实现的问题,还是JDK/JRE的问题。据说是因为美国对强加密算法的出口限制,这都不是关键,关键是我们怎么解决它。办法如下:
1、访问:http://www.oracle.com/technetwork/java/javase/downloads/index.html。
2、下载:Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files forJDK/JRE 8。然后解压下载的zip文件。
备注:因为笔者使用的是JDK 8。
3、替换JAVA_HOME/jre/lib/security/目录下的local_policy.jar和US_export_policy.jar两个文件。替换前,请务必备份原文件。
到这里,所有的迁移工作都已经完成。可以愉快地在PC端使用Android应用程序里的加解密算法啦。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)