使用jni技术进行android应用签名信息核查及敏感信息保护
而没有混淆的程序一旦被反编译后。源代码中大量的敏感信息将会暴露无遗。比方与server交互的url地址信息,假设使用了动态链接库,那么native方法也将暴露。况且混淆时是不混淆native方法的。别人看到native方法,就能够自己载入so文件,那么非常多核心的东西,别人就能够间接的使用了,尽管他不一定能用好,但至少能够调用了。
针对上面的林林总总程序被反编译后可能出现的问题,我的解决方法是使用jni技术。在ndk环境下做包签名信息核查,因为是ndk环境,所以这个非常难反编译,也非常难绕过该核查。理论上,签名文件keystore是唯一的,而且仅仅有程序作者才拥有。详细做法为,在所有的native方法内。添加签名信息核查推断,仅仅有签名信息核查通过。程序才干做进一步操作,否则直接返回NULL,这样,即使别人拿到了so文件,摸清楚了native方法參数及使用方法,但因为签名信息不一致。native方法所有返回NULL,so文件瞬间变成砖头。
相同。对于url地址等敏感信息,添加签名信息核查,仅仅有核查通过。程序才会返回正确的字符串,否则直接返回NULL。这样能够非常好的隐藏和保护敏感信息。
说了半天,关键的一步是怎样在ndk环境下,获取包签名信息,以下的代码为相关实现。
jstring loadSignature(JNIEnv* env, jobject obj)
{
// 获得Context类
jclass cls = (*env)->GetObjectClass(env, obj);
// 得到getPackageManager方法的ID
jmethodID mid = (*env)->GetMethodID(env, cls, "getPackageManager", "()Landroid/content/pm/PackageManager;"); // 获得应用包的管理器
jobject pm = (*env)->CallObjectMethod(env, obj, mid); // 得到getPackageName方法的ID
mid = (*env)->GetMethodID(env, cls, "getPackageName", "()Ljava/lang/String;");
// 获得当前应用包名
jstring packageName = (jstring)(*env)->CallObjectMethod(env, obj, mid); // 获得PackageManager类
cls = (*env)->GetObjectClass(env, pm);
// 得到getPackageInfo方法的ID
mid = (*env)->GetMethodID(env, cls, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
// 获得应用包的信息
jobject packageInfo = (*env)->CallObjectMethod(env, pm, mid, packageName, 0x40); //GET_SIGNATURES = 64;
// 获得PackageInfo 类
cls = (*env)->GetObjectClass(env, packageInfo);
// 获得签名数组属性的ID
jfieldID fid = (*env)->GetFieldID(env, cls, "signatures", "[Landroid/content/pm/Signature;");
// 得到签名数组
jobjectArray signatures = (jobjectArray)(*env)->GetObjectField(env, packageInfo, fid);
// 得到签名
jobject sign = (*env)->GetObjectArrayElement(env, signatures, 0); // 获得Signature类
cls = (*env)->GetObjectClass(env, sign);
// 得到toCharsString方法的ID
mid = (*env)->GetMethodID(env, cls, "toCharsString", "()Ljava/lang/String;"); // 返回当前应用签名信息
return (jstring)(*env)->CallObjectMethod(env, sign, mid);
}
fingerprint是不一致的。主要是由于将签名信息使用toCharsString()转换成字符串后在进行md5加密所致。假设使用toByteArray()将其转成数组。然后加密,加密结果与包签名实际md5 fingerprint将是一致的。
使用jni技术进行android应用签名信息核查及敏感信息保护的更多相关文章
- 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数
1. 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...
- JNI 技术与 Android 应用
1. 什么是 JNI JNI是Java Native Interface的缩写.从Java 1.1开始,JNI标准成为java平台的一部分,它允许Java和其他语言进行交互.JNI一开始为C和C++而 ...
- 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码
原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...
- [转][android][利用JNI技术在Android中调用、调试C++代码]
在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过 ...
- JNI技术简介-android学习之旅(92)
分为5步 !!!注意本地方法是java中的方法,本地函数指的是c语言中的对应函数 1.在java类中声明本地方法 2.使用javah命令,生成包含jni本地函数原型的头文件 3. 实现jni本地函数 ...
- 利用JNI技术在Android中调用、调试C++代码
参考:http://blog.micro-studios.com/?p=4212 代码:http://pan.baidu.com/s/1sjukSDf
- 敏感信息泄露 - Pikachu
概述: 由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到. 比如:---通过访问url下的目录,可以直接列出目录下的文件列表;---输入错误的url参数后报错信息里面包含 ...
- pikachu 目录遍历 敏感信息泄露
目录遍历漏洞概述在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能变的更加灵活. 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执 ...
- Pikachu-URL重定向、目录遍历、敏感信息泄露模块
一.不安全的URL跳转 1.概述 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方.如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地 ...
随机推荐
- c/c++使用VS2013连接MySQL与ubuntu下c链接mysql
vs连接数据库事实上就是将mysql数据库.h头文件接口.lib链接文件和dll运行文件增加到项目中.以下是配置怎样增加. 转于http://www.cnblogs.com/justinzhang/a ...
- json转换成list map集合
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Set; i ...
- Ubuntu下is not in the sudoers file 问题解决
在Ubuntu12.04 下,使用sudo apt-get install XXX 时,突然跳出 username is not in the sudoers file的问题 然后我一查此userna ...
- MySQL查看连接数
MySQL查看连接数 1.查看部分连接数(数目较多时) show processlist; 2.查看所有连接数(数目较多时) show full processlist;
- Delphi 类与对象内存结构浅析(三篇)
http://blog.csdn.net/starsky2006/article/details/5497082 http://blog.csdn.net/starsky2006/article/de ...
- [Cocos2d-x]Mac下运行HelloCpp For Android
2013年12月22日 一.简介: Mac下运行Cocos2d-x的samples和新建的HelloCocos2dx项目 二.内容: 环境: OS:mac OS X 10.9.1 IDE:Androi ...
- DRP之Oracle_11g数据库安装
不知道大家在安装了Oracle数据库的时候有没有这样或那样的困惑,今天这篇文章就把Oracle数据库的安装过程理一下,作为总结,方便以后的学习. 首先,将下载的两个文件放在一个目录下解压,然后打开文件 ...
- VSTO 向office文档中插入内容
原文:VSTO 向office文档中插入内容 Word: Word.Selection sec = ThisAddIn.appWord.Selection; sec.Insert ...
- Java读取本地文件,并显示在JSP文件中
当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片.其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相对路径,还可以是网络上的图片路径.在存 ...
- File already exists: filesystem '/path/file', transaction svn常见错误解决方法
前言 多人任务基本都会用到SVN,于是提交的时候如果不先更新在提交或者操作顺序不对,会经常出现错误,其中File already exists: filesystem这个就是个常见问题,上网找了半天没 ...