TestApkSign

4 篇文章 0 订阅
3 篇文章 0 订阅
package com.zhangqu.a.b.c;


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;


import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
import android.content.Context;


/**
 * @author 小阿哥
 * @date   2014-2-25
 */
public class TestApkSignActivity extends Activity {
    /** Called when the activity is first created. */

private static TestApkSignActivity activity;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        activity=this;
        
        setContentView(R.layout.main);
        
        test(); 
    }
    
    private void test()
    {
//     byte a[]=getApkSign(this);       
//        if(a!=null)
//        {
//         String publicKey=getPublicKey(a);                        
//         System.out.println("publicKey:"+publicKey);        
//        }
//        
//        
//        try{
//         String ss=getApplicationInfo().publicSourceDir;        
//            byte b[]=getApkSignature(this,ss);
//            String publicKeyb=getPublicKey(b);                           
//            System.out.println("ss:"+ss+"___publicKeyb:"+publicKeyb);
//        }catch (Exception e) {
// // TODO: handle exception
//
//        
//        
//        getSingInfo(this);
        
        getInstallApkSign(this);
    }
    
    //获取APK签名信息
    public static byte[] getApkSign(Context context) {
    android.content.pm.PackageManager pm = context.getPackageManager();
    java.util.List<android.content.pm.PackageInfo> apps = pm
                .getInstalledPackages(android.content.pm.PackageManager.GET_SIGNATURES);
    java.util.Iterator<android.content.pm.PackageInfo> iter = apps.iterator();       
        
        while (iter.hasNext()) {
        android.content.pm.PackageInfo info = iter.next();
            String packageName = info.packageName;
            //System.out.println("packageName:"+packageName+"___I:"+i);        
            //按包名 取签名
            if (packageName.equals(context.getPackageName())) {
                return info.signatures[0].toByteArray();


            }             
        }
        return null;
    }   
   
    /**
     * 得到任意apk签名信息 
     * 如果当前运行的软件要得到自身的公钥信息,只需要得到apk位置就可以了(每个软件(非内置)安装后,都会在/data/system里保存一份apk文件)
     * String path = context.getApplicationInfo().publicSourceDir
     * 
     * 此方法为依赖反射隐藏API的方法
     * 
     * 安卓系统的分裂版本过多,并且不同厂商进行的修改很多,依赖反射隐藏API的方法并不能保证兼容性和通用性,因此推荐使用JAVA自带API进行获取
     *                      
     * @param apkPath
     * @return
     * @throws Exception
     */
    public  static byte[] getApkSignature(Context context,String apkPath) throws Exception {
    Class clazz = Class.forName("android.content.pm.PackageParser");
    java.lang.reflect.Method parsePackageMethod = clazz.getMethod("parsePackage", java.io.File.class, String.class, android.util.DisplayMetrics.class, int.class);


    Object packageParser = clazz.getConstructor(String.class).newInstance("");
    Object packag = parsePackageMethod.invoke(packageParser, new java.io.File(apkPath), null,context.getResources().getDisplayMetrics(), 0x0004);


    java.lang.reflect.Method collectCertificatesMethod = clazz.getMethod("collectCertificates", Class.forName("android.content.pm.PackageParser$Package"), int.class);
    collectCertificatesMethod.invoke(packageParser, packag, android.content.pm.PackageManager.GET_SIGNATURES);
    android.content.pm.Signature mSignatures[] = (android.content.pm.Signature[]) packag.getClass().getField("mSignatures").get(packag);


    android.content.pm.Signature apkSignature = mSignatures.length > 0 ? mSignatures[0] : null;
if(apkSignature!=null)
    {
return apkSignature.toByteArray();
    }
else
{
return null;
}
    }
    
    //根据签名byte[]签名信息,获取APK公钥
    public static String getPublicKey(byte[] signature) {
        try {
        java.security.cert.CertificateFactory certFactory = java.security.cert.CertificateFactory
                    .getInstance("X.509");
        java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) certFactory
                    .generateCertificate(new java.io.ByteArrayInputStream(signature));


            String publickey = cert.getPublicKey().toString();
            publickey = publickey.substring(publickey.indexOf("modulus: ") + 9,
                    publickey.indexOf("\n", publickey.indexOf("modulus:")));


            
            return publickey;
        } catch (java.security.cert.CertificateException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    //======================================================
public static void getSingInfo(Context context) {
try {
android.content.pm.PackageInfo packageInfo = context
.getPackageManager().getPackageInfo(
context.getPackageName(),
android.content.pm.PackageManager.GET_SIGNATURES);
android.content.pm.Signature[] signs = packageInfo.signatures;
android.content.pm.Signature sign = signs[0];
parseSignature(sign.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
}


private static void parseSignature(byte[] signature) {
try {
java.security.cert.CertificateFactory certFactory = java.security.cert.CertificateFactory
.getInstance("X.509");
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) certFactory
.generateCertificate(new java.io.ByteArrayInputStream(
signature));
String pubKey = cert.getPublicKey().toString();
String signNumber = cert.getSerialNumber().toString();

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateAfter=sdf.format(cert.getNotAfter());
String dateBefore=sdf.format(cert.getNotBefore());



int version=cert.getVersion();
String type=cert.getType();



System.out.println("parseSignature==========开始日期:"+dateBefore+"___有效结束日期:" +dateAfter);
System.out.println("parseSignature==========version:"+version+"___type:"+type);
System.out.println("parseSignature==========signName:" + cert.getSigAlgName());
System.out.println("parseSignature==========pubKey:" + pubKey);
System.out.println("parseSignature==========signNumber:" + signNumber);
System.out.println("parseSignature==========subjectDN:" + cert.getSubjectDN().toString());


} catch (java.security.cert.CertificateException e) {
e.printStackTrace();
}
}
//=====================================================================

//获取手机中安装的APK签名信息
    public static void getInstallApkSign(Context context) {
    android.content.pm.PackageManager pm = context.getPackageManager();
    java.util.List<android.content.pm.PackageInfo> apps = pm
                .getInstalledPackages(android.content.pm.PackageManager.GET_SIGNATURES);
    java.util.Iterator<android.content.pm.PackageInfo> iter = apps.iterator();       
        
    ArrayList<String> listText=new ArrayList<String>();
   
    int i=0;
        while (iter.hasNext()) {
        try{
        android.content.pm.PackageInfo info = iter.next();
       
                String packageName = info.packageName;
                String versionName = info.versionName;
                String versionCode = ""+info.versionCode;                         
                String gameName=info.applicationInfo.loadLabel(pm).toString();
                
                byte signature[]=info.signatures[0].toByteArray();                
                java.security.cert.CertificateFactory certFactory = java.security.cert.CertificateFactory
    .getInstance("X.509");
    java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) certFactory
    .generateCertificate(new java.io.ByteArrayInputStream(
    signature));
   
    String pubKey = cert.getPublicKey().toString();
    String signNumber = cert.getSerialNumber().toString();
   
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String dateAfter=sdf.format(cert.getNotAfter());
    String dateBefore=sdf.format(cert.getNotBefore());
   
    int version=cert.getVersion();
    String type=cert.getType();
   
   
    StringBuilder sb=new StringBuilder();
   
    sb.append("==============").append("\r\n");
    sb.append("==============").append("\r\n");                
    sb.append("第"+i+"个,游戏名字:【"+gameName+"】__packageName:【"+packageName+"】___versionName:"+versionName+"____versionCode:"+versionCode).append("\r\n");    
    sb.append("parseSignature==========开始日期:"+dateBefore+"___有效结束日期:" +dateAfter).append("\r\n");
    sb.append("parseSignature==========version:"+version+"___type:"+type).append("\r\n");
    sb.append("parseSignature==========signName:" + cert.getSigAlgName()).append("\r\n");
    sb.append("parseSignature==========pubKey:" + pubKey).append("\r\n");
    sb.append("parseSignature==========signNumber:" + signNumber).append("\r\n");
    sb.append("parseSignature==========subjectDN:" + cert.getSubjectDN().toString()).append("\r\n");
                
    listText.add(sb.toString());
    sb=null;
   
                ++i;
        }catch (Exception e) {
// TODO: handle exception
        System.out.println("EX:"+e.toString());
}
       
        }
        
        //保存信息到文件。
        StringBuilder sbWriteText=new StringBuilder();
        if(listText!=null&&listText.size()>0)
        {
        for(int j=0;j<listText.size();j++)
        {
        sbWriteText.append(listText.get(j));
        }
        }        
        
        String ss=sbWriteText.toString();
        writePackageInfoToSdcard(ss);
        sbWriteText=null;        
    }   

    
    
  public static boolean writePackageInfoToSdcard(String text)
  {
  boolean isOk=false;
  if(text==null)
  {
  return isOk;
  }
  String fileName="App_Infor_"+getCurrentData("yyyy-MM-ddHHmmss")+".txt";
  try {
  isOk=writeLiveToSdcard(fileName, text.getBytes("UTF-8"));
  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  fileName=null;
  return isOk;
  }
    
    private static boolean writeLiveToSdcard(String fileName,byte files[])
  {
  try {
  String sdcardState=android.os.Environment.getExternalStorageState();
  if (sdcardState.equals(
  android.os.Environment.MEDIA_MOUNTED))
  {
  String sdcardAssFilePath=android.os.Environment.getExternalStorageDirectory().getPath()+"/age_install_app/"+fileName;
  java.io.File file=new java.io.File(sdcardAssFilePath);
  java.io.File parent = file.getParentFile();
  if(!parent.exists()) {
  file.getParentFile().mkdirs();
  }
  java.io.FileOutputStream fos=new java.io.FileOutputStream(file);
  fos.write(files);
  fos.flush();
  fos.close();
  fos = null;
  file=null;
  ShowToast(activity,"存储APP信息文件成功");
  System.out.println("存储APP信息文件成功");
  return true;
  }
  else if(sdcardState.equals(android.os.Environment.MEDIA_REMOVED))
  {
 
  ShowToast(activity,"存储APP信息 ,不存在sdcard卡,写入失败");
  System.out.println("存储APP信息 ,不存在sdcard卡,写入失败");
  }
  else
  {
  ShowToast(activity,"存储APP信息 ,当前SDcard状态为:《"+sdcardState+"》写入失败");
  System.out.println("存储APP信息 ,当前SDcard状态为:《"+sdcardState+"》写入失败");
  }
  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  return false;
  }
    
    private static String getCurrentData(String timeType){
SimpleDateFormat sdf=new SimpleDateFormat(timeType);
return sdf.format(new Date());
}
    
    private static final boolean TOAST_IS_SEQUENCE=false;//toast是否以序列显示,还是以立即更新的方式显示。


private static Toast toast;    
/** 显示一个提示框 */
public static void ShowToast(Context context, final String str) {
if ((!(context instanceof Activity)) || (str == null)) {
return;
}
final Activity activity = (Activity) context;
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if(TOAST_IS_SEQUENCE)
{
Toast.makeText(activity, str, Toast.LENGTH_SHORT).show();
}
else
{
if(toast==null)
{
toast=Toast.makeText(activity, str, Toast.LENGTH_SHORT);
}
else
{
toast.setText(str);
}
toast.show();
}


}
});
}


}

原文:http://zhang247124629.iteye.com/blog/2022735

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值