繁体   English   中英

在Java中以编程方式编辑APK文件

[英]Programmatically editing apk files in java

这个问题有点复杂,所以请忍受:我有一个apk文件,我试图在安装后以编程方式进行修改。 我正在用另一个应用程序对其进行编辑。 我首先尝试使用内置的Java类对zip文件进行管理,但是当我尝试完全复制除要修改的文件以外的所有文件并更改要修改的文件时,我将不再运行。 我认为这是由于签名或其他原因造成的,但是当我用winRAR做同样的事情时(解压缩所有文件,创建新的zip归档文件,将所有文件以正常压缩方式复制到新的zip归档文件中),然后将新的apk ssh到我的/ data /应用程序文件夹,它工作正常。 我的问题是为什么会这样。 我认为这可能与zip标头有关,或者有人有任何想法吗?

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中打开输出,除了我更改的资产文件外,它似乎相同。

您应该知道的唯一一件事是apk工具签名的工作方式(解决校验和-它们是zip条目。目标文件夹是CERT.RSA的META-INF-存在已编码的校验和,以及调试信息,CERT.SF和MANIFEST .MF-具有SHA1-Digest-Base64编码的哈希(它们很容易由您自己检测)。 但这是一个真正的黑客! 该代码可能是有用的(例如,许多“聪明的程序员”使用它来动态更改应用程序的图片。)并且可能很危险-因为您可以将apk文件增大为GB大小。

我认为,这种技巧不应该在全世界的社区人士之间传播,我会把它保留在简短的程序员圈子中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM