字节流有哪些?
以输出流为例,输入流除
PrintStream外,和输出流是一一对应的
OutputStream
ByteArrayOutputStreamPipedOutputStreamFilterOutputStreamBufferedOutputStreamDataOutputStreamPrintStream
FileOutputStreamObjectOutputStream
使用案例
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(
new File(file))));
字符流有哪些?
同样以输出流举例,出了打印流
PrintWriter外,其他的输入流和输出流有着一一对应的关系
Writer
CharArrayWriterPipedWriterFilterWriterBufferedWriterOutputStreamWriterFileWriter
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的打包流程




















