NDK应用程序签名检查

我在应用程序中有一些安全密钥。 我想保存它securly。 我喜欢把它存储在一个本地共享库(也许从一些代码生成)。 之后,我希望它将被检查原始APK的签名的方法返回。 所以没有人可以使用这个文件,除了可信的应用 我知道,ndk库也可以反编译,但是更难以对本地代码进行反向工程,然后javaclass文件。

题:

  1. 有没有办法从本地代码(c / c + +)calk原始apk的签名?
  2. 如何确保从受信任的应用程序调用库?

我会尽力在这里回答你的第一个问题:

您的应用程序的签名存储在APK的DEX(Dalvik可执行文件)文件中。 DEX文件具有以下结构:

  1. 数据部分 (包含string,代码指令,字段等)
  2. 方法标识符,类标识符等的数组

所以,这是DEX文件头部的开头:

  1. DEX_FILE_MAGIC常数 – ubyte [8]
  2. 你的应用程序的Adler-32校验和 (除了DEX_FILE_MAGIC和校验和本身) – uint
  3. 你的应用程序的SHA-1签名 (DEX_FILE_MAGIC,校验和本身除外) – ubyte [20]

所以,为了给你的apk签名,你应该从偏移量32开始计算你的DEX文件的SHA-1签名。

要从本地代码访问apk的DEX文件,可以读取存储在/ proc / self / maps中的进程内存:

FILE *fp; fp = fopen("/proc/self/maps", "r"); 

proc / $ ID / maps文件中的每一行都具有以下结构:

  1. 地址
  2. 权限
  3. 抵消
  4. 设备
  5. 索引节点
  6. path

在这里你可以find更好的描述proc / $ ID / maps文件的结构: 了解Linux / proc / id / maps

要检测进程内存中的DEX文件的位置,您应该在proc / self / maps文件的每一行检出“pathname”列。 当find与DEX文件相对应的行时,您应该得到DEX文件区域的起始和结束地址:

 while (fgets(line, 2048, fp) != NULL) { // search for '.dex' if (strstr(line, ".dex") != NULL) { // get starting and ending addresses of the DEX file region 

所以,当你将有apk的字节码的开始和结束地址,你将能够计算你的apk的签名。