移动安全-第四天 移动安全 程序防护

代码级防护

应用加固技术

这是一张加固方法的发展史

https://blog.csdn.net/earbao/article/details/82379117

 

dex文件加密方法

对App dex进行加固的基本步骤如下: 

1. 从App原始apk文件里获取到原始dex文件 

2. 对原始dex文件进行加密,并将加密后的dex文件和相关的存放到assert目录里 

3. 用脱壳dex文件替换原始apk文件里的dex文件;脱壳dex文件的作用主要有两个,一个是解密加密后的dex文件;二是基于dexclassloader动态加载解密后的dex文件 

4. 因为原始apk文件已经被修改,所以需要删除原始apk的签名信息,即删除META-INF目录下的.RSA、.SF 和MANIFEST.MF文件 

5. 生成加固后的apk文件 

6. 对加固后的apk文件进行签名,apk加固完成。

1.为什么要对原始dex进行加密,同时用脱壳dex文件替换原始dex文件?大部分的apk反编译工具(dex2jar、apktools、jui等)都是对dex文件进行反编译,将dex文件反编译成smail,然后再转化成class文件进行阅读和修改。用脱壳dex替换原始dex文件之后,用上面的反编译工具反编译apk文件,只能看到脱壳程序的class文件,看不到apk本身的class文件。对dex文件进行加密,这样即使第三方拿到了dex文件,以为无法解密,也就无法对其进行解析和分析。 

2.怎么确保apk功能正常运行?加固后的apk启动之后,脱壳dex文件会对加密后的dex文件进行解密,然后机遇dexclassload动态加载解密后的dex文件。从用户的角度,加固前后App的功能和体验基本是一样的。

3.dex加固主要是防止被静态反编译,进而获取源码并修改

https://blog.csdn.net/qq309909897/article/details/73273964 

 

类抽取加密技术

 

VMP加壳:VMP加壳在三代基础上,抽取代码后,并没有对代码进行还原,而是通过厂商自研的“虚拟机”来进行解析opcode,然后通过JNI 接口反射执行各个方法。VMP加壳对于对代码保护的效果、加壳后的运用价值相对于历代加壳技术就高出不止一个台阶了。

虚拟机保护技术就是将基于x86汇编系统的可执行代码转换为字节码指令系统的代码,以达到保护原有指令不被轻易逆向和修改的目的,这种指令也可以叫伪指令,和VB的pcode有点类似。从本质上讲,虚拟指令系统就是对原本的x86汇编指令系统进行一次封装,将原本的汇编指令转换为另一种表现形式。

 


 

push uType
push lpCaption
push lpText
push hWnd,
call MessageBox
这是一段x86的汇编指令,编译器在翻译的时候会产生一个固定模式的汇编代码(在同一个CPU指令集下)。
但如果我们对原本的C代码使用VMP SDK进行虚拟化,那么在编译这段代码的时候就会使用等效的VM虚拟指令来达到同样的功能。

vPushMem uType
vPushMem lpCaption
vPushMem lpText
vPushMem hWnd,
vCall vCode
注意,虚拟指令的也有自己的机器码,但和原本的x86汇编机器码完全不一样,而且常常是一堆无意义的代码,它们只能由VM虚拟解释器(Dispatcher)来解释并执行。


https://blog.csdn.net/liutianshx2012/article/details/48466327
http://baijiahao.baidu.com/s?id=1586743591867534431&wfr=spider&for=pc

 

控制流平坦化概念和思路

控制流平坦化,就是在不改变源代码的功能前提下,将C或C++代码中的if、while、for、do等控制语句转换成switch分支语句。这样做的好处是可以模糊switch中case代码块之间的关系,从而增加分析难度。

这种技术的思想是,首先将要实现平坦化的方法分成多个基本块(就是case代码块)和一个入口块,为每个基本快编号,并让这些基本块都有共同的前驱模块和后继模块。前驱模块主要是进行基本块的分发,分发通过改变switch变量来实现。后继模块也可用于更新switch变量的值,并跳转到switch开始处。

花指令概念和思路

 

花指令也叫垃圾指令,是指在原始程序中插入一组无用的字节,但又不会改变程序的原始逻辑,程序仍然可以正常运行,然而反汇编工具在反汇编这些字节时会出错,由此造成反汇编工具失效,提高破解难度。

花指令的主要思想是,当花指令跟正常指令的开始几个字节被反汇编工具识别成一条指令的时候,才可以使得反汇编工具报错。因此插入的花指令都是一些随机的但是不完整的指令。但是这些花指令必须要满足两个条件:

在程序运行时,花指令是位于一个永远也不会被执行的路径中。

这些花指令也是合法指令的一部分,只不过它们是不完整指令而已。

标识符混淆概念和思路

标识符混淆就是对源程序中的包名、类名、方法名和变量名进行重命名,用无意义的标识符来替换,使得破解这分析起来更困难。最常用的就是ProGua

 

字符串混淆概念和思路

 

很多时候,为了避免反汇编后的代码容易被破解者分析读懂,往往会源程序中一些比较关键的字符串变量进行混淆,使得破解者分析成本提高。这里的字符串混淆有两种,一种是Java层的字符串混淆,另一种是native层的字符串混淆,也就是so文件中的字符串混淆。上面我们介绍了Proguard免费混淆工具,它可以混淆类名、方法名和变量名,但是不支持字符串混淆,要使用字符串混淆就需要使用DexGuard商业版混淆器。

编码混淆:

加密处理:

还有一种方式是我们可以修改dex文件。对于Java层的字符串加密,我们可以在dex文件中,找到要加密的字符串在字符串常量表中的位置,然后对它用加密算法加密。然后在自定义Application的attachBaseContext方法中在运行时对密文进行解密,或者可以在native层加密,提高破解难度。

 

代码混淆技术总结 可以看下面的这个 还是不错的 引用了一部分

https://blog.csdn.net/github_30662571/article/details/70921710

具体的加固算法分析

https://blog.csdn.net/justfwd/article/details/50073363