
Ottieni i parametri del programma di crittografia
Strumento per l'esecuzione sicura e la crittografia dei JAR Spring Boot, supporta anche i JAR nativi.
Basato sulla crittografia delle risorse all'interno del JAR e sull'estensione del ClassLoader, costruisce una soluzione di avvio crittografato ed esecuzione con decrittazione dinamica, evitando la fuga del codice sorgente e la decompilazione.
Caratteristiche
Nessuna intrusione nel codice: basta crittografare il JAR compilato con lo strumento.
Decrittazione completamente in memoria: riduce il rischio di fuga del codice sorgente o del bytecode e di decompilazione.
Supporta tutti gli algoritmi di crittografia/decrittografia integrati nella JDK.
È possibile selezionare il bytecode o altri file di risorse da crittografare/decrittografare.
Supporta il plugin Maven, la crittografia è più comoda.
Genera dinamicamente il launcher Go, proteggendo la password da eventuali fughe.
Il binario xjar è scritto in Go e memorizza la chiave segreta e altre informazioni; xxx-1.0-SNAPSHOT.xjar è il file crittografato con AES.
Scopo: per ottenere i parametri che il launcher xjar passa alla JVM, è possibile stamparli tramite il flusso di output standard.
Comando normale per eseguire il JAR crittografato con xjar:
$ ps -ef |grep java |grep xjar
$ file xjar
xjar: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=xx-C, not stripped
$ ./xjar java -jar xxx-1.0-SNAPSHOT.xjar
public class f {
static {
try {
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
System.out.println("[+] Get Jvm Stdin Input: ");
String input = br.readLine();
while (input != null) {
System.out.println("args = " + input);
input = br.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
}
}
Compilazione:
javac f
./xjar java f java -jar ./xxx-1.0-SNAPSHOT.xjar
[+] Get Jvm Stdin Input:
args = AES/CBC/PKCS5Padding
args = 128
args = 128
args = Passw0rd
Codice Go corrispondente di xjar:
var xKey = XKey{
algorithm: []byte{#{xKey.algorithm}}, =>> AES/CBC/PKCS5Padding
keysize: []byte{#{xKey.keysize}}, =>> 128
ivsize: []byte{#{xKey.ivsize}}, =>> 128
password: []byte{#{xKey.password}}, =>> Passw0rd
}
Questa password può essere trovata cercando parole chiave con strings xjar
$ strings xjar |grep -B 10 "AES/CBC/PKCS5Padding"
Analisi IDA:
.text:00000000004AB7BB main.main mov rbx, cs:off_573F48 ; "Passw0rd\t"
.noptrdata:0000000000560120 0000000A C Passw0rd\t
In main.main:
lea rbx, [rsp+170h+var_126]
mov [rsp+170h+var_50], rbx
mov rbx, cs:off_573F48 ; "Passw0rd\t"
Si divide principalmente in JAR versione Spring Boot e JAR singolo.
Decrittazione per versione Spring Boot:
String password = "Passw0rd"; //设置密码
XKey xKey = XKit.key(password);
XBoot.decrypt("/path/to/read/encrypted.jar", "/path/to/save/decrypted.jar", xKey);
Decrittazione per JAR singolo:
String password = "Passw0rd";
XKey xKey = XKit.key(password);
XJar.decrypt("/path/encrypted.jar", "/path/decrypted.jar", xKey);
Link di riferimento: code audit - cracking della crittografia xjar
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
input := bufio.NewScanner(os.Stdin) //初始化一个扫表对象
for input.Scan() { //扫描输入内容
line := input.Text() //把输入内容转换为字符串
fmt.Println(line) //输出到标准输出
}
}
./xjar ./xjarCrack java -jar xxx-1.0-SNAPSHOT.xjar
<?php var_dump(file_get_contents('php://stdin'));
./xjar php test.php java -jar xxx-1.0-SNAPSHOT.xjar