
获取加密程序的参数
Spring Boot JAR 보안 암호화 실행 도구로, 네이티브 JAR도 지원합니다.
JAR 패키지 내부 리소스 암호화와 ClassLoader 확장을 기반으로 프로그램 암호화 시작과 동적 복호화 실행을 구현하여, 소스 코드 유출과 역컴파일을 방지합니다.
기능 특성
코드 침투가 없으며, 컴파일된 JAR 패키지를 도구로 암호화하기만 하면 됩니다.
완전한 메모리 복호화를 통해 소스 코드 및 바이트코드 유출이나 역컴파일 위험을 낮춥니다.
모든 JDK 내장 암호화/복호화 알고리즘을 지원합니다.
복호화해야 할 바이트코드 또는 기타 리소스 파일을 선택할 수 있습니다.
Maven 플러그인을 지원하여 암호화가 더욱 편리합니다.
Go 런처를 동적으로 생성하여 비밀번호가 유출되지 않도록 보호합니다.
여기서 xjar 바이너리는 Go로 작성되었으며, 내부에 비밀키 등의 정보가 저장되어 있습니다. xxx-1.0-SNAPSHOT.xjar는 AES로 암호화된 파일입니다.
목적: xjar 런처가 JVM에 전달하는 매개변수를 얻기 위해 표준 출력 스트림으로 출력할 수 있습니다.
일반적인 xjar로 암호화된 jar를 실행하는 명령:
$ 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) {
}
}
컴파일:
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
해당 xjar Go 코드:
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
}
이 비밀번호는 strings xjar 명령으로 키워드를 검색하여 찾을 수 있습니다.
$ strings xjar |grep -B 10 "AES/CBC/PKCS5Padding"
IDA 분석:
.text:00000000004AB7BB main.main mov rbx, cs:off_573F48 ; "Passw0rd\t"
.noptrdata:0000000000560120 0000000A C Passw0rd\t
main.main에서
lea rbx, [rsp+170h+var_126]
mov [rsp+170h+var_50], rbx
mov rbx, cs:off_573F48 ; "Passw0rd\t"
주로 Spring Boot 버전 jar와 단일 jar로 나뉩니다.
Spring Boot 버전 복호화:
String password = "Passw0rd"; //设置密码
XKey xKey = XKit.key(password);
XBoot.decrypt("/path/to/read/encrypted.jar", "/path/to/save/decrypted.jar", xKey);
단일 jar 패키지 복호화:
String password = "Passw0rd";
XKey xKey = XKit.key(password);
XJar.decrypt("/path/encrypted.jar", "/path/decrypted.jar", xKey);
참고 링크:코드 감사 - 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