欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Renderdoc源码研究——修改其中签名并替换

程序员文章站 2022-03-14 20:29:32
...

源码思路

1、查找apk包中已经存在的签名文件,并移除该签名文件。

部分核心源码如下:

bool RemoveAPKSignature(const rdcstr &apk)
{
// Get the list of files in META-INF
  rdcstr fileList = execCommand(aapt, "list \"" + apk + "\"").strStdout;
    
  for(rdcstr &line : lines)
  {
    line.trim();
    fileCount++;
    if(line.beginsWith("META-INF"))
    {
      RDCDEBUG("Match found, removing  %s", line.c_str());
      execCommand(aapt, "remove \"" + apk + "\" " + line);
      matchCount++;
    }
  }
  RDCLOG("%d files searched, %d removed", fileCount, matchCount);
}

2、创建并生成RSA**,自签名证书

部分核心源码如下:

rdcstr GetAndroidDebugKey()
{
      // locate keytool and use it to generate a keystore
  rdcstr create;
  create += " -genkey";
  create += " -keystore \"" + key + "\"";
  create += " -storepass android";
  create += " -alias rdocandroidkey";
  create += " -keypass android";
  create += " -keyalg RSA";
  create += " -keysize 2048";
  create += " -validity 10000";
  create += " -dname \"CN=, OU=, O=, L=, S=, C=\"";
}

3、用创建好的签名证书对apk进行签名。

bool DebugSignAPK(const rdcstr &apk, const rdcstr &workDir){
    args += " sign ";
    args += " --ks \"" + debugKey + "\" ";
    args += " --ks-pass pass:android ";
    args += " --key-pass pass:android ";
    args += " --ks-key-alias rdocandroidkey ";
    args += "\"" + apk + "\"";
}

4、查找apk中是否有生成的“META-INF”文件夹,来检查签名是否成功。

修改思路

1、在用户设置的 AndroidSDK 路径下的 platform-tools 子文件下,即\android_sdk\android_sdk\platform-tools目录下创建KeyStore文件夹,其中包含两个文件:

  • 证书 xxx.keystore
  • 存放密码文件 xxx.txt

如果程序可以检测上述两个文件的存在,那么直接使用该文件对apk进行签名。否则仍使用Renderdoc的自签名。

2、用我们自己的签名方法对apk进行签名,主要修改了DebugSignAPK函数。

jarsigner 
-keystore .keystore文件路径(签名文件地址配置)  
-sigalg SHA1withRSA 
-digestalg SHA1 
-storepass 签名文件storepass(password.txt文件获取) 
-keypass 签名文件keypass(password.txt文件获取) 
-signedjar 签名后apk输出地址 待签名的未签名apk地址 
签名文件的keyAliasName(password.txt文件获取)

使用方法

  • \android_sdk\android_sdk\platform-tools目录下创建KeyStore文件夹,并放入xxx.keystore 文件,以及存放密码的xxx.txt 文件。那么就可以用指定的证书文件对apk进行签名。 如果找不到该文件夹,用户未指定签名证书的话,则会直接使用Renderdoc的自签名。
  • txt 内部存放格式:
    // 分别对应-storepass  签名文件storepass、-keypass  签名文件keypass、签名文件的keyAliasName这三个参数。
    KeystorePass: xxxxx
    KeyaliasName: xxxxx
    KeyaliasPass: xxxxx
    
相关标签: c++ 数字签名