`

获取APK文件的签名信息,反射实现

 
阅读更多
private String showUninstallAPKSignatures(String apkPath) {
         String PATH_PackageParser = "android.content.pm.PackageParser";
         try {
             // apk包的文件路径
             // 这是一个Package 解释器, 是隐藏的
             // 构造函数的参数只有一个, apk文件的路径
             // PackageParser packageParser = new PackageParser(apkPath);
             Class pkgParserCls = Class.forName(PATH_PackageParser);
             Class[] typeArgs = new Class[1];
             typeArgs[0] = String.class;
             Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
             Object[] valueArgs = new Object[1];
             valueArgs[0] = apkPath;
             Object pkgParser = pkgParserCt.newInstance(valueArgs);
             MediaApplication.logD(DownloadApk.class, "pkgParser:" + pkgParser.toString());
             // 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
             DisplayMetrics metrics = new DisplayMetrics();
             metrics.setToDefaults();
             // PackageParser.Package mPkgInfo = packageParser.parsePackage(new
             // File(apkPath), apkPath,
             // metrics, 0);
             typeArgs = new Class[4];
             typeArgs[0] = File.class;
             typeArgs[1] = String.class;
             typeArgs[2] = DisplayMetrics.class;
             typeArgs[3] = Integer.TYPE;
             Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",
                     typeArgs);
             valueArgs = new Object[4];
             valueArgs[0] = new File(apkPath);
             valueArgs[1] = apkPath;
             valueArgs[2] = metrics;
             valueArgs[3] = PackageManager.GET_SIGNATURES;
             Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);
            
             typeArgs = new Class[2];
             typeArgs[0] = pkgParserPkg.getClass();
             typeArgs[1] = Integer.TYPE;
             Method pkgParser_collectCertificatesMtd = pkgParserCls.getDeclaredMethod("collectCertificates",
                     typeArgs);
             valueArgs = new Object[2];
             valueArgs[0] = pkgParserPkg;
             valueArgs[1] = PackageManager.GET_SIGNATURES;
             pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs);
             // 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
             Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField("mSignatures");
             Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg);
             MediaApplication.logD(DownloadApk.class, "size:"+info.length);
             MediaApplication.logD(DownloadApk.class, info[0].toCharsString());
             return info[0].toCharsString();
         } catch (Exception e) {
             e.printStackTrace();
         }
         return null;
     } 获取程序自身的签名:private String getSign(Context context) {
        PackageManager pm = context.getPackageManager();
        List<PackageInfo> apps = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
        Iterator<PackageInfo> iter = apps.iterator();
        while(iter.hasNext()) {
             PackageInfo packageinfo = iter.next();
             String packageName = packageinfo.packageName;
             if (packageName.equals(instance.getPackageName())) {
                MediaApplication.logD(DownloadApk.class, packageinfo.signatures[0].toCharsString());
                return packageinfo.signatures[0].toCharsString();
             }
     }
        return null;
    } 对比2个方法的返回值来判断APK升级包的签名是否一致,一致就提示可以安装。
分享到:
评论

相关推荐

    安卓apk keystore签名代码获取

    通过反射方式获取安卓 apk包的签名信息,通过日志打印的方式获取 apk keystore 或者jks文件的签名信息。

    ApkAnalyser-apk敏感信息提取

    1. **签名信息**:检查 APK 是否被正确签名,签名证书的详细信息,如发行者、有效期等。 2. **权限列表**:列出 APK 请求的所有 Android 权限,以及它们对用户隐私和系统资源的潜在访问。 3. **资源文件**:提取图片...

    Android获取已安装的apk信息

    - **安装路径**:通过`ApplicationInfo.sourceDir`获取,这通常是APK文件的路径。 示例代码如下: ```java for (PackageInfo packageInfo : packages) { String appName = packageInfo.applicationInfo....

    Android的APK应用签名机制以及读取签名的方法

    在Android系统中,每一个APK文件在发布之前都必须经过签名,这主要是为了以下几个目的: 1. **验证应用来源**:签名可以确认应用是由预期的开发者发布的,因为只有拥有私钥的开发者才能生成有效的签名。 2. **防止...

    apk方式实现android应用程序换肤

    1. **皮肤资源管理**:创建皮肤资源时,需要将其组织成一个独立的APK文件,该APK只包含皮肤相关的资源。这些资源应与主应用的资源结构保持一致,以便于替换。例如,如果主应用有一个`res/drawable`目录,皮肤APK也...

    Android App调用没有安装的apk

    1. **反射机制**:反射是Java的一个强大特性,允许程序在运行时获取和操作类、接口、字段和方法的信息。在插件化开发中,主应用通过反射调用插件APK中的类和方法,实现功能的调用。 2. **DexClassLoader**:Android...

    Android动态加载未安装apk

    在Android开发中,有时我们需要实现一个功能,即在运行时动态加载未安装的APK文件。这主要应用于插件化开发、热更新或者模块化的应用架构。动态加载未安装的APK可以让应用在不更新主应用程序的情况下添加或更新功能...

    Android程序研发源码Android 实现皮肤打包成apk的demo.zip

    本示例"Android程序研发源码Android 实现皮肤打包成apk的demo"提供了如何将皮肤打包成一个可独立安装的APK文件的详细实现。通过分析这个Demo,我们可以学习到以下关键知识点: 1. **皮肤资源管理**: - 皮肤通常...

    APK自我保护方法探讨

    - **MD5校验**:计算整个APK文件的MD5值,并与预设值进行比较。 - **SHA-1校验**:更安全的方式是使用SHA-1算法计算APK的哈希值。 #### 六、Java反射防御 Java反射允许程序在运行时动态访问类和对象,这也可能被...

    APK反编译工具

    9. **签名验证**:APK文件在安装前必须通过签名验证。反编译后,如果修改了代码或资源,可能需要重新签名,以确保应用的完整性和可安装性。 10. **学习资源**:为了深入学习APK反编译,可以参考开源项目、在线教程...

    DexClassLoader跨APK调用函数

    在Android系统中,DexClassLoader是一种特殊的类加载器,它允许我们动态地加载APK或者包含.dex文件的其他类型的归档文件,从而实现代码的动态加载和执行。这个功能对于插件化开发、热更新或者模块化应用有着重要的...

    Android无需root实现apk的静默安装

    在Android系统中,静默安装APK是指在不显示用户界面、无需用户...如果确实需要静默安装,可以考虑使用企业级部署方案,如MDM(Mobile Device Management)工具,它们通常提供了合法的途径来实现批量、无声的APK安装。

    Android_Apk_Dex_dynamic_load_sourcecode.zip

    这通常包括读取Apk的`resources.arsc`文件来获取资源,解析`AndroidManifest.xml`以获取组件信息,以及提取和加载Dex文件。 2. 使用`PackageInfo`和`PackageManager`:Android系统提供了`PackageManager`服务,可以...

    插件apk换肤代码

    3. **资源替换**:皮肤包本质上是一个包含资源的APK文件,包含颜色、图片等界面元素。加载皮肤包后,需要替换原有的资源ID,使得应用在运行时引用到新的皮肤资源。这通常通过反射和AOSP的Resources类来实现。 4. **...

    Android 静默安装

    这些方法需要传入APK文件的路径、安装模式等参数。 3. **构造Intent**:另一种可能的方法是通过构造并发送一个隐式Intent来启动系统的安装服务。这种方式同样需要反射来访问隐藏的Intent和ACTION。 4. **处理回调*...

    apeDroid:简单的 apk 保护器评估器

    逆向工程师可以使用各种工具对 APK 进行解包、反编译,以获取敏感信息或修改行为。因此,对 APK 进行保护,如加密、混淆、添加动态加载等,是防止恶意攻击的重要手段。 ### 2. 保护器评估的重要性 保护器评估器如 ...

    plugin.zip

    2. ** 插件APK的解析 **:为了加载插件,首先需要解析其AndroidManifest.xml,获取其中的Activity、Service、BroadcastReceiver和ContentProvider等组件信息。这通常通过解析XML和反射机制实现。 3. ** 替换或注入...

    Android-Plugin插件设计-获取插件资源

    这可以通过将插件打包为APK或JAR文件实现,例如Plugin_Greet.apk和greet.jar。 2. **资源映射**:由于Android系统在运行时通过R类访问资源,因此需要将插件的资源ID映射到主应用的R类中。这可以通过动态生成或修改R...

    android smali插桩重打包逆向调试例子

    在Android应用开发中,逆向工程是一个常见的技术领域,它涉及到对APK文件的解包、反编译、修改和重新打包,以了解其内部工作原理或进行安全分析。在这个"android smali插桩重打包逆向调试例子"中,我们将深入探讨...

    Android-针对DynamicLoadApk做的一些上层工作

    1. **插件APK的解析**:获取插件APK的元数据,如版本信息、依赖库等。 2. **插件的加载**:使用DexClassLoader加载`.dex`文件,并将`.so`库文件移动到`libs`目录下。 3. **Service注入**:通过反射或AIDL注册插件中...

Global site tag (gtag.js) - Google Analytics