这个问题有点复杂所以请耐心等待: 我有一个apk文件,我试图在安装后以编程方式进行修改。我正在用另一个应用程序编辑它。我首先尝试使用内置的java类进行zip文件管理,但是当我尝试完全复制除了要修改的文件以外的所有文件并更改文件我想要修改应用程序将不再运行。我认为这是因为签名或其他什么,但是当我用winRAR做同样的事情(解压缩所有文件,创建一个新的zip存档,将所有文件复制到正常压缩的新zip存档)并将新的apk ssh到我的/ data / app文件夹,它工作正常。我的问题是为什么会这样。我认为它可能与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中打开输出,除了我更改的资产文件外,它看起来是相同的。
答案 0 :(得分:0)
你应该知道的唯一一件事是如何工作签署apk工具(解决校验和 - 它们是zip条目。目标文件夹是带有CERT.RSA的META-INF - 目前有编码校验和,还有调试信息,CERT。 SF和MANIFEST.MF - 使用SHA1-Digest - Base64编码哈希(它们很容易被你自己检测))。 但这是一个真正的黑客!该代码可能很有用(并且被许多“智能程序员”用于例如改变应用程序的图片)并且可能很危险 - 因为你的apk文件可以增加到GB大小 - 如果你这样写的话。
这个伎俩不应该在世界各地的社区人士之间传播,我想 - 它将被保存在程序员的短小圈子里。