Android-安全-签名验证让二次打包变的更难
来源:互联网 发布:工业机器人技术编程 编辑:程序博客网 时间:2024/06/06 12:20
转载:http://blog.csdn.net/qq_32452623/article/details/54351364
二次打包的危害性
如果你没有对你的应用做任何的安全保障措施,那么你的应用就非常的危险
首先了解一下什么是二次打包:
二次打包
通过工具apktool、dex2jar、jd-gui、DDMS、签名工具获取源码,嵌入恶意病毒、广告等行为再利用工具打包、签名,形成二次打包应用。
二次打包的一个小演示
这是代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
1.签名打包为DR_Test.apk,运行如此下图:
2.使用apktool 反编译DR_Test.apk
3.进入smail文件,修改字符串的内容 “快看,博主真的好美啊” 改为 “快看,天啊,是垃圾广告”,
4.改完之后,然后再将修改后的文件,打包成DR_Dirty.apk
5.使用Auto_sign工具再次签名DR_Dirty.apk(再次签名肯定和应用的本身签名不同),得到DR_Dirty_signed然后运行
这就改变一个显示文本的值,是不是超级简单,也超级危险,所以我们一定要防范这种的二次打包.
防范的思路是:
进入程序就检查签名是不是我们自己的合法的签名,如果不是,就提示盗版信息,或者退出程序
Java层面的签名认证—简单–不安全
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
反编译的时候,直接将isValidated修改为true,或者修改接收这个函数的if-else语句条件取个反就行了,就绕过我们的验证,所以不安全
有人说把签名放在NDK层去检验,然后返回结果,这样会不会更安全一点,答案是,只要你用if-else判断,就和上面一样的好破解.
所以,我能想出来的,目前最好的办法,就是:
NDK层判断签名,如果成功,就返回一个指定的字符串Key.这个Key是用来和服务器通信的钥匙,如果没有这个钥匙,就不能获取数据.这样是最好的方法.
NDK层面的签名认证—复杂–较安全
如果你还没有用过NDK,也不用害怕,只是简单使用,不懂c++也没关系,有百度和Google啊,是吧
AndroidStudio集成NDK
1.下载NDK:NDK Downloads(需要科学上网)
2.Setting –>Project Structure,添加NDK路径,就是上一部下载的NDK,解压之后的路径
添加之后你会发现 local.properties多了NDK的引用路径
3.gradle.properties添加一句android.useDeprecatedNdk=true
开始使用NDK
1.build.gradle中添加ndk配置参数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2.创建一个Java文件,位置就放在: 你的Moduel/src/main/你的包名下即可
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3 .Build->Make Project一下,你会发现app/build/intermediates/classes/debug/你的包名 路径下已经有个刚才创建的类的类文件,DR_JNITest.class
在Termial窗口
输入cd app/src/main
输入javah -d jni -classpath 自己编译后的class文件的绝对路径
例如:javah -d jni -classpath D:\Android\WorkSpace\DR_TestAppDemo\app\build\intermediates\classes\debug dr.dr_testappdemo.DR_JNITest
(注意debug后的空格)这两个操作的意思是在main文件下创建 jni文件夹.里面已经自动生成了dr_dr_testappdemo_DR_JNITest.h文件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
5.jni文件夹新建c++文件,名字可以随便取,我的是test.cpp
里面引用刚才创建的.h文件#include "dr_dr_testappdemo_DR_JNITest.h"
创建.h文件中的方法,保证方法名称,返回值,参数列表一样.
下面是签名验证的逻辑,c++语言反射Java获取签名信息,然后和定义的合法签名做比对,比对成功返回key,失败返回error
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
6.Activity中调用c++方法
实际上是通过第一步我们定义的java方法调用的
- 1
代码地址
我的GitHub : https://github.com/DRPrincess/DR_TestNDKSignatureCheckDemo
参考博客
Android APK加固技术方案调研
Android studio 编译C生成.so文件
Android JNI NDK C++ so本地验证 获取应用签名
- Android-安全-签名验证让二次打包变的更难
- Android-安全-签名验证让二次打包变的更难
- Android-安全-签名验证让二次打包变的更难
- Android通过签名验证防止二次打包
- Unity中针对Android Apk的签名验证(C#实现),防止二次打包
- Unity中针对Android Apk的签名验证(C#实现),防止二次打包
- 二次打包签名apk(android)
- 获取应用程序的签名,防止二次打包
- laravel 极验(Geetest) 让验证更安全。
- Android APP如何防止二次打包------对比签名
- Android反编译、查看源码、二次打包、签名步骤说明
- Android JNI 防二次打包应用签名检测
- 让Ajax变的更简单
- Android安全--运行时验证签名
- Android O 让安装应用更安全
- Android App的签名打包
- Android App的签名打包
- Android App的签名打包
- 浅谈Log4j和Log4j2的区别
- ios 11和iphone x的相关适配
- 【bzoj4241】历史研究
- Spark源码分析之Master状态改变处理机制原理
- 内存对齐
- Android-安全-签名验证让二次打包变的更难
- Linux Centos 安装 Nginx HTTP 服务器(一)
- SAP的号码范围(number range)SNRO和SNUM自动编号工具的用法
- 网络安全-【数字证书,证书链】,为什么12306订票要弹信任证书
- java多线程之生产者和消费者经典问题案例
- JSP配置多url-pattern的正确姿势
- 小图标素材
- 近期计划
- 将字符串转换为整数