文件IO(apk加固)

339 阅读4分钟

IO体系

N$C(J@_LFS}XM}NM8UX4F_R.png

装饰模式

文件IO中,一层套一层的读写用的叫装饰模式image.png

装饰模式就像穿衣服一样,一层套一层。有一个底层抽象(人),然后可以有单独的实现(穿睡衣,不必穿其他的),也可以有抽象父类+无限的装饰实现(穿内衣,长袖,毛衣,棉袄)

Context就是装饰模式

image.png

流式部分

字节流与字符流的对应关系

一个字符=2个字节。
英文占一个字节,中文和标点,符号等占两个字节。如果全是用英文存写的,那就用字节流就行,但是如果里面有中文,那么用字节流读取出来就全是乱码了。没有意义了。所以字节流,字符流本质区别就是读写的方式规则不同

字节流与字符流的对应关系图
YM3960PB.png

zzz.png

字节流

对应关系表
image.png

以什么样的方式写的,就要用什么方式读。顺序也要一样,要不然底层全是01,本来前8个01代表的意义是int但是读成boolean显然就乱了。

outPut(输出)代码 image.png
inPut(输入)代码
image.png

读写完事一定要in.close() 把流关上
BufferedInputStream---用缓存读数据,如果不用缓存直接用FileInputStream也能完成任务,但是FileInputStream是一个字符一个字符的读,会频繁的磁盘IO,非常慢,耗性能!!!但是BufferedInputStream是一块一块这样读,速度快

字符流

对应关系表
image.png

outWriter image.png

new FileWriter(PATH) == new OutputStreamWriter( new FileOutputStream( new File(PATH)), "GBK")
只不过FileWriter内部将文件自动转换成File-->FileOutputStream流-->OutputStreamWriter
编码格式用默认的,但是需要自定义编码格式的话,就得写完整的 image.png

inReader
image.png

File

Java文件类以抽象的方式代表文件名和目录路径名。 该类主要用于文件和目录的创建、文件的查找和文件的删除等。
File对象代表磁盘中实际存在的文件和目录

RandomAccessFile

随机读写文件,RandomAccessFile区别于File类的地方在于,RandomAccessFile可以定义文件的长度,指针的位置(从第100个字符后开始写)seek()定义指针位置

因为可以自定义指针从哪个位置读写,所以可以断点续传!!!(1线程从0-100读取,2线程100-200读取)
(File只能从头开始读写)

NIO——FileChannel

Channel(翻译 渠道,管道)。读大文件的时候用FileChannel能显著的提高读写速度。(几十倍)

FileInputStream == 一壶一壶的搬油。
BufferedInputStream == 一卡车一卡车的搬油。
FileChannel == 输油管道运。

实战 - dex文件加密(apk加固)

apk加固

反编译

apk解压以后的文件,其中.dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。 image.png

反编译流程:1.解压apk 2.将.dex文件转成.jar(有工具) 3.用jd-gui工具看.jar文件 image.png

具体操作
blog.csdn.net/qq_34801506…

加固方案

常见的加固方案有三种:1.反模拟器,遇到模拟器不执行核心代码。2.代码虚拟化,代码虚拟化在桌面平台 应用保护中已经是非常的常见了,主要的思路是自建一个虚拟执行引擎,然后把原生的可执行代码转换成自定义的指令进行虚拟执行。3.加密,现在app主要的加固方案,给代码加密

加固的思路

1.解压自己的apk包,提取出.dex文件
2.将.dex文件转成byte[],然后对二进制加密
3.通过新建的.aar提取出.jar,然后转成.dex文件,做一个.dex空壳
4.将加密的.dex和空壳.dex和apk其他文件,重新打包成新的apk
5.将新apk签名 image.png

.dex文件的文件结构
image.png

APK打包流程 面试题
1.资源文件被aapt解析成R.java + .aidl文件被aidl解析成java文件 + 本来的java文件
2..java被编译器解析成.class文件
3..class+lib被解析成.dex文件
4..dex文件+其他(res等)被打包成没签名apk
5.apk签名
image.png

apk加固源码

1.解压自己的apk包,提取出.dex文件

image.png

第一步 main.java image.png

解压代码,Zip.java
image.png

将.dex文件转成byte[],然后对二进制加密

image.png
具体代码
image.png

2.处理aar文件,获得壳dex

image.png
具体代码
image.png

3.打包签名

image.png

通过cmd签名
image.png