2

这个问题有点复杂,所以请多多包涵:我有一个 apk 文件,我试图在安装后以编程方式修改。我正在用另一个应用程序编辑它。我首先尝试使用用于 zip 文件管理的内置 java 类来执行此操作,但是当我尝试完全复制除我要修改的文件之外的所有文件并更改我要修改的文件时,应用程序将不再运行。我认为这是因为签名或其他原因,但是当我使用 winRAR 做同样的事情时(解压缩所有文件,创建一个新的 zip 存档,将所有文件复制到具有正常压缩的新 zip 存档中)并将新的 apk ssh 到我的 /data/应用程序文件夹,它工作正常。我的问题是为什么会这样。我认为这可能与 zip headers 或类似的东西有关,有人有什么想法吗?

PS:这是我用来重写 zip 文件的 java 进程的示例:

p = Runtime.getRuntime().exec("su");
ZipInputStream in = new ZipInputStream(new FileInputStream("This is the apk containing the asset I want to use to replace the other asset"));
ZipEntry e;
while((e = in.getNextEntry()) != null)
{
    if(e.getName().equals("asset i want to use to replace the other asset"))
        break;
}
ZipOutputStream out = new ZipOutputStream(new FileOutputStream("the output zip file"));
ZipInputStream original = new ZipInputStream(new FileInputStream("the apk i am trying to modify"));
ZipEntry f;
byte[] buf = new byte[1024];
while((f = original.getNextEntry()) != null)
{
    if(!f.getName().equals("the asset i want to replace"))
    {
        out.putNextEntry(new ZipEntry(f.getName()));
        int len;
        while ((len = original.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        original.closeEntry();
        out.closeEntry();
    }
    else
    {
        out.putNextEntry(new ZipEntry(e.getName()));
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        out.closeEntry();
    }
}
in.close();
out.close();
original.close();

我已经在 android 系统和使用常规软件的 windows 上运行了这个过程,我可以在 winRAR 中打开输出,除了我更改的资产文件之外,它似乎是相同的。

4

1 回答 1

0

您应该知道的唯一一件事是签名 apk 工具的工作原理(解决校验和 - 它们是 zip 条目。目标文件夹是带有 CERT.RSA 的 META-INF - 存在编码校验和以及其他调试信息、CERT.SF 和 MANIFEST .MF - 带有 SHA1-Digest - Base64 编码的哈希(它们很容易被您自己检测到))。但这是真正的黑客攻击!该代码可能很有用(并且被许多“智能程序员”用于动态更改应用程序的图片)并且可能很危险 - 因为您的 apk 文件可以增加到 GB 大小 - 如果您愿意的话。

我认为这个技巧不应该在世界范围内的人们之间传播——它将被限制在程序员的小圈子里。

于 2013-01-13T22:32:28.500 回答