From e0a4daa14e3bd0b3a888da481046d81487ff0d21 Mon Sep 17 00:00:00 2001 From: "novice.li" Date: Sat, 20 Jan 2024 21:05:18 +0800 Subject: [PATCH] refactor agent --- .gitignore | 3 +- block_url_keywords | 2 + jetbra-agent/pom.xml | 11 ++++- .../main/java/win/novice/li/AgentMain.java | 13 ++--- ...ustAnchorHolder.java => ConfigHelper.java} | 47 +++++++++++++++---- .../java/win/novice/li/HttpClientAdvice.java | 18 +++++-- .../li/PKIXBuilderParametersAdvice.java | 2 +- .../main/java/win/novice/li/SocketAdvice.java | 20 -------- .../main/java/win/novice/li/SystemAdvice.java | 4 +- jetbra-dist/package.xml | 4 ++ jetbra-dist/pom.xml | 4 +- jetbra-server/pom.xml | 8 ++-- .../li/controller/LicenseController.java | 4 +- .../java/win/novice/li/model/License.java | 11 +++-- .../java/win/novice/li/model/Product.java | 5 +- pom.xml | 4 +- script/install-all-users.vbs | 2 +- script/install-current-user.vbs | 2 +- script/install.sh | 2 +- 19 files changed, 101 insertions(+), 65 deletions(-) create mode 100644 block_url_keywords rename jetbra-agent/src/main/java/win/novice/li/{TrustAnchorHolder.java => ConfigHelper.java} (52%) delete mode 100644 jetbra-agent/src/main/java/win/novice/li/SocketAdvice.java diff --git a/.gitignore b/.gitignore index 395dde9..c3dc894 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.iml .idea/ -target/ \ No newline at end of file +target/ +.fastRequest \ No newline at end of file diff --git a/block_url_keywords b/block_url_keywords new file mode 100644 index 0000000..c1df1b1 --- /dev/null +++ b/block_url_keywords @@ -0,0 +1,2 @@ +https://account.jetbrains.com/lservice/rpc/validateKey.action +116.62.33.138 \ No newline at end of file diff --git a/jetbra-agent/pom.xml b/jetbra-agent/pom.xml index 1e35d70..40d8ccd 100644 --- a/jetbra-agent/pom.xml +++ b/jetbra-agent/pom.xml @@ -13,8 +13,8 @@ jetbra-agent - 17 - 17 + 1.8 + 1.8 UTF-8 @@ -29,6 +29,13 @@ byte-buddy-agent 1.14.8 + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + provided + diff --git a/jetbra-agent/src/main/java/win/novice/li/AgentMain.java b/jetbra-agent/src/main/java/win/novice/li/AgentMain.java index b6c42fb..facb929 100644 --- a/jetbra-agent/src/main/java/win/novice/li/AgentMain.java +++ b/jetbra-agent/src/main/java/win/novice/li/AgentMain.java @@ -11,15 +11,18 @@ public class AgentMain { public static void premain(String agentArgs, Instrumentation inst) throws Exception { printLogo(); AgentBuilder agentBuilder = newAgentBuilder(); - agentBuilder.type(ElementMatchers.named("java.security.cert.PKIXBuilderParameters")) + agentBuilder + .type(ElementMatchers.named("java.security.cert.PKIXBuilderParameters")) .transform((builder, typeDescription, classLoader, module, protectionDomain) -> builder .visit(Advice.to(PKIXBuilderParametersAdvice.class) .on(ElementMatchers.isConstructor().and(ElementMatchers.takesArgument(0, Set.class))))) .asTerminalTransformation() + + .type(ElementMatchers.named("sun.net.www.http.HttpClient")) .transform((builder, typeDescription, classLoader, module, protectionDomain) -> builder .visit(Advice.to(HttpClientAdvice.class) - .on(ElementMatchers.named("openServer")))) + .on(ElementMatchers.named("openServer").and(ElementMatchers.takesArgument(0, String.class))))) .asTerminalTransformation() .type(ElementMatchers.named("java.lang.System")) @@ -28,12 +31,6 @@ public class AgentMain { .on(ElementMatchers.named("getProperty")))) .asTerminalTransformation() - .type(ElementMatchers.named("java.net.Socket")) - .transform((builder, typeDescription, classLoader, module, protectionDomain) -> builder - .visit(Advice.to(SocketAdvice.class) - .on(ElementMatchers.named("connect")))) - .asTerminalTransformation() - .installOn(inst); agentBuilder.installOn(inst); diff --git a/jetbra-agent/src/main/java/win/novice/li/TrustAnchorHolder.java b/jetbra-agent/src/main/java/win/novice/li/ConfigHelper.java similarity index 52% rename from jetbra-agent/src/main/java/win/novice/li/TrustAnchorHolder.java rename to jetbra-agent/src/main/java/win/novice/li/ConfigHelper.java index a354c40..e55b021 100644 --- a/jetbra-agent/src/main/java/win/novice/li/TrustAnchorHolder.java +++ b/jetbra-agent/src/main/java/win/novice/li/ConfigHelper.java @@ -1,9 +1,9 @@ package win.novice.li; import java.io.File; -import java.io.FileInputStream; import java.net.URI; import java.net.URL; +import java.nio.file.Files; import java.nio.file.Paths; import java.security.cert.CertificateFactory; import java.security.cert.TrustAnchor; @@ -11,9 +11,9 @@ import java.security.cert.X509Certificate; import java.util.HashSet; import java.util.Set; -public class TrustAnchorHolder { +public class ConfigHelper { public static Set TRUST_ANCHORS; - + public static Set BLOCK_URL_KEYWORDS; public static Set loadTrustAnchors() throws Exception { if (TRUST_ANCHORS != null) { @@ -22,8 +22,8 @@ public class TrustAnchorHolder { TRUST_ANCHORS = new HashSet<>(); String certDir; - if (System.getenv("JB_HOME") != null) { - certDir = System.getenv("JB_HOME"); + if (System.getenv("TRUST_CRT_DIR") != null) { + certDir = System.getenv("TRUST_CRT_DIR"); } else { URI jarURI = getJarURI(); if (jarURI == null) { @@ -39,23 +39,52 @@ public class TrustAnchorHolder { CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); for (File item : files) { if (item.getName().endsWith(".crt")) { - X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(new FileInputStream(item)); + X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(Files.newInputStream(item.toPath())); TRUST_ANCHORS.add(new TrustAnchor(cert, null)); } } } } - System.out.println("loaded " + TRUST_ANCHORS.size() + " crts"); + System.out.println("loaded " + TRUST_ANCHORS.size() + " crts"); return TRUST_ANCHORS; } + public static Set loadBlockUrlKeywords() throws Exception { + if (BLOCK_URL_KEYWORDS != null) { + return BLOCK_URL_KEYWORDS; + } + BLOCK_URL_KEYWORDS = new HashSet<>(); + String blockUrlKeywordFilePath; + if (System.getenv("BLOCK_URL_KEYWORD_FILE_PATH") != null) { + blockUrlKeywordFilePath = System.getenv("BLOCK_URL_KEYWORD_FILE_PATH"); + } else { + URI jarURI = getJarURI(); + if (jarURI == null) { + return BLOCK_URL_KEYWORDS; + } + blockUrlKeywordFilePath = Paths.get(jarURI).getParent().resolve("block_url_keywords").toString(); + } + System.out.println("load block url keywords from " + blockUrlKeywordFilePath); + File file = new File(blockUrlKeywordFilePath); + if (file.exists()) { + for (String line : Files.readAllLines(file.toPath())) { + if (!line.trim().isEmpty()) { + BLOCK_URL_KEYWORDS.add(line); + } + } + } + System.out.println("loaded " + BLOCK_URL_KEYWORDS.size() + " keywords"); + return BLOCK_URL_KEYWORDS; + } + + public static URI getJarURI() throws Exception { - URL url = TrustAnchorHolder.class.getProtectionDomain().getCodeSource().getLocation(); + URL url = ConfigHelper.class.getProtectionDomain().getCodeSource().getLocation(); if (null != url) { return url.toURI(); } String resourcePath = "/jarLocation.txt"; - url = TrustAnchorHolder.class.getResource(resourcePath); + url = ConfigHelper.class.getResource(resourcePath); if (null == url) { return null; } diff --git a/jetbra-agent/src/main/java/win/novice/li/HttpClientAdvice.java b/jetbra-agent/src/main/java/win/novice/li/HttpClientAdvice.java index d6263bd..4e721b5 100644 --- a/jetbra-agent/src/main/java/win/novice/li/HttpClientAdvice.java +++ b/jetbra-agent/src/main/java/win/novice/li/HttpClientAdvice.java @@ -1,14 +1,26 @@ package win.novice.li; import net.bytebuddy.asm.Advice; +import sun.net.www.http.HttpClient; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.net.SocketTimeoutException; +import java.util.Set; + public class HttpClientAdvice { @Advice.OnMethodExit - public static void intercept(@Advice.This Object x) throws Exception { - if (x.toString().contains("validateKey.action")){ - throw new SocketTimeoutException(); + @SuppressWarnings("unchecked") + public static void intercept(@Advice.This Object httpClient) throws Exception { + Class clazz = Class.forName("win.novice.li.ConfigHelper", true, ClassLoader.getSystemClassLoader()); + Method method = clazz.getDeclaredMethod("loadBlockUrlKeywords"); + Set BLOCK_URL_KEYWORDS = (Set) method.invoke(null); + String clientString = httpClient.toString(); + for (String keyword : BLOCK_URL_KEYWORDS) { + if (clientString.contains(keyword)) { + throw new SocketTimeoutException(); + } } } } diff --git a/jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParametersAdvice.java b/jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParametersAdvice.java index 9123702..e3c3d0e 100644 --- a/jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParametersAdvice.java +++ b/jetbra-agent/src/main/java/win/novice/li/PKIXBuilderParametersAdvice.java @@ -13,7 +13,7 @@ public class PKIXBuilderParametersAdvice { @Advice.OnMethodEnter @SuppressWarnings("unchecked") public static void intercept(@Advice.Argument(value = 0, readOnly = false) Set trustAnchors) throws Exception { - Class clazz = Class.forName("win.novice.li.TrustAnchorHolder", true, ClassLoader.getSystemClassLoader()); + Class clazz = Class.forName("win.novice.li.ConfigHelper", true, ClassLoader.getSystemClassLoader()); Method method = clazz.getDeclaredMethod("loadTrustAnchors"); Set loadedTrustAnchors = (Set)method.invoke(null); HashSet newTrustAnchors = new HashSet<>(trustAnchors); diff --git a/jetbra-agent/src/main/java/win/novice/li/SocketAdvice.java b/jetbra-agent/src/main/java/win/novice/li/SocketAdvice.java deleted file mode 100644 index ba12ef6..0000000 --- a/jetbra-agent/src/main/java/win/novice/li/SocketAdvice.java +++ /dev/null @@ -1,20 +0,0 @@ -package win.novice.li; - -import net.bytebuddy.asm.Advice; - -import java.net.ConnectException; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.SocketAddress; - -public class SocketAdvice { - @Advice.OnMethodExit - public static void intercept(@Advice.Argument(value = 0,readOnly = false) SocketAddress socketAddress) throws Exception { - if (socketAddress instanceof InetSocketAddress){ - InetAddress address = ((InetSocketAddress) socketAddress).getAddress(); - if (address.getHostAddress().equals("116.62.33.138")){ - throw new ConnectException("拒绝连接"); - } - } - } -} diff --git a/jetbra-agent/src/main/java/win/novice/li/SystemAdvice.java b/jetbra-agent/src/main/java/win/novice/li/SystemAdvice.java index 912a6db..bb490b5 100644 --- a/jetbra-agent/src/main/java/win/novice/li/SystemAdvice.java +++ b/jetbra-agent/src/main/java/win/novice/li/SystemAdvice.java @@ -2,13 +2,15 @@ package win.novice.li; import net.bytebuddy.asm.Advice; +import java.util.Objects; + public class SystemAdvice { // System.getProperty @Advice.OnMethodExit public static void intercept(@Advice.Argument(0) Object x, @Advice.Return(readOnly = false) String r) throws Exception { - if (x.toString().equals("jb.vmOptionsFile")) { + if (Objects.equals(x, "jb.vmOptionsFile")) { RuntimeException exception = new RuntimeException(); int nullCnt = 0; boolean hasReflect = false; diff --git a/jetbra-dist/package.xml b/jetbra-dist/package.xml index 00cf610..d686e7c 100644 --- a/jetbra-dist/package.xml +++ b/jetbra-dist/package.xml @@ -41,5 +41,9 @@ ${project.parent.basedir}/jetbra-agent/target/jetbra-agent.jar jetbra-agent.jar + + ${project.parent.basedir}/block_url_keywords + block_url_keywords + diff --git a/jetbra-dist/pom.xml b/jetbra-dist/pom.xml index f58cd9a..e4f35bc 100644 --- a/jetbra-dist/pom.xml +++ b/jetbra-dist/pom.xml @@ -13,8 +13,8 @@ jetbra-dist - 17 - 17 + 1.8 + 1.8 UTF-8 diff --git a/jetbra-server/pom.xml b/jetbra-server/pom.xml index dd2f83d..c9a5047 100644 --- a/jetbra-server/pom.xml +++ b/jetbra-server/pom.xml @@ -13,8 +13,8 @@ jetbra-server - 17 - 17 + 1.8 + 1.8 UTF-8 @@ -40,12 +40,12 @@ org.bouncycastle bcpkix-jdk18on - 1.72 + 1.77 org.bouncycastle bcprov-jdk18on - 1.72 + 1.77 org.projectlombok diff --git a/jetbra-server/src/main/java/win/novice/li/controller/LicenseController.java b/jetbra-server/src/main/java/win/novice/li/controller/LicenseController.java index af874d9..bc23522 100644 --- a/jetbra-server/src/main/java/win/novice/li/controller/LicenseController.java +++ b/jetbra-server/src/main/java/win/novice/li/controller/LicenseController.java @@ -19,6 +19,7 @@ import java.security.*; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.Base64; +import java.util.Collections; import java.util.Map; @RestController @@ -45,8 +46,7 @@ public class LicenseController { String sigResultsBase64 = Base64.getEncoder().encodeToString(signatureBytes); String result = licenseId + "-" + licensePartBase64 + "-" + sigResultsBase64 + "-" + Base64.getEncoder().encodeToString(CRT.getEncoded()); - - return Map.of("license", result); + return Collections.singletonMap("license", result); } diff --git a/jetbra-server/src/main/java/win/novice/li/model/License.java b/jetbra-server/src/main/java/win/novice/li/model/License.java index 5cf6224..ab542db 100644 --- a/jetbra-server/src/main/java/win/novice/li/model/License.java +++ b/jetbra-server/src/main/java/win/novice/li/model/License.java @@ -1,12 +1,13 @@ package win.novice.li.model; -import jakarta.validation.Valid; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; + import lombok.Data; +import javax.validation.Valid; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.util.List; @Data diff --git a/jetbra-server/src/main/java/win/novice/li/model/Product.java b/jetbra-server/src/main/java/win/novice/li/model/Product.java index 417cdc8..8c4bf2d 100644 --- a/jetbra-server/src/main/java/win/novice/li/model/Product.java +++ b/jetbra-server/src/main/java/win/novice/li/model/Product.java @@ -2,10 +2,11 @@ package win.novice.li.model; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Data; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + @Data public class Product { @NotBlank diff --git a/pom.xml b/pom.xml index f923b43..86d362f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.0 + 2.7.14 win.novice @@ -20,7 +20,7 @@ jetbra-dist - 17 + 1.8 diff --git a/script/install-all-users.vbs b/script/install-all-users.vbs index cc5512d..3ea5e4f 100644 --- a/script/install-all-users.vbs +++ b/script/install-all-users.vbs @@ -64,7 +64,7 @@ Sub ProcessVmOptions(ByVal file) Loop oFile.Close - sNewContent = sNewContent & "-javaagent:" & sJarFile & "=jetbrains" + sNewContent = sNewContent & "-javaagent:" & sJarFile Set oFile = oFS.OpenTextFile(file, 2, 0) oFile.Write sNewContent oFile.Close diff --git a/script/install-current-user.vbs b/script/install-current-user.vbs index c991525..a984aa2 100644 --- a/script/install-current-user.vbs +++ b/script/install-current-user.vbs @@ -45,7 +45,7 @@ Sub ProcessVmOptions(ByVal file) Loop oFile.Close - sNewContent = sNewContent & "-javaagent:" & sJarFile & "=jetbrains" + sNewContent = sNewContent & "-javaagent:" & sJarFile Set oFile = oFS.OpenTextFile(file, 2, 0) oFile.Write sNewContent oFile.Close diff --git a/script/install.sh b/script/install.sh index b158c60..7c3944d 100755 --- a/script/install.sh +++ b/script/install.sh @@ -56,7 +56,7 @@ for PRD in $JB_PRODUCTS; do sed -i '/^\-javaagent:.*[\/\\]jetbra\-agent\.jar.*/d' "${VM_FILE_PATH}" fi - echo "-javaagent:${JAR_FILE_PATH}=jetbrains" >>"${VM_FILE_PATH}" + echo "-javaagent:${JAR_FILE_PATH}" >>"${VM_FILE_PATH}" ENV_NAME=$(echo $PRD | tr '[a-z]' '[A-Z]')"_VM_OPTIONS" echo "export ${ENV_NAME}=\"${VM_FILE_PATH}\"" >>"${MY_VMOPTIONS_SHELL_FILE}"