获取apk中的证书信息

模块目标

从apk解压出的文件夹中找到所有后缀名为cer|pem|cert|crt|pub|key|pfx|p12的文件路径

Git

这个项目的所有模块位于github:https://github.com/LeeHDsniper/APKAnalyserModules

代码要点

要找寻文件路径,在python中很容易,使用os.walk(‘path’)就能实现,但是在C++中,就需要自己编写函数了

头文件

#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
在linux下,文件夹的操作在zlib解压缩那篇文章中已经说过
这里需要注意第一个头文件dirent.h,这个头文件中定义了一个结构提dirent,这个结构体保存了当前文件/文件夹的信息。
例如dirent->d_name就保存了文件名,dirent->d_type 保存了文件类型(文件or文件夹)等等。具体的信息可百度。

函数设计

我们需要编写一个函数,这个函数将递归地遍历初始路径下的所有文件夹和文件。
在当前文件类型为8即为文件时,我们获取这个文件的文件名,获取文件名后缀,匹配cer|pem|cert|crt|pub|key|pfx|p12,如果是,则返回当前文件的全路径。

上代码

#include <iostream>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string>
#include <cstring>

using namespace std;

void GetHardcodedCert( const char *path, int &sum, char **file_Path )
{
  struct dirent * ent = NULL;
  DIR   *pDir;
  pDir = opendir( path );
  if ( pDir == NULL )
  {
    return;
  }
  while ( (ent = readdir( pDir ) ) != NULL )
  {
    if ( ent->d_type == 8 )
    {
      char *p, *suffix;
      p = ent->d_name;
      while ( (*p) != '\0' )
      {
        if ( ( (*p) == '.') )
          suffix = p + 1;
        p++;
      }
      if ( (strcmp( suffix, "cer" ) == 0) || (strcmp( suffix, "pem" ) == 0) ||
           (strcmp( suffix, "cert" ) == 0) || (strcmp( suffix, "crt" ) == 0) ||
           (strcmp( suffix, "pub" ) == 0) || (strcmp( suffix, "key" ) == 0) ||
           (strcmp( suffix, "pfx" ) == 0) || (strcmp( suffix, "p12" ) == 0) )
      {
        int len = (int) strlen( path ) + (int) strlen( ent->d_name ) + 1;
        file_Path[sum] = new char[len];
        strcpy( file_Path[sum], path );
        file_Path[sum][(int) strlen( path )] = '/';
        strcat( file_Path[sum], ent->d_name );
        sum++;
      }
    }else  {
      if ( strcmp( ent->d_name, "." ) == 0 || strcmp( ent->d_name, ".." ) == 0 )
      {
        continue;
      }
      /* directory */
      string  _path( path );
      string  _dirName( ent->d_name );
      string  fullDirPath = _path + "/" + _dirName;
      GetHardcodedCert( fullDirPath.c_str(), sum, file_Path );
    }
  }
}

在这里我没有使用正则表达式,因为C++的正则确实不是很好用,所以直接使用使用strcmp()函数一个一个匹配。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个工具前后用了好多天的时间查阅资料并不断修改才完成。本工具可以用于读取apk包的大量信息,无其他依赖。可以直接通过命令行运行,也可以当作架包使用。 命令行方式使用举例: 获取AndroidManifest.xml文件定义的versionCode: java -jar ApkAnalysis.jar “apk路径” -versionCode 获取apk证书详情: java -jar ApkAnalysis.jar “apk路径” -certs 获取apk证书的第一条的详情: java -jar ApkAnalysis.jar “apk路径” -certs 0 获取证书摘要(百度、高德地图等API需要的那个SHA1): java -jar ApkAnalysis.jar “apk路径” -certs 0 SHA1 获取apk发布者信息: java -jar ApkAnalysis.jar “apk路径” -certs 0 issuer 获取apk声明的权限: java -jar ApkAnalysis.jar “apk路径” -permissions 当作为架包使用时,通过 ApkAnalysis apkAnalysis = ApkAnalysis.getApkReader(apkFilePath); 获取ApkAnalysis的实例,然后就调用对应方法读取即可。相信都会使用自动补全等功能吧?那个会告诉你有哪些可用的方法,这里不例举了。 输入 java -jar ApkAnalysis.jar -help会给出如下提示,请慢慢研究。如果好用,请不吝评价一下,谢谢~至于源码么,会反编译的就反编译吧,我也拦不住的,纯Java写的,还是很好反编译的,也没有代码混淆过。感兴趣愿意一起交流的可以留言问我要,纯粹伸手党就算了。 Apk分析工具 v1.0.7 编译时JDK版本:1.6.0_33 当前JRE版本:1.6.0_33 作者:周骞 发布日期:2015-01-08 --------------------------------------------------- ApkAnalysis [-versionCode] [-versionName] [-packageName]... 可用的选项: -versionCode 版本号 -versionName 版本名称,如1.0.3 -packageName Apk包名 -certs [index] [MD5|SHA1|issuer|subject|validity] 获取证书信息 -verify 校验apk内文件的签名,并列出未通过校验的文件 -permissions 获取apk所需的权限 -features 获取apk所需的特性 -activities [detail] 获取apk所含的Activity -services [detail] 获取apk所含的Service -receivers [detail] 获取apk所含的静态Receiver -content [name] 获取AndroidManifest.xml的内容 -extract 抽取apk的文件 -h[elp] 显示此帮助信息 --------------------------------------------------- 如在程序引用本包,方法如下: ApkAnalysis apkAnalysis = ApkAnalysis.getApkReader(apkFilePath); 需要判断apkAnalysis是否为null,为null表示读取失败,不为null时即可调用getXX()获取数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值