破解 aspose-psd

aspose-psd是一个不开源的psd编辑库,在没有证书的情况下只能进行有限的步骤,处理很小的图片,原库如下

implementation("com.aspose:aspose-psd:24.9:jdk16")

破解需要修改验证的方法,引入如下库进行修改class文件

implementation("org.javassist:javassist:3.30.2-GA")
implementation("net.lingala.zip4j:zip4j:2.11.5")
package loli.ball

import javassist.ClassPool
import javassist.CtClass
import javassist.bytecode.Bytecode
import java.io.File
import javax.swing.filechooser.FileSystemView


/**
 * Created by LoliBall on 2024/10/3 22:47.
 * https://github.com/WhichWho
 */
fun main() {

    val desktop = FileSystemView.getFileSystemView().homeDirectory

    ClassPool.getDefault().insertClassPath(File(desktop, "111.jar").absolutePath)
    val zzZJJClass = ClassPool.getDefault().getCtClass("com.aspose.psd.internal.kP.e")
    val methodA = zzZJJClass.declaredMethods
    for (ctMethod in methodA) {
        var ps = ctMethod.parameterTypes
        if (ps.size == 1 && ctMethod.name == "a" && ctMethod.returnType.name == "int") {
            println(ctMethod.name)
            println(ctMethod.parameterTypes.toList())
            println(ctMethod.returnType)
            ctMethod.setBody("{return 2;}")
        }
    }

    //这一步就是将破译完的代码放在桌面上
    zzZJJClass.writeFile(desktop.absolutePath)

}

由于zip文件名大小写敏感,但是windows文件系统大小写不敏感,需要引入压缩库进行jar包中的文件替换

package loli.ball

import net.lingala.zip4j.ZipFile
import net.lingala.zip4j.model.ZipParameters
import java.io.File
import javax.swing.filechooser.FileSystemView

/**
 * Created by LoliBall on 2024/10/3 23:15.
 * https://github.com/WhichWho
 */
fun main() {

    val desktop = FileSystemView.getFileSystemView().homeDirectory

    val fileAA = File("C:\\Users\\litte\\Desktop\\com\\aspose\\psd\\internal\\kP\\e.class")

    val zip = ZipFile(File(desktop, "111.jar"))
    zip.fileHeaders
// 需要删除原先的签名文件
//        .filter { it.fileName.startsWith("META-INF") }
//        .forEach {
//            zip.removeFile(it)
//        }
        .filter { it.fileName == "com/aspose/psd/internal/kP/e.class" }
        .forEach {
        println(it.fileName)
            val fileName = it.fileName
            zip.removeFile(fileName)
            zip.addFile(fileAA, ZipParameters().also { it.fileNameInZip = fileName })
    }
    zip.close()

}

最终得到修改后的jar文件,本地引入即可

implementation(files("libs/111.jar"))

可以在这里下载到破解好的jar包
https://zedo.top:408/gitea/loliball/PSDTouch