Найти и заменить внутри скомпилированного файла .jar. А потом скачивая его - PullRequest
0 голосов
/ 11 апреля 2020

Итак, в общем то, что я хочу: найти и заменить строки в файле .jar любой длины. Это работает для меня нормально, за исключением того, что мне нужно иметь ту же длину заменяемой переменной, что и переменная. Я хочу, чтобы длина не имела значения. Кто-нибудь знает, как мне помочь?

PHP код:

<?php
$search1 = '%%__NONCE__%%';
$replace1 = 'ME_0000000001';
$search2 = '%%__USER__%%';
$replace2 = '000000000001';
$search3 = '%%__RESOURCE__%%';
$replace3 = '1';

function modifyzip($archive, $search, $replace) {
    $zip = new ZipArchive();
    $status = $zip->open($archive);

//    echo $status;

    if ($status == true) {
        /* Get the count of files BEFORE the loop */
        $filecount = $zip->numFiles;

//        echo $filecount;

        for ($i=0; $i < $filecount; $i++) {
            $name = $zip->getNameIndex($i);
            $content = $zip->getFromName($name);
            $edited = str_replace($search, $replace, $content);
            if ($edited != $content) {
//                echo $edited;
//                echo $edited . "\n\n";
            }
            $zip->deleteName($name);
            $zip->addFromString($name, $edited);
        }
    }
    $zip->close();
}


$templateFilename = 'zips/a.jar';
$inputFilename = 'zips/b.jar';

if (!copy($templateFilename, $inputFilename)) {
    die("Could not copy '$templateFilename' to '$inputFilename'");
}

call_user_func('modifyzip', $inputFilename, $search1, $replace1);
call_user_func('modifyzip', $inputFilename, $search2, $replace2);
call_user_func('modifyzip', $inputFilename, $search3, $replace3);

//echo file_get_contents($templateFilename);

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$inputFilename");
header("Content-Type: application/java-archive");
header("Content-Transfer-Encoding: binary");

// read the file from disk
readfile($inputFilename);

unlink($inputFilename);

Java Luyten error:

java.lang.IllegalArgumentException: Argument 'value' must be in the range [1, 18], but value was: 0.
    at com.strobel.core.VerifyArgument.inRange(VerifyArgument.java:346)
    at com.strobel.assembler.ir.ConstantPool$Tag.fromValue(ConstantPool.java:532)
    at com.strobel.assembler.ir.ConstantPool.read(ConstantPool.java:362)
    at com.strobel.assembler.metadata.JarTypeLoader.getInternalNameFromClassFile(JarTypeLoader.java:105)
    at com.strobel.assembler.metadata.JarTypeLoader.tryLoadType(JarTypeLoader.java:78)
    at us.deathmarine.luyten.LuytenTypeLoader.tryLoadType(LuytenTypeLoader.java:25)
    at com.strobel.assembler.metadata.MetadataSystem.resolveType(MetadataSystem.java:120)
    at com.strobel.assembler.metadata.MetadataSystem.lookupTypeCore(MetadataSystem.java:81)
    at com.strobel.assembler.metadata.MetadataResolver.lookupType(MetadataResolver.java:46)
    at us.deathmarine.luyten.Model.openEntryByTreePath(Model.java:338)
    at us.deathmarine.luyten.Model$TreeListener$1.run(Model.java:266)
...