Browse Source

Merge branch 'text-brute-force' of https://github.com/Cynser/CyberChef into Cynser-text-brute-force

n1474335 6 năm trước cách đây
mục cha
commit
d96ef37d81

+ 1 - 0
src/core/config/Categories.json

@@ -51,6 +51,7 @@
             "Change IP format",
             "Encode text",
             "Decode text",
+            "Text Encoding Brute Force",
             "Swap endianness",
             "To MessagePack",
             "From MessagePack",

+ 69 - 0
src/core/operations/TextEncodingBruteForce.mjs

@@ -0,0 +1,69 @@
+/**
+ * @author Cynser
+ * @copyright Crown Copyright 2018
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation";
+import Utils from "../Utils";
+import cptable from "../vendor/js-codepage/cptable.js";
+import {IO_FORMAT} from "../lib/ChrEnc";
+
+/**
+ * Text Encoding Brute Force operation
+ */
+class TextEncodingBruteForce extends Operation {
+
+    /**
+     * TextEncodingBruteForce constructor
+     */
+    constructor() {
+        super();
+
+        this.name = "Text Encoding Brute Force";
+        this.module = "CharEnc";
+        this.description = "Enumerate all possible text encodings for input.";
+        this.infoURL = "https://wikipedia.org/wiki/Character_encoding";
+        this.inputType = "string";
+        this.outputType = "string";
+        this.args = [
+            {
+                name: "Mode",
+                type: "option",
+                value: ["Encode", "Decode"]
+            }
+        ];
+    }
+
+    /**
+     * @param {string} input
+     * @param {Object[]} args
+     * @returns {string}
+     */
+    run(input, args) {
+        const output = [],
+            charSets = Object.keys(IO_FORMAT),
+            mode = args[0];
+
+        for (let i = 0; i < charSets.length; i++) {
+            let currentEncoding = charSets[i] + ": ";
+
+            try {
+                if (mode === "Decode") {
+                    currentEncoding += cptable.utils.decode(IO_FORMAT[charSets[i]], input);
+                } else {
+                    currentEncoding += cptable.utils.encode(IO_FORMAT[charSets[i]], input);
+                }
+            } catch (err) {
+                currentEncoding += "Could not decode.";
+            }
+
+            output.push(Utils.printable(currentEncoding, true));
+        }
+
+        return output.join("\n");
+    }
+
+}
+
+export default TextEncodingBruteForce;

+ 1 - 0
test/index.mjs

@@ -75,6 +75,7 @@ import "./tests/operations/SetIntersection";
 import "./tests/operations/SetUnion";
 import "./tests/operations/StrUtils";
 import "./tests/operations/SymmetricDifference";
+import "./tests/operations/TextEncodingBruteForce";
 import "./tests/operations/ToGeohash.mjs";
 import "./tests/operations/TranslateDateTimeFormat";
 import "./tests/operations/Magic";

+ 35 - 0
test/tests/operations/TextEncodingBruteForce.mjs

@@ -0,0 +1,35 @@
+/**
+ * Text Encoding Brute Force tests.
+ *
+ * @author Cynser
+ *
+ * @copyright Crown Copyright 2018
+ * @license Apache-2.0
+ */
+import TestRegister from "../../TestRegister";
+
+TestRegister.addTests([
+    {
+        name: "Text Encoding Brute Force - Encode",
+        input: "Булкі праз ляніва сабаку.",
+        expectedMatch: /Windows-1251 Cyrillic \(1251\): Булкі праз ляніва сабаку\./,
+        recipeConfig: [
+            {
+                op: "Text Encoding Brute Force",
+                args: ["Encode"],
+            },
+        ],
+    },
+    {
+        name: "Text Encoding Brute Force - Decode",
+        input: "Áóëê³ ïðàç ëÿí³âà ñàáàêó.",
+        expectedMatch: /Windows-1251 Cyrillic \(1251\): Булкі праз ляніва сабаку\./,
+        recipeConfig: [
+            {
+                op: "Text Encoding Brute Force",
+                args: ["Decode"],
+            },
+        ],
+    }
+]);
+