[
  {
    "path": "BCELCodeman.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<module type=\"JAVA_MODULE\" version=\"4\">\r\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\r\n    <exclude-output />\r\n    <content url=\"file://$MODULE_DIR$\">\r\n      <sourceFolder url=\"file://$MODULE_DIR$/src\" isTestSource=\"false\" />\r\n    </content>\r\n    <orderEntry type=\"inheritedJdk\" />\r\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\r\n  </component>\r\n</module>"
  },
  {
    "path": "META-INF/MANIFEST.MF",
    "content": "Manifest-Version: 1.0\r\nMain-Class: Main\r\n\r\n"
  },
  {
    "path": "README.md",
    "content": "# BCELCodeman\n\n>  初次使用Java编写工具，由于网上找到的编码/解码工具不是很顺手，才制作了这款工具，功能比较单一，就做一件事情BCEL编码/解码。\n\n> 其实工具是在护网期间做攻击溯源的过程中写的，目的是为了分析攻击者使用的fastjson payload。\n\n## How to use\n\n> 主要功能就是将class文件编码为BCEL编码，或将BCEL编码还原为class，从而可以反编译出java源码。\n\n> 使用Decode功能会自动在当前目录下生成**Decoded.class**, 由于BCEL编码存在$符号，请使用***单引号***对代码进行包裹\n\n```shell\n\nDecode:\njava -jar BCELCodeman.jar d [BCEL_CODE]\nEncode:\njava -jar BCELCodeman.jar e [Class_Filepath]\n\n```\n\n![命令行使用示例](./screenshot/jar_example.png)\n\n解码后的class可以拖入IDEA进行反编译，对比原始java代码效果如下\n\n![反编译对比](./screenshot/decoded.png)\n\n"
  },
  {
    "path": "src/Main.java",
    "content": "import com.sun.org.apache.bcel.internal.classfile.Utility;\r\n\r\nimport java.io.FileNotFoundException;\r\nimport java.io.FileOutputStream;\r\nimport java.io.IOException;\r\nimport java.nio.ByteBuffer;\r\nimport java.nio.channels.FileChannel;\r\nimport java.nio.file.Files;\r\nimport java.nio.file.Path;\r\nimport java.nio.file.Paths;\r\n\r\npublic class Main {\r\n    public static void main(String[] args) {\r\n        String helpMsg = \"---------Example---------\\n\"\r\n                        + \"Decode:\\n\"\r\n                        + \"java -jar BCELCodeman.jar d [BCEL_CODE]\\n\"\r\n                        + \"Encode:\\n\"\r\n                        + \"java -jar BCELCodeman.jar e [Class_Filepath]\\n\\n\"\r\n                        + \"  -=Coding By F1tz=-\";\r\n        try{\r\n            switch (args[0]){\r\n                case \"d\" :\r\n                    String bcelCode = args[1];\r\n                    decode(bcelCode);\r\n                    break;\r\n                case \"e\" :\r\n                    String classPath = args[1];\r\n                    encode(classPath);\r\n                    break;\r\n                default :\r\n                    System.out.println(helpMsg);\r\n            }\r\n        }catch (Exception e){\r\n            System.out.println(helpMsg);\r\n            return;\r\n        }\r\n    }\r\n\r\n    public static void decode(String cdata){\r\n        String path = \"./Decoded.class\";\r\n        if(cdata.startsWith(\"$$BCEL$$\")){\r\n            cdata = cdata.substring(8);\r\n        }\r\n        String cryptdata= cdata;\r\n        FileOutputStream fos = null;\r\n        FileChannel channel = null;\r\n        try {\r\n            fos = new FileOutputStream(path);\r\n            channel = fos.getChannel();\r\n            byte[] array =  Utility.decode(cryptdata,true);\r\n            ByteBuffer buffer = ByteBuffer.wrap(array);\r\n            channel.write(buffer);\r\n            System.out.println(\"[*] Decode BCELcode successfully, find Class file in ./Decoded.class\");\r\n        } catch (FileNotFoundException e) {\r\n            e.printStackTrace();\r\n        } catch (IOException e) {\r\n            e.printStackTrace();\r\n        } finally {\r\n            try {\r\n                channel.close();\r\n                fos.close();\r\n            } catch (IOException e) {\r\n                e.printStackTrace();\r\n            }\r\n        }\r\n    }\r\n\r\n    public static void encode(String Classpath) {\r\n        Path path = Paths.get(Classpath);\r\n        try {\r\n            byte[] data = Files.readAllBytes(path);\r\n            String s = Utility.encode(data, true);\r\n            System.out.println(\"$$BCEL$$\" + s);\r\n            System.out.println(\"\\n[*] Encode BCELcode successfully. Have fun :)\");\r\n        }catch (IOException e){\r\n            e.printStackTrace();\r\n        }\r\n    }\r\n}\r\n"
  }
]