字节流有哪些?
以输出流为例,输入流除
PrintStream
外,和输出流是一一对应的
OutputStream
ByteArrayOutputStream
PipedOutputStream
FilterOutputStream
BufferedOutputStream
DataOutputStream
PrintStream
FileOutputStream
ObjectOutputStream
使用案例
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(
new File(file))));
字符流有哪些?
同样以输出流举例,出了打印流
PrintWriter
外,其他的输入流和输出流有着一一对应的关系
Writer
CharArrayWriter
PipedWriter
FilterWriter
BufferedWriter
OutputStreamWriter
FileWriter
PrintWriter
使用案例
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
new File(file)), "GBK"));
注意: 流使用到了装饰器设计模式
Component(抽象接口)
——> Concreate Component(具体实现类)
——>Decorator(装饰器,该抽象类持有Component的引用) ——>Concreate Component(具体实现类)
IO实践之dex文件加密
Apk文件是由哪些信息组成的?如何反编译Apk?
apk
文件是由META-INF
(签名文件)、res
(资源文件)、AndroidManifest.xml
(清单文件)、classes.dex
(应用的代码)、resources.arsc
组成,可以通过ZipFile
解压缩apk
文件得到上面的组成部分
加固的方案有哪些?
- 反模拟器 (
发现模拟器在运行我们的apk,就停止核心代码的运行
) - 代码虚拟化 (
自己创建一个虚拟执行引擎,然后将为我们的代码转换成自定义的指令进行虚拟执行
) - 加密 (
我们的核心可执行代码以压缩或加密的形式存在,我们将代码分割成多个小段,前面一段代码在执行时,先把后面一段代码从内存中解密,然后再去执行解密后的代码,如此一块一块迭代执行
)
加固总体框架是怎样的?
- 获取到
apk
的源dex
文件(ZipFile类解压缩,过滤dex文件,抛弃META-INF目录下文件
) - 对
源dex
文件进行加密
(如:AES加密
,获取到dex文件字节码数据byte[],对每一个字节进行加密) - 生成
壳dex
文件(壳module用make project生成aar包,解压缩aar包得到jar包,然后将jar包生成壳dex文件(cmd命令代码实现)
) 源dex
文件+壳dex
文件+apk除源dex
文件之外的所有文件,重新生成一个新的apk
文件(ZipFile打包成apk
)- 对
新的apk
文件进行签名(cmd命令,jarsigner)
,替换掉META-INF
中的文件才能运行,否则运行会报错
dex文件由哪些部分组成?
- 文件头 (header,包含文件的大小、签名、格式等)
- 索引区
- string_ids (字符串的索引)
- type_ids (类型的索引)
- proto_ids (方法原型的索引)
- field_ids (域的索引)
- method_ids (方法的索引)
- 数据区
- class_defs (类的定义区)
- data (数据区)
- link_data (链接数据区)
apk的打包流程