Ver código fonte

Merge pull request #151 from javascript-obfuscator/conditional-comments-and-control-flow-flattening

Conditional comments now affects control flow flattening transformations
Timofey Kachalov 7 anos atrás
pai
commit
337fca2cd2

+ 1 - 0
CHANGELOG.md

@@ -7,6 +7,7 @@ v0.13.0
 * **Breaking change:** all CLI options were renamed to `kebab-case` format (`--disableConsoleOutout` -> `--disable-console-output`).
 * Implemented custom `mangle` option algorithm without `esmangle`; fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/110
 * Comments with `@license`, `@preserve` and `javascript-obfuscator` words won't be removed from obfuscated code.
+* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/147
 * Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/149
 
 v0.12.5

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
dist/index.js


+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "javascript-obfuscator",
-  "version": "0.13.0-dev.4",
+  "version": "0.13.0-dev.5",
   "description": "JavaScript obfuscator",
   "keywords": [
     "obfuscator",
@@ -47,7 +47,7 @@
     "@types/md5": "2.1.32",
     "@types/mkdirp": "0.5.2",
     "@types/mocha": "2.2.44",
-    "@types/node": "8.5.0",
+    "@types/node": "8.5.1",
     "@types/sinon": "4.1.2",
     "@types/string-template": "1.0.2",
     "@types/webpack-env": "1.13.3",

+ 13 - 9
src/generators/identifier-names-generators/MangledIdentifierNamesGenerator.ts

@@ -53,6 +53,7 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene
         const generateNewMangledName: (name: string) => string = (name: string): string => {
             const nameSequence: string[] = MangledIdentifierNamesGenerator.nameSequence;
             const zeroSequenceCache: string[] = [];
+            const nameLength: number = name.length;
 
             const zeroSequence: (num: number) => string = (num: number): string => {
                 let result: string = zeroSequenceCache[num];
@@ -67,22 +68,25 @@ export class MangledIdentifierNamesGenerator extends AbstractIdentifierNamesGene
                 return result;
             };
 
-            let cur: number = name.length - 1;
+            let index: number = nameLength - 1;
 
             do {
-                let character: string, index: number;
+                const character: string = name.charAt(index);
+                const indexInSequence: number = nameSequence.indexOf(character);
+                const lastNameSequenceIndex: number = nameSequence.length - 1;
 
-                character = name.charAt(cur);
-                index = nameSequence.indexOf(character);
+                if (indexInSequence !== lastNameSequenceIndex) {
+                    const previousNamePart: string = name.substring(0, index);
+                    const nextCharacter: string = nameSequence[indexInSequence + 1];
+                    const zeroSequenceCharacters: string = zeroSequence(nameLength - (index + 1));
 
-                if (index !== (nameSequence.length - 1)) {
-                    return name.substring(0, cur) + nameSequence[index + 1] + zeroSequence(name.length - (cur + 1));
+                    return previousNamePart + nextCharacter + zeroSequenceCharacters;
                 }
 
-                --cur;
-            } while (cur >= 0);
+                --index;
+            } while (index >= 0);
 
-            return `a${zeroSequence(name.length)}`;
+            return `a${zeroSequence(nameLength)}`;
         };
 
         let newMangledName: string = generateNewMangledName(previousMangledName);

+ 4 - 0
src/node-transformers/control-flow-transformers/FunctionControlFlowTransformer.ts

@@ -215,6 +215,10 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
     private transformFunctionBody (functionNodeBody: ESTree.BlockStatement, controlFlowStorage: IStorage<ICustomNode>): void {
         estraverse.replace(functionNodeBody, {
             enter: (node: ESTree.Node, parentNode: ESTree.Node | null): any => {
+                if (node.ignoredNode) {
+                    return estraverse.VisitorOption.Skip;
+                }
+
                 if (this.isVisitedFunctionNode(node) || !parentNode) {
                     return estraverse.VisitorOption.Skip;
                 }

+ 1 - 1
src/node-transformers/obfuscating-transformers/FunctionDeclarationTransformer.ts

@@ -7,7 +7,7 @@ import * as ESTree from 'estree';
 import { TIdentifierObfuscatingReplacerFactory } from "../../types/container/node-transformers/TIdentifierObfuscatingReplacerFactory";
 import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
 import { TReplaceableIdentifiers } from '../../types/node-transformers/TReplaceableIdentifiers';
-import { TReplaceableIdentifiersNames } from '../../types/node-transformers/TReplaceableIdentifiersNamesMap';
+import { TReplaceableIdentifiersNames } from '../../types/node-transformers/TReplaceableIdentifiersNames';
 
 import { IIdentifierObfuscatingReplacer } from '../../interfaces/node-transformers/obfuscating-transformers/obfuscating-replacers/IIdentifierObfuscatingReplacer';
 import { IOptions } from '../../interfaces/options/IOptions';

+ 1 - 1
src/node-transformers/obfuscating-transformers/VariableDeclarationTransformer.ts

@@ -7,7 +7,7 @@ import * as ESTree from 'estree';
 import { TIdentifierObfuscatingReplacerFactory } from '../../types/container/node-transformers/TIdentifierObfuscatingReplacerFactory';
 import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
 import { TReplaceableIdentifiers } from '../../types/node-transformers/TReplaceableIdentifiers';
-import { TReplaceableIdentifiersNames } from '../../types/node-transformers/TReplaceableIdentifiersNamesMap';
+import { TReplaceableIdentifiersNames } from '../../types/node-transformers/TReplaceableIdentifiersNames';
 
 import { IIdentifierObfuscatingReplacer } from '../../interfaces/node-transformers/obfuscating-transformers/obfuscating-replacers/IIdentifierObfuscatingReplacer';
 import { IOptions } from '../../interfaces/options/IOptions';

+ 0 - 0
src/types/node-transformers/TReplaceableIdentifiersNamesMap.d.ts → src/types/node-transformers/TReplaceableIdentifiersNames.d.ts


+ 29 - 0
test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/ConditionalCommentObfuscatingGuard.spec.ts

@@ -171,5 +171,34 @@ describe('ConditionalCommentObfuscatingGuard', () => {
                 assert.equal(obfuscatedFunctionCallMatchesLength, expectedObfuscatedFunctionCallsLength);
             });
         });
+
+        describe('variant #5: `disable` and `enable` conditional comments with control flow flattening', () => {
+            const obfuscatedVariableDeclarationRegExp: RegExp = /var *_0x([a-f0-9]){4,6} *= *_0x([a-f0-9]){4,6}\['[a-zA-Z0-9]{1,5}'];/;
+            const ignoredVariableDeclarationRegExp: RegExp = /var *bar *= *'bar';/;
+
+            let obfuscatedCode: string;
+
+            beforeEach(() => {
+                const code: string = readFileAsString(__dirname + '/fixtures/control-flow-flattening.js');
+                const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
+                    code,
+                    {
+                        ...NO_CUSTOM_NODES_PRESET,
+                        controlFlowFlattening: true,
+                        controlFlowFlatteningThreshold: 1
+                    }
+                );
+
+                obfuscatedCode = obfuscationResult.getObfuscatedCode();
+            });
+
+            it('match #1: should obfuscate variable declaration before `disable` conditional comment', () => {
+                assert.match(obfuscatedCode, obfuscatedVariableDeclarationRegExp);
+            });
+
+            it('match #2: should ignore variable declaration after `disable` conditional comment', () => {
+                assert.match(obfuscatedCode, ignoredVariableDeclarationRegExp);
+            });
+        });
     });
 });

+ 9 - 0
test/functional-tests/node-transformers/preparing-transformers/obfuscating-guards/conditional-comment-obfuscating-guard/fixtures/control-flow-flattening.js

@@ -0,0 +1,9 @@
+(function(){
+    var foo = 'foo';
+    /* javascript-obfuscator:disable */
+    var bar = 'bar';
+    /* javascript-obfuscator:enable */
+
+    console.log(foo);
+    console.log(bar);
+})();

+ 7 - 3
yarn.lock

@@ -68,7 +68,11 @@
   version "8.0.53"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.53.tgz#396b35af826fa66aad472c8cb7b8d5e277f4e6d8"
 
-"@types/[email protected]", "@types/node@^8.0.27":
+"@types/[email protected]":
+  version "8.5.1"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.1.tgz#4ec3020bcdfe2abffeef9ba3fbf26fca097514b5"
+
+"@types/node@^8.0.27":
   version "8.5.0"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.0.tgz#c5be22ffc84b221466fc8dfc0d6b1f88060808ef"
 
@@ -94,7 +98,7 @@
   version "0.0.30"
   resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1"
 
-"@types/v8flags@github:types/npm-v8flags#de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d":
+"@types/v8flags@types/npm-v8flags#de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d":
   version "2.0.0"
   resolved "https://codeload.github.com/types/npm-v8flags/tar.gz/de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d"
 
@@ -102,7 +106,7 @@
   version "1.13.3"
   resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.3.tgz#0ecbe70f87341767793774d3683b51aa3246434c"
 
-"@types/yn@github:types/npm-yn#ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9":
+"@types/yn@types/npm-yn#ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9":
   version "2.0.0"
   resolved "https://codeload.github.com/types/npm-yn/tar.gz/ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9"
 

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff