Selaa lähdekoodia

Moved BlockStatementControlFlowReplacer to BlockStatementControlFlowTransformer.
Added tests.

control flow replacers folder now contains only logic relative to control flow storage

sanex3339 8 vuotta sitten
vanhempi
commit
5598770231
33 muutettua tiedostoa jossa 602 lisäystä ja 690 poistoa
  1. 422 496
      dist/index.js
  2. 1 0
      src/Obfuscator.ts
  3. 9 9
      src/container/modules/custom-nodes/CustomNodesModule.ts
  4. 0 5
      src/container/modules/node-transformers/NodeControlFlowTransformersModule.ts
  5. 5 0
      src/container/modules/node-transformers/NodeTransformersModule.ts
  6. 8 8
      src/custom-nodes/control-flow-flattening-nodes/BinaryExpressionFunctionNode.ts
  7. 9 9
      src/custom-nodes/control-flow-flattening-nodes/BlockStatementControlFlowFlatteningNode.ts
  8. 8 8
      src/custom-nodes/control-flow-flattening-nodes/CallExpressionFunctionNode.ts
  9. 8 8
      src/custom-nodes/control-flow-flattening-nodes/LogicalExpressionFunctionNode.ts
  10. 7 7
      src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/CallExpressionControlFlowStorageCallNode.ts
  11. 9 9
      src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts
  12. 7 7
      src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ExpressionWithOperatorControlFlowStorageCallNode.ts
  13. 1 1
      src/enums/container/CustomNodes.ts
  14. 0 1
      src/enums/container/NodeControlFlowReplacers.ts
  15. 1 0
      src/enums/container/NodeTransformers.ts
  16. 25 24
      src/node-transformers/node-control-flow-transformers/BlockStatementControlFlowTransformer.ts
  17. 0 2
      src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts
  18. 5 87
      test/dev/dev.ts
  19. 7 0
      test/fixtures/node-transformers/node-control-flow-transformers/block-statement-control-flow-transformer-1.js
  20. 0 0
      test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer-1.js
  21. 0 0
      test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer-2.js
  22. 0 0
      test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer-1.js
  23. 0 0
      test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer-2.js
  24. 0 0
      test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer-3.js
  25. 0 0
      test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-1.js
  26. 0 0
      test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-2.js
  27. 0 0
      test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-3.js
  28. 0 0
      test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-prohibited-nodes-1.js
  29. 60 0
      test/functional-tests/node-transformers/node-control-flow-transformers/BlockStatementControlFlowTransformer.spec.ts
  30. 2 2
      test/functional-tests/node-transformers/node-control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.spec.ts
  31. 3 3
      test/functional-tests/node-transformers/node-control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.spec.ts
  32. 4 4
      test/functional-tests/node-transformers/node-control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.spec.ts
  33. 1 0
      test/index.spec.ts

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 422 - 496
dist/index.js


+ 1 - 0
src/Obfuscator.ts

@@ -30,6 +30,7 @@ export class Obfuscator implements IObfuscator {
      * @type {Map<string, NodeTransformers[]>}
      */
     private static readonly nodeControlFlowTransformersMap: Map <string, NodeTransformers[]> = new Map([
+        [NodeType.BlockStatement, [NodeTransformers.BlockStatementControlFlowTransformer]],
         [NodeType.FunctionDeclaration, [NodeTransformers.FunctionControlFlowTransformer]],
         [NodeType.FunctionExpression, [NodeTransformers.FunctionControlFlowTransformer]]
     ]);

+ 9 - 9
src/container/modules/custom-nodes/CustomNodesModule.ts

@@ -14,18 +14,18 @@ import { DomainLockCustomNodeGroup } from '../../../custom-nodes/domain-lock-nod
 import { SelfDefendingCustomNodeGroup } from '../../../custom-nodes/self-defending-nodes/group/SelfDefendingCustomNodeGroup';
 import { StringArrayCustomNodeGroup } from '../../../custom-nodes/string-array-nodes/group/StringArrayCustomNodeGroup';
 
-import { BinaryExpressionFunctionNode } from '../../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionFunctionNode';
-import { BlockStatementControlFlowReplacerNode } from '../../../custom-nodes/control-flow-replacers-nodes/block-statement-control-flow-replacer-nodes/BlockStatementControlFlowReplacerNode';
-import { CallExpressionControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-storage-nodes/CallExpressionControlFlowStorageCallNode';
-import { CallExpressionFunctionNode } from '../../../custom-nodes/control-flow-replacers-nodes/call-expression-control-flow-replacer-nodes/CallExpressionFunctionNode';
-import { ControlFlowStorageNode } from '../../../custom-nodes/control-flow-storage-nodes/ControlFlowStorageNode';
+import { BinaryExpressionFunctionNode } from '../../../custom-nodes/control-flow-flattening-nodes/BinaryExpressionFunctionNode';
+import { BlockStatementControlFlowFlatteningNode } from '../../../custom-nodes/control-flow-flattening-nodes/BlockStatementControlFlowFlatteningNode';
+import { CallExpressionControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/CallExpressionControlFlowStorageCallNode';
+import { CallExpressionFunctionNode } from '../../../custom-nodes/control-flow-flattening-nodes/CallExpressionFunctionNode';
+import { ControlFlowStorageNode } from '../../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode';
 import { ConsoleOutputDisableExpressionNode } from '../../../custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode';
 import { DebugProtectionFunctionCallNode } from '../../../custom-nodes/debug-protection-nodes/DebugProtectionFunctionCallNode';
 import { DebugProtectionFunctionIntervalNode } from '../../../custom-nodes/debug-protection-nodes/DebugProtectionFunctionIntervalNode';
 import { DebugProtectionFunctionNode } from '../../../custom-nodes/debug-protection-nodes/DebugProtectionFunctionNode';
 import { DomainLockNode } from '../../../custom-nodes/domain-lock-nodes/DomainLockNode';
-import { ExpressionWithOperatorControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-storage-nodes/ExpressionWithOperatorControlFlowStorageCallNode';
-import { LogicalExpressionFunctionNode } from '../../../custom-nodes/control-flow-replacers-nodes/logical-expression-control-flow-replacer-nodes/LogicalExpressionFunctionNode';
+import { ExpressionWithOperatorControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ExpressionWithOperatorControlFlowStorageCallNode';
+import { LogicalExpressionFunctionNode } from '../../../custom-nodes/control-flow-flattening-nodes/LogicalExpressionFunctionNode';
 import { NodeCallsControllerFunctionNode } from '../../../custom-nodes/node-calls-controller-nodes/NodeCallsControllerFunctionNode';
 import { SelfDefendingUnicodeNode } from '../../../custom-nodes/self-defending-nodes/SelfDefendingUnicodeNode';
 import { StringArrayCallsWrapper } from '../../../custom-nodes/string-array-nodes/StringArrayCallsWrapper';
@@ -39,8 +39,8 @@ export const customNodesModule: interfaces.ContainerModule = new ContainerModule
         .whenTargetNamed(CustomNodes.BinaryExpressionFunctionNode);
 
     bind<interfaces.Newable<ICustomNode>>(ServiceIdentifiers.Newable__ICustomNode)
-        .toConstructor(BlockStatementControlFlowReplacerNode)
-        .whenTargetNamed(CustomNodes.BlockStatementControlFlowReplacerNode);
+        .toConstructor(BlockStatementControlFlowFlatteningNode)
+        .whenTargetNamed(CustomNodes.BlockStatementControlFlowFlatteningNode);
 
     bind<interfaces.Newable<ICustomNode>>(ServiceIdentifiers.Newable__ICustomNode)
         .toConstructor(CallExpressionControlFlowStorageCallNode)

+ 0 - 5
src/container/modules/node-transformers/NodeControlFlowTransformersModule.ts

@@ -6,7 +6,6 @@ import { IControlFlowReplacer } from '../../../interfaces/node-transformers/ICon
 import { NodeControlFlowReplacers } from '../../../enums/container/NodeControlFlowReplacers';
 
 import { BinaryExpressionControlFlowReplacer } from '../../../node-transformers/node-control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer';
-import { BlockStatementControlFlowReplacer } from '../../../node-transformers/node-control-flow-transformers/control-flow-replacers/BlockStatementControlFlowReplacer';
 import { CallExpressionControlFlowReplacer } from '../../../node-transformers/node-control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer';
 import { LogicalExpressionControlFlowReplacer } from '../../../node-transformers/node-control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer';
 
@@ -15,10 +14,6 @@ export const nodeControlFlowTransformersModule: interfaces.ContainerModule = new
         .to(BinaryExpressionControlFlowReplacer)
         .whenTargetNamed(NodeControlFlowReplacers.BinaryExpressionControlFlowReplacer);
 
-    bind<IControlFlowReplacer>(ServiceIdentifiers.IControlFlowReplacer)
-        .to(BlockStatementControlFlowReplacer)
-        .whenTargetNamed(NodeControlFlowReplacers.BlockStatementControlFlowReplacer);
-
     bind<IControlFlowReplacer>(ServiceIdentifiers.IControlFlowReplacer)
         .to(CallExpressionControlFlowReplacer)
         .whenTargetNamed(NodeControlFlowReplacers.CallExpressionControlFlowReplacer);

+ 5 - 0
src/container/modules/node-transformers/NodeTransformersModule.ts

@@ -7,6 +7,7 @@ import { NodeTransformers } from '../../../enums/container/NodeTransformers';
 
 import { FunctionControlFlowTransformer } from '../../../node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer';
 
+import { BlockStatementControlFlowTransformer } from '../../../node-transformers/node-control-flow-transformers/BlockStatementControlFlowTransformer';
 import { CatchClauseObfuscator } from '../../../node-transformers/node-obfuscators/CatchClauseObfuscator';
 import { FunctionDeclarationObfuscator } from '../../../node-transformers/node-obfuscators/FunctionDeclarationObfuscator';
 import { FunctionObfuscator } from '../../../node-transformers/node-obfuscators/FunctionObfuscator';
@@ -19,6 +20,10 @@ import { VariableDeclarationObfuscator } from '../../../node-transformers/node-o
 
 export const nodeTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => {
     // node control flow transformers
+    bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
+        .to(BlockStatementControlFlowTransformer)
+        .whenTargetNamed(NodeTransformers.BlockStatementControlFlowTransformer);
+
     bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
         .to(FunctionControlFlowTransformer)
         .whenTargetNamed(NodeTransformers.FunctionControlFlowTransformer);

+ 8 - 8
src/custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionFunctionNode.ts → src/custom-nodes/control-flow-flattening-nodes/BinaryExpressionFunctionNode.ts

@@ -1,18 +1,18 @@
 import { injectable, inject } from 'inversify';
-import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
+import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import { BinaryOperator } from 'estree';
 
-import { TStatement } from '../../../types/node/TStatement';
+import { TStatement } from '../../types/node/TStatement';
 
-import { IOptions } from '../../../interfaces/options/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 
-import { initializable } from '../../../decorators/Initializable';
+import { initializable } from '../../decorators/Initializable';
 
-import { AbstractCustomNode } from '../../AbstractCustomNode';
-import { Nodes } from '../../../node/Nodes';
-import { NodeUtils } from '../../../node/NodeUtils';
-import { RandomGeneratorUtils } from '../../../utils/RandomGeneratorUtils';
+import { AbstractCustomNode } from '../AbstractCustomNode';
+import { Nodes } from '../../node/Nodes';
+import { NodeUtils } from '../../node/NodeUtils';
+import { RandomGeneratorUtils } from '../../utils/RandomGeneratorUtils';
 
 @injectable()
 export class BinaryExpressionFunctionNode extends AbstractCustomNode {

+ 9 - 9
src/custom-nodes/control-flow-replacers-nodes/block-statement-control-flow-replacer-nodes/BlockStatementControlFlowReplacerNode.ts → src/custom-nodes/control-flow-flattening-nodes/BlockStatementControlFlowFlatteningNode.ts

@@ -1,21 +1,21 @@
 import { injectable, inject } from 'inversify';
-import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
+import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import * as ESTree from 'estree';
 
-import { TStatement } from '../../../types/node/TStatement';
+import { TStatement } from '../../types/node/TStatement';
 
-import { IOptions } from '../../../interfaces/options/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 
-import { initializable } from '../../../decorators/Initializable';
+import { initializable } from '../../decorators/Initializable';
 
-import { AbstractCustomNode } from '../../AbstractCustomNode';
-import { Nodes } from '../../../node/Nodes';
-import { NodeUtils } from '../../../node/NodeUtils';
-import { RandomGeneratorUtils } from '../../../utils/RandomGeneratorUtils';
+import { AbstractCustomNode } from '../AbstractCustomNode';
+import { Nodes } from '../../node/Nodes';
+import { NodeUtils } from '../../node/NodeUtils';
+import { RandomGeneratorUtils } from '../../utils/RandomGeneratorUtils';
 
 @injectable()
-export class BlockStatementControlFlowReplacerNode extends AbstractCustomNode {
+export class BlockStatementControlFlowFlatteningNode extends AbstractCustomNode {
     /**
      * @type {ESTree.Statement[]}
      */

+ 8 - 8
src/custom-nodes/control-flow-replacers-nodes/call-expression-control-flow-replacer-nodes/CallExpressionFunctionNode.ts → src/custom-nodes/control-flow-flattening-nodes/CallExpressionFunctionNode.ts

@@ -1,18 +1,18 @@
 import { injectable, inject } from 'inversify';
-import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
+import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import * as ESTree from 'estree';
 
-import { TStatement } from '../../../types/node/TStatement';
+import { TStatement } from '../../types/node/TStatement';
 
-import { IOptions } from '../../../interfaces/options/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 
-import { initializable } from '../../../decorators/Initializable';
+import { initializable } from '../../decorators/Initializable';
 
-import { AbstractCustomNode } from '../../AbstractCustomNode';
-import { Nodes } from '../../../node/Nodes';
-import { NodeUtils } from '../../../node/NodeUtils';
-import { RandomGeneratorUtils } from '../../../utils/RandomGeneratorUtils';
+import { AbstractCustomNode } from '../AbstractCustomNode';
+import { Nodes } from '../../node/Nodes';
+import { NodeUtils } from '../../node/NodeUtils';
+import { RandomGeneratorUtils } from '../../utils/RandomGeneratorUtils';
 
 @injectable()
 export class CallExpressionFunctionNode extends AbstractCustomNode {

+ 8 - 8
src/custom-nodes/control-flow-replacers-nodes/logical-expression-control-flow-replacer-nodes/LogicalExpressionFunctionNode.ts → src/custom-nodes/control-flow-flattening-nodes/LogicalExpressionFunctionNode.ts

@@ -1,18 +1,18 @@
 import { injectable, inject } from 'inversify';
-import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
+import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import { LogicalOperator } from 'estree';
 
-import { TStatement } from '../../../types/node/TStatement';
+import { TStatement } from '../../types/node/TStatement';
 
-import { IOptions } from '../../../interfaces/options/IOptions';
+import { IOptions } from '../../interfaces/options/IOptions';
 
-import { initializable } from '../../../decorators/Initializable';
+import { initializable } from '../../decorators/Initializable';
 
-import { AbstractCustomNode } from '../../AbstractCustomNode';
-import { Nodes } from '../../../node/Nodes';
-import { RandomGeneratorUtils } from '../../../utils/RandomGeneratorUtils';
-import { NodeUtils } from '../../../node/NodeUtils';
+import { AbstractCustomNode } from '../AbstractCustomNode';
+import { Nodes } from '../../node/Nodes';
+import { RandomGeneratorUtils } from '../../utils/RandomGeneratorUtils';
+import { NodeUtils } from '../../node/NodeUtils';
 
 @injectable()
 export class LogicalExpressionFunctionNode extends AbstractCustomNode {

+ 7 - 7
src/custom-nodes/control-flow-storage-nodes/CallExpressionControlFlowStorageCallNode.ts → src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/CallExpressionControlFlowStorageCallNode.ts

@@ -1,18 +1,18 @@
 import { injectable, inject } from 'inversify';
-import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
+import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 
 import * as ESTree from 'estree';
 import { Expression } from 'estree';
 
-import { TStatement } from '../../types/node/TStatement';
+import { TStatement } from '../../../types/node/TStatement';
 
-import { IOptions } from '../../interfaces/options/IOptions';
+import { IOptions } from '../../../interfaces/options/IOptions';
 
-import { initializable } from '../../decorators/Initializable';
+import { initializable } from '../../../decorators/Initializable';
 
-import { AbstractCustomNode } from '../AbstractCustomNode';
-import { Nodes } from '../../node/Nodes';
-import { NodeUtils } from '../../node/NodeUtils';
+import { AbstractCustomNode } from '../../AbstractCustomNode';
+import { Nodes } from '../../../node/Nodes';
+import { NodeUtils } from '../../../node/NodeUtils';
 
 @injectable()
 export class CallExpressionControlFlowStorageCallNode extends AbstractCustomNode {

+ 9 - 9
src/custom-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts → src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ControlFlowStorageNode.ts

@@ -1,19 +1,19 @@
 import { injectable, inject } from 'inversify';
-import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
+import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 
 import * as ESTree from 'estree';
 
-import { TStatement } from '../../types/node/TStatement';
+import { TStatement } from '../../../types/node/TStatement';
 
-import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../interfaces/options/IOptions';
-import { IStorage } from '../../interfaces/storages/IStorage';
+import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
+import { IOptions } from '../../../interfaces/options/IOptions';
+import { IStorage } from '../../../interfaces/storages/IStorage';
 
-import { initializable } from '../../decorators/Initializable';
+import { initializable } from '../../../decorators/Initializable';
 
-import { AbstractCustomNode } from '../AbstractCustomNode';
-import { Nodes } from '../../node/Nodes';
-import { NodeUtils } from '../../node/NodeUtils';
+import { AbstractCustomNode } from '../../AbstractCustomNode';
+import { Nodes } from '../../../node/Nodes';
+import { NodeUtils } from '../../../node/NodeUtils';
 
 @injectable()
 export class ControlFlowStorageNode extends AbstractCustomNode {

+ 7 - 7
src/custom-nodes/control-flow-storage-nodes/ExpressionWithOperatorControlFlowStorageCallNode.ts → src/custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ExpressionWithOperatorControlFlowStorageCallNode.ts

@@ -1,17 +1,17 @@
 import { injectable, inject } from 'inversify';
-import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
+import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
 
 import { Expression } from 'estree';
 
-import { TStatement } from '../../types/node/TStatement';
+import { TStatement } from '../../../types/node/TStatement';
 
-import { IOptions } from '../../interfaces/options/IOptions';
+import { IOptions } from '../../../interfaces/options/IOptions';
 
-import { initializable } from '../../decorators/Initializable';
+import { initializable } from '../../../decorators/Initializable';
 
-import { AbstractCustomNode } from '../AbstractCustomNode';
-import { Nodes } from '../../node/Nodes';
-import { NodeUtils } from '../../node/NodeUtils';
+import { AbstractCustomNode } from '../../AbstractCustomNode';
+import { Nodes } from '../../../node/Nodes';
+import { NodeUtils } from '../../../node/NodeUtils';
 
 @injectable()
 export class ExpressionWithOperatorControlFlowStorageCallNode extends AbstractCustomNode {

+ 1 - 1
src/enums/container/CustomNodes.ts

@@ -1,6 +1,6 @@
 export enum CustomNodes {
     BinaryExpressionFunctionNode,
-    BlockStatementControlFlowReplacerNode,
+    BlockStatementControlFlowFlatteningNode,
     CallExpressionControlFlowStorageCallNode,
     CallExpressionFunctionNode,
     ControlFlowStorageNode,

+ 0 - 1
src/enums/container/NodeControlFlowReplacers.ts

@@ -1,6 +1,5 @@
 export enum NodeControlFlowReplacers {
     BinaryExpressionControlFlowReplacer,
-    BlockStatementControlFlowReplacer,
     CallExpressionControlFlowReplacer,
     LogicalExpressionControlFlowReplacer
 }

+ 1 - 0
src/enums/container/NodeTransformers.ts

@@ -1,4 +1,5 @@
 export enum NodeTransformers {
+    BlockStatementControlFlowTransformer,
     FunctionControlFlowTransformer,
     CatchClauseObfuscator,
     FunctionDeclarationObfuscator,

+ 25 - 24
src/node-transformers/node-control-flow-transformers/control-flow-replacers/BlockStatementControlFlowReplacer.ts → src/node-transformers/node-control-flow-transformers/BlockStatementControlFlowTransformer.ts

@@ -1,21 +1,26 @@
 import { injectable, inject } from 'inversify';
-import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
+import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
 
 import * as ESTree from 'estree';
 
-import { TCustomNodeFactory } from '../../../types/container/TCustomNodeFactory';
+import { TCustomNodeFactory } from '../../types/container/TCustomNodeFactory';
 
-import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
-import { IOptions } from '../../../interfaces/options/IOptions';
-import { IStorage } from '../../../interfaces/storages/IStorage';
+import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
+import { IOptions } from '../../interfaces/options/IOptions';
 
-import { AbstractControlFlowReplacer } from './AbstractControlFlowReplacer';
-import { CustomNodes } from '../../../enums/container/CustomNodes';
-import { Node } from '../../../node/Node';
-import { Utils } from '../../../utils/Utils';
+import { CustomNodes } from '../../enums/container/CustomNodes';
+
+import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
+import { Node } from '../../node/Node';
+import { Utils } from '../../utils/Utils';
 
 @injectable()
-export class BlockStatementControlFlowReplacer extends AbstractControlFlowReplacer {
+export class BlockStatementControlFlowTransformer extends AbstractNodeTransformer {
+    /**
+     * @type {TCustomNodeFactory}
+     */
+    private readonly customNodeFactory: TCustomNodeFactory;
+
     /**
      * @param customNodeFactory
      * @param options
@@ -24,7 +29,9 @@ export class BlockStatementControlFlowReplacer extends AbstractControlFlowReplac
         @inject(ServiceIdentifiers.Factory__ICustomNode) customNodeFactory: TCustomNodeFactory,
         @inject(ServiceIdentifiers.IOptions) options: IOptions
     ) {
-        super(customNodeFactory, options);
+        super(options);
+
+        this.customNodeFactory = customNodeFactory;
     }
 
     /**
@@ -43,16 +50,10 @@ export class BlockStatementControlFlowReplacer extends AbstractControlFlowReplac
 
     /**
      * @param blockStatementNode
-     * @param parentNode
-     * @param controlFlowStorage
      * @returns {ESTree.Node}
      */
-    public replace (
-        blockStatementNode: ESTree.BlockStatement,
-        parentNode: ESTree.Node,
-        controlFlowStorage: IStorage <ICustomNode>
-    ): ESTree.Node {
-        if (BlockStatementControlFlowReplacer.blockStatementHasProhibitedStatements(blockStatementNode)) {
+    public transformNode (blockStatementNode: ESTree.BlockStatement): ESTree.Node {
+        if (BlockStatementControlFlowTransformer.blockStatementHasProhibitedStatements(blockStatementNode)) {
             return blockStatementNode;
         }
 
@@ -65,16 +66,16 @@ export class BlockStatementControlFlowReplacer extends AbstractControlFlowReplac
             return blockStatementNode;
         }
 
-        const blockStatementControlFlowReplacerCustomNode: ICustomNode = this.customNodeFactory(
-            CustomNodes.BlockStatementControlFlowReplacerNode
+        const blockStatementControlFlowFlatteningCustomNode: ICustomNode = this.customNodeFactory(
+            CustomNodes.BlockStatementControlFlowFlatteningNode
         );
-        
-        blockStatementControlFlowReplacerCustomNode.initialize(
+
+        blockStatementControlFlowFlatteningCustomNode.initialize(
             blockStatementBody,
             shuffledKeys,
             originalKeysIndexesInShuffledArray
         );
 
-        return blockStatementControlFlowReplacerCustomNode.getNode()[0];
+        return blockStatementControlFlowFlatteningCustomNode.getNode()[0];
     }
 }

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

@@ -30,7 +30,6 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
      */
     private static readonly controlFlowReplacersMap: Map <string, NodeControlFlowReplacers> = new Map([
         [NodeType.BinaryExpression, NodeControlFlowReplacers.BinaryExpressionControlFlowReplacer],
-        [NodeType.BlockStatement, NodeControlFlowReplacers.BlockStatementControlFlowReplacer],
         [NodeType.CallExpression, NodeControlFlowReplacers.CallExpressionControlFlowReplacer],
         [NodeType.LogicalExpression, NodeControlFlowReplacers.LogicalExpressionControlFlowReplacer]
     ]);
@@ -165,7 +164,6 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer {
     /**
      * @param functionNodeBody
      * @param controlFlowStorage
-     * @return {ESTree.Node}
      */
     private transformFunctionBody (functionNodeBody: ESTree.BlockStatement, controlFlowStorage: IStorage<ICustomNode>): void {
         estraverse.replace(functionNodeBody, {

+ 5 - 87
test/dev/dev.ts

@@ -1,4 +1,5 @@
 'use strict';
+import { NO_CUSTOM_NODES_PRESET } from '../../src/options/presets/NoCustomNodes';
 
 if (!(<any>global)._babelPolyfill) {
     require('babel-polyfill');
@@ -9,98 +10,15 @@ if (!(<any>global)._babelPolyfill) {
 
     let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
         `
-            (function(){
-                var result = 1,
-                    term1 = 0,
-                    term2 = 1,
-                    i = 1;
-                while(i < 10)
-                {
-                    var test = 10;
-                    result = term1 + term2;
-                    console.log(result);
-                    term1 = term2;
-                    term2 = result;
-                    i++;
-                }
-        
-                console.log(test);
-                
-                var test = function (test) {
-                    console.log(test);
-                    
-                    if (true) {
-                        var test = 5
-                    }
-                    
-                    return test;
-                }
-                
-                console.log(test(1));
-                
-                function test2 (abc) {
-                    function test1 () {
-                      console.log('inside', abc.item);
-                    }
-                    
-                    console.log('тест', abc);
-                    
-                    var abc = {};
-                    
-                    return abc.item = 15, test1();
-                };
-                
-                var regexptest = /version\\/(\\d+)/i;
-                console.log(regexptest);
-                
-                test2(22);
-                console.log(105.4);
-                console.log(true, false);
-                
-                var sA = 'shorthand1';
-                var sB = 'shorthand2';
-                
-                console.log({sA, sB});
-                
-                function foo () {
-                    return function () {
-                        var sum1 = 10 + 20;
-                        var sum2 = 20 + 30;
-                        var sum3 = 30 + 50;
-                        var sub = sum3 - sum2;
-                        
-                        return sum1 + sub;
-                    }
-                }
-                
-                try {
-                } catch (error) {
-                    console.log(error);
-                }
-                
-                console.log(foo()());
-                
-                function bar () {
-                    console.log(1);
-                    console.log(2);
-                    console.log(3);
-                    console.log(4);
-                    console.log(5);
-                    console.log(6);
-                    console.log(7);
-                    console.log(8);
-                }
-                
-                bar();
+            (function () {
+                var abc = 1 + 1;
             })();
         `,
         {
-            compact: false,
+            ...NO_CUSTOM_NODES_PRESET,
             controlFlowFlattening: true,
             controlFlowFlatteningThreshold: 1,
-            disableConsoleOutput: false,
-            stringArray: true,
-            unicodeEscapeSequence: false
+            compact: false
         }
     ).getObfuscatedCode();
 

+ 7 - 0
test/fixtures/node-transformers/node-control-flow-transformers/block-statement-control-flow-transformer-1.js

@@ -0,0 +1,7 @@
+(function () {
+    console.log(1);
+    console.log(2);
+    console.log(3);
+    console.log(4);
+    console.log(5);
+})();

+ 0 - 0
test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/binary-expression-control-flow-replacer-1.js → test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer-1.js


+ 0 - 0
test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/binary-expression-control-flow-replacer-2.js → test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer-2.js


+ 0 - 0
test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/call-expression-control-flow-replacer-1.js → test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer-1.js


+ 0 - 0
test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/call-expression-control-flow-replacer-2.js → test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer-2.js


+ 0 - 0
test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/call-expression-control-flow-replacer-3.js → test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer-3.js


+ 0 - 0
test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/logical-expression-control-flow-replacer-1.js → test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-1.js


+ 0 - 0
test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/logical-expression-control-flow-replacer-2.js → test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-2.js


+ 0 - 0
test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/logical-expression-control-flow-replacer-3.js → test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-3.js


+ 0 - 0
test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/logical-expression-control-flow-replacer-prohibited-nodes-1.js → test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-prohibited-nodes-1.js


+ 60 - 0
test/functional-tests/node-transformers/node-control-flow-transformers/BlockStatementControlFlowTransformer.spec.ts

@@ -0,0 +1,60 @@
+import { assert } from 'chai';
+
+import { IObfuscationResult } from '../../../../src/interfaces/IObfuscationResult';
+
+import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustomNodes';
+
+import { readFileAsString } from '../../../helpers/readFileAsString';
+
+import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator';
+
+describe('BlockStatementControlFlowTransformer', () => {
+    describe('transformNode (blockStatementNode: ESTree.BlockStatement): ESTree.Node', () => {
+        describe('variant #1: 5 simple statements', () => {
+            const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
+                readFileAsString(
+                    './test/fixtures/node-transformers/node-control-flow-transformers/block-statement-control-flow-transformer-1.js'
+                ),
+                {
+                    ...NO_CUSTOM_NODES_PRESET,
+                    controlFlowFlattening: true,
+                    controlFlowFlatteningThreshold: 1,
+                    unicodeEscapeSequence: false
+                }
+            );
+            const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
+
+            const statementRegExp1: RegExp = /console\['log'\]\(0x1\);/;
+            const statementRegExp2: RegExp = /console\['log'\]\(0x2\);/;
+            const statementRegExp3: RegExp = /console\['log'\]\(0x3\);/;
+            const statementRegExp4: RegExp = /console\['log'\]\(0x4\);/;
+            const statementRegExp5: RegExp = /console\['log'\]\(0x5\);/;
+
+            const switchCaseRegExp: RegExp = /switch *\(_0x([a-z0-9]){4,6}\[_0x([a-z0-9]){4,6}\+\+\]\) *\{/;
+            const switchCaseLengthRegExp: RegExp = /case *'[0-5]': *console\['log'\]\(0x[0-6]\);/g;
+            const switchCaseLength: number = obfuscatedCode.match(switchCaseLengthRegExp)!.length;
+
+            const switchCaseMapRegExp: RegExp = /var *_0x(?:[a-z0-9]){4,6} *= *'(.*?)'/;
+            const switchCaseMapMatches: RegExpMatchArray = <RegExpMatchArray>obfuscatedCode.match(switchCaseMapRegExp);
+            const switchCaseMapMatch: string = switchCaseMapMatches[1];
+            const switchCaseMap: string[] = switchCaseMapMatch.replace(/\\x7c/g, '|').split('|').sort();
+
+            it('should save all statements', () => {
+                assert.match(obfuscatedCode, statementRegExp1);
+                assert.match(obfuscatedCode, statementRegExp2);
+                assert.match(obfuscatedCode, statementRegExp3);
+                assert.match(obfuscatedCode, statementRegExp4);
+                assert.match(obfuscatedCode, statementRegExp5);
+            });
+
+            it('should wrap block statement statements in switch case structure', () => {
+                assert.match(obfuscatedCode, switchCaseRegExp);
+                assert.equal(switchCaseLength, 5);
+            });
+
+            it('should create variable with order of switch cases sequence', () => {
+                assert.deepEqual(switchCaseMap, ['0', '1', '2', '3', '4']);
+            });
+        });
+    });
+});

+ 2 - 2
test/functional-tests/node-transformers/node-control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.spec.ts

@@ -13,7 +13,7 @@ describe('BinaryExpressionControlFlowReplacer', () => {
         describe('variant #1 - single binary expression', () => {
             const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
                 readFileAsString(
-                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/binary-expression-control-flow-replacer-1.js'
+                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer-1.js'
                 ),
                 {
                     ...NO_CUSTOM_NODES_PRESET,
@@ -42,7 +42,7 @@ describe('BinaryExpressionControlFlowReplacer', () => {
                 for (let i = 0; i < samplesCount; i++) {
                     const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
                         readFileAsString(
-                            './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer/binary-expression-control-flow-replacer-2.js'
+                            './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/binary-expression-control-flow-replacer-2.js'
                         ),
                         {
                             ...NO_CUSTOM_NODES_PRESET,

+ 3 - 3
test/functional-tests/node-transformers/node-control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.spec.ts

@@ -13,7 +13,7 @@ describe('CallExpressionControlFlowReplacer', () => {
         describe('variant #1 - single call expression', () => {
             const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
                 readFileAsString(
-                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/call-expression-control-flow-replacer-1.js'
+                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer-1.js'
                 ),
                 {
                     ...NO_CUSTOM_NODES_PRESET,
@@ -42,7 +42,7 @@ describe('CallExpressionControlFlowReplacer', () => {
                 for (let i = 0; i < samplesCount; i++) {
                     const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
                         readFileAsString(
-                            './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/call-expression-control-flow-replacer-2.js'
+                            './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer-2.js'
                         ),
                         {
                             ...NO_CUSTOM_NODES_PRESET,
@@ -77,7 +77,7 @@ describe('CallExpressionControlFlowReplacer', () => {
         describe('variant #3 - callee - member expression', () => {
             const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
                 readFileAsString(
-                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer/call-expression-control-flow-replacer-3.js'
+                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/call-expression-control-flow-replacer-3.js'
                 ),
                 {
                     ...NO_CUSTOM_NODES_PRESET,

+ 4 - 4
test/functional-tests/node-transformers/node-control-flow-transformers/control-flow-replacers/LogicalExpressionControlFlowReplacer.spec.ts

@@ -13,7 +13,7 @@ describe('LogicalExpressionControlFlowReplacer', () => {
         describe('variant #1 - single logical expression', () => {
             const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
                 readFileAsString(
-                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/logical-expression-control-flow-replacer-1.js'
+                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-1.js'
                 ),
                 {
                     ...NO_CUSTOM_NODES_PRESET,
@@ -42,7 +42,7 @@ describe('LogicalExpressionControlFlowReplacer', () => {
                 for (let i = 0; i < samplesCount; i++) {
                     const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
                         readFileAsString(
-                            './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/logical-expression-control-flow-replacer-2.js'
+                            './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-2.js'
                         ),
                         {
                             ...NO_CUSTOM_NODES_PRESET,
@@ -77,7 +77,7 @@ describe('LogicalExpressionControlFlowReplacer', () => {
         describe('variant #3 - single logical expression with unary expression', () => {
             const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
                 readFileAsString(
-                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/logical-expression-control-flow-replacer-3.js'
+                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-3.js'
                 ),
                 {
                     ...NO_CUSTOM_NODES_PRESET,
@@ -96,7 +96,7 @@ describe('LogicalExpressionControlFlowReplacer', () => {
         describe('prohibited nodes variant #1', () => {
             const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
                 readFileAsString(
-                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer/logical-expression-control-flow-replacer-prohibited-nodes-1.js'
+                    './test/fixtures/node-transformers/node-control-flow-transformers/control-flow-replacers/logical-expression-control-flow-replacer-prohibited-nodes-1.js'
                 ),
                 {
                     ...NO_CUSTOM_NODES_PRESET,

+ 1 - 0
test/index.spec.ts

@@ -30,6 +30,7 @@ import './functional-tests/custom-nodes/domain-lock-nodes/DomainLockNode.spec';
 import './functional-tests/custom-nodes/string-array-nodes/StringArrayCallsWrapper.spec';
 import './functional-tests/custom-nodes/string-array-nodes/StringArrayRotateFunctionNode.spec';
 import './functional-tests/custom-nodes/string-array-nodes/StringArrayNode.spec';
+import './functional-tests/node-transformers/node-control-flow-transformers/BlockStatementControlFlowTransformer.spec';
 import './functional-tests/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.spec';
 import './functional-tests/node-transformers/node-control-flow-transformers/control-flow-replacers/BinaryExpressionControlFlowReplacer.spec';
 import './functional-tests/node-transformers/node-control-flow-transformers/control-flow-replacers/CallExpressionControlFlowReplacer.spec';

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä