
Obtener los parámetros del programa de cifrado
Herramienta de ejecución con cifrado seguro para JAR de Spring Boot, compatible también con JAR nativos.
Basada en el cifrado de los recursos dentro del paquete JAR y en la extensión de ClassLoader, construye un esquema de arranque cifrado del programa y ejecución con descifrado dinámico, evitando la fuga del código fuente y la descompilación.
Características
Sin intrusión de código, solo hay que cifrar el paquete JAR compilado con la herramienta.
Descifrado completamente en memoria, reduce el riesgo de fuga del código fuente y del bytecode o de descompilación.
Soporta todos los algoritmos de cifrado/descifrado integrados en el JDK.
Permite seleccionar el bytecode u otros archivos de recursos que se deban cifrar/descifrar.
Soporta el plugin de Maven, lo que hace el cifrado más conveniente.
Genera dinámicamente un lanzador Go para proteger la contraseña contra fugas.
El binario xjar está escrito en Go y almacena información como la clave secreta; xxx-1.0-SNAPSHOT.xjar es el archivo cifrado con AES.
Objetivo: para obtener los parámetros que el lanzador xjar pasa a la JVM, se pueden imprimir usando el flujo de salida estándar.
Comando normal para ejecutar el JAR cifrado 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) {
}
}
Compilación:
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
Código Go correspondiente de xjar:
https://github.com/core-lib/xjar/blob/master/src/main/resources/xjar/xjar.go
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
}
Esta contraseña se puede encontrar mediante strings xjar buscando la palabra clave.
$ strings xjar |grep -B 10 "AES/CBC/PKCS5Padding"
Análisis con IDA:
.text:00000000004AB7BB main.main mov rbx, cs:off_573F48 ; "Passw0rd\t"
.noptrdata:0000000000560120 0000000A C Passw0rd\t
En main.main:
lea rbx, [rsp+170h+var_126]
mov [rsp+170h+var_50], rbx
mov rbx, cs:off_573F48 ; "Passw0rd\t"
Principalmente se divide en JAR de versión Spring Boot y JAR individual.
Descifrado de la versión Spring Boot:
String password = "Passw0rd"; //设置密码
XKey xKey = XKit.key(password);
XBoot.decrypt("/path/to/read/encrypted.jar", "/path/to/save/decrypted.jar", xKey);
Descifrado de JAR individual:
String password = "Passw0rd";
XKey xKey = XKit.key(password);
XJar.decrypt("/path/encrypted.jar", "/path/decrypted.jar", xKey);
Enlace de referencia: Auditoría de código - descifrado de xjar
https://mp.weixin.qq.com/s/donLtYHXz5BWsF5AnOOmYA
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