Forráskód Böngészése

Added `stringArrayWrappersParametersMaxCount` option

sanex 4 éve
szülő
commit
c0cd04d2bf

+ 2 - 0
CHANGELOG.md

@@ -5,6 +5,8 @@ v2.9.0
 * New option: `stringArrayIndexesType` accepts an array of types of string array call indexes
 * Changed default type of all string array call indexes from `hexadecimal-numeric-string` to `hexadecimal-number`
 * New option: `stringArrayIndexShift` enables additional index shift for all string array calls
+* New option: `stringArrayWrappersParametersMaxCount` allows to control the maximum number of string array wrappers parameters
+* `stringArrayWrappersType: 'function'` option value moved from `high-obfuscation` to `medium-obfuscation` options preset
 
 v2.8.1
 ---

+ 16 - 3
README.md

@@ -1126,6 +1126,15 @@ function test() {
 }
 ```
 
+### `stringArrayWrappersParametersCount`
+Type: `number` Default: `2`
+
+##### :warning: [`stringArray`](#stringarray) option must be enabled
+##### :warning: Currently this option affects only wrappers added by [`stringArrayWrappersType`](#stringarraywrapperstype) `function` option value
+
+Allows to control the maximum number of string array wrappers parameters.
+Default and minimum value is `2`. Recommended value between `2` and `5`.
+
 ### `stringArrayWrappersType`
 Type: `string` Default: `variable`
 
@@ -1135,7 +1144,7 @@ Allows to select a type of the wrappers that are appending by the `stringArrayWr
 
 Available values:
 * `'variable'`: appends variable wrappers. Fast performance.
-* `'function'`: appends function wrappers. More slow performance than with `variable` but allows to additionally shift the `stringArray` index.
+* `'function'`: appends function wrappers. Slower performance than with `variable` but provides more strict obfuscation
 
 Highly recommended to use `function` wrappers for higher obfuscation when a performance loss doesn't have a high impact on an obfuscated application.
 
@@ -1270,7 +1279,8 @@ Performance will 50-100% slower than without obfuscation
     stringArrayEncoding: ['rc4'],
     stringArrayIndexShift: true,
     stringArrayWrappersCount: 5,
-    stringArrayWrappersChainedCalls: true,
+    stringArrayWrappersChainedCalls: true,    
+    stringArrayWrappersParametersMaxCount: 5,
     stringArrayWrappersType: 'function',
     stringArrayThreshold: 1,
     transformObjectKeys: true,
@@ -1307,7 +1317,8 @@ Performance will 30-35% slower than without obfuscation
     stringArrayIndexShift: true,
     stringArrayWrappersCount: 2,
     stringArrayWrappersChainedCalls: true,
-    stringArrayWrappersType: 'variable',
+    stringArrayWrappersParametersMaxCount: 4,
+    stringArrayWrappersType: 'function',
     stringArrayThreshold: 0.75,
     transformObjectKeys: true,
     unicodeEscapeSequence: false
@@ -1340,6 +1351,7 @@ Performance will slightly slower than without obfuscation
     stringArrayIndexShift: true,
     stringArrayWrappersCount: 1,
     stringArrayWrappersChainedCalls: true,
+    stringArrayWrappersParametersMaxCount: 2,
     stringArrayWrappersType: 'variable',
     stringArrayThreshold: 0.75,
     unicodeEscapeSequence: false
@@ -1370,6 +1382,7 @@ Performance will slightly slower than without obfuscation
     stringArrayIndexShift: true,
     stringArrayWrappersCount: 1,
     stringArrayWrappersChainedCalls: true,
+    stringArrayWrappersParametersMaxCount: 2,
     stringArrayWrappersType: 'variable',
     stringArrayThreshold: 0.75,
     unicodeEscapeSequence: false

+ 5 - 0
src/cli/JavaScriptObfuscatorCLI.ts

@@ -373,6 +373,11 @@ export class JavaScriptObfuscatorCLI implements IInitializable {
                 'Enables the chained calls between string array wrappers',
                 BooleanSanitizer
             )
+            .option(
+                '--string-array-wrappers-parameters-count <number>',
+                'Allows to control the maximum number of string array wrappers parameters',
+                parseInt
+            )
             .option(
                 '--string-array-wrappers-type <string>',
                 'Allows to select a type of the wrappers that are appending by the `--string-array-wrappers-count` option. ' +

+ 0 - 6
src/constants/node-transformers/string-array-transformers/StringArrayRootCallsWrapperParametersDefaultCount.ts

@@ -1,6 +0,0 @@
-/**
- * Max count of root string array calls wrapper parameters
- *
- * @type {number}
- */
-export const stringArrayRootCallsWrapperParametersDefaultCount: number = 2;

+ 0 - 6
src/constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount.ts

@@ -1,6 +0,0 @@
-/**
- * Max count of scope string array calls wrapper parameters
- *
- * @type {number}
- */
-export const stringArrayScopeCallsWrapperParametersMaxCount: number = 5;

+ 7 - 0
src/custom-nodes/string-array-nodes/AbstractStringArrayCallNode.ts

@@ -23,6 +23,13 @@ import { IArrayUtils } from '../../interfaces/utils/IArrayUtils';
 
 @injectable()
 export abstract class AbstractStringArrayCallNode extends AbstractCustomNode {
+    /**
+     * Max count of root string array calls wrapper parameters
+     *
+     * @type {number}
+     */
+    protected static readonly stringArrayRootCallsWrapperParametersCount: number = 2;
+
     /**
      * @type {Map<TStringArrayIndexesType, StringArrayIndexNode>}
      */

+ 2 - 5
src/custom-nodes/string-array-nodes/StringArrayCallNode.ts

@@ -16,9 +16,6 @@ import { IStringArrayStorage } from '../../interfaces/storages/string-array-tran
 
 import { initializable } from '../../decorators/Initializable';
 
-import { stringArrayRootCallsWrapperParametersDefaultCount } from '../../constants/node-transformers/string-array-transformers/StringArrayRootCallsWrapperParametersDefaultCount';
-import { stringArrayScopeCallsWrapperParametersMaxCount } from '../../constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount';
-
 import { AbstractStringArrayCallNode } from './AbstractStringArrayCallNode';
 import { NodeFactory } from '../../node/NodeFactory';
 import { NodeUtils } from '../../node/NodeUtils';
@@ -122,9 +119,9 @@ export class StringArrayCallNode extends AbstractStringArrayCallNode {
         const callExpressionArgs: ESTree.Expression[] = this.arrayUtils.fillWithRange(
             !this.stringArrayCallsWrapperParameterIndexesData
                 // root string array calls wrapper
-                ? stringArrayRootCallsWrapperParametersDefaultCount
+                ? AbstractStringArrayCallNode.stringArrayRootCallsWrapperParametersCount
                 // scope string array calls wrapper
-                : stringArrayScopeCallsWrapperParametersMaxCount,
+                : this.options.stringArrayWrappersParametersMaxCount,
             () => this.getFakeStringArrayIndexNode(resultIndex)
         );
 

+ 4 - 7
src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode.ts

@@ -16,12 +16,9 @@ import { IStringArrayStorage } from '../../interfaces/storages/string-array-tran
 
 import { initializable } from '../../decorators/Initializable';
 
-import { stringArrayScopeCallsWrapperParametersMaxCount } from '../../constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount';
-
 import { AbstractStringArrayCallNode } from './AbstractStringArrayCallNode';
 import { NodeFactory } from '../../node/NodeFactory';
 import { NodeUtils } from '../../node/NodeUtils';
-import { stringArrayRootCallsWrapperParametersDefaultCount } from '../../constants/node-transformers/string-array-transformers/StringArrayRootCallsWrapperParametersDefaultCount';
 
 @injectable()
 export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArrayCallNode {
@@ -127,9 +124,9 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
         const parameters: ESTree.Identifier[] = this.arrayUtils.fillWithRange(
             !this.stringArrayScopeCallsWrapperParameterIndexesData
                 // root string array calls wrapper
-                ? stringArrayRootCallsWrapperParametersDefaultCount
+                ? AbstractStringArrayCallNode.stringArrayRootCallsWrapperParametersCount
                 // scope string array calls wrapper
-                : stringArrayScopeCallsWrapperParametersMaxCount,
+                : this.options.stringArrayWrappersParametersMaxCount,
             () => this.getFakeParameterNode()
         );
         parameters.splice(this.stringArrayScopeCallsWrapperParameterIndexesData?.index ?? 0, 1, stringArrayCallIdentifierNode);
@@ -140,9 +137,9 @@ export class StringArrayScopeCallsWrapperFunctionNode extends AbstractStringArra
         const callExpressionArgs: ESTree.Expression[] = this.arrayUtils.fillWithRange(
             !this.upperStringArrayCallsWrapperParameterIndexesData
                 // root string array calls wrapper
-                ? stringArrayRootCallsWrapperParametersDefaultCount
+                ? AbstractStringArrayCallNode.stringArrayRootCallsWrapperParametersCount
                 // scope string array calls wrapper
-                : stringArrayScopeCallsWrapperParametersMaxCount,
+                : this.options.stringArrayWrappersParametersMaxCount,
             (index: number) => this.getUpperStringArrayCallNode(
                 parameters[index],
                 this.getFakeUpperStringArrayIndexNode()

+ 1 - 0
src/interfaces/options/IOptions.ts

@@ -48,6 +48,7 @@ export interface IOptions {
     readonly stringArrayIndexShift: boolean;
     readonly stringArrayWrappersChainedCalls: boolean;
     readonly stringArrayWrappersCount: number;
+    readonly stringArrayWrappersParametersMaxCount: number;
     readonly stringArrayWrappersType: TStringArrayWrappersType;
     readonly stringArrayThreshold: number;
     readonly target: TTypeFromEnum<typeof ObfuscationTarget>;

+ 1 - 3
src/node-transformers/string-array-transformers/StringArrayTransformer.ts

@@ -30,8 +30,6 @@ import { NodeTransformationStage } from '../../enums/node-transformers/NodeTrans
 import { StringArrayCustomNode } from '../../enums/custom-nodes/StringArrayCustomNode';
 import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
 
-import { stringArrayScopeCallsWrapperParametersMaxCount } from '../../constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount';
-
 import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
 import { NodeGuards } from '../../node/NodeGuards';
 import { NodeLiteralUtils } from '../../node/NodeLiteralUtils';
@@ -407,7 +405,7 @@ export class StringArrayTransformer extends AbstractNodeTransformer {
      */
     private getStringArrayCallsWrapperParameterIndexesData (): IStringArrayScopeCallsWrapperParameterIndexesData {
         const minIndexValue: number = 0;
-        const maxIndexValue: number = stringArrayScopeCallsWrapperParametersMaxCount - 1;
+        const maxIndexValue: number = this.options.stringArrayWrappersParametersMaxCount - 1;
 
         const index: number = this.randomGenerator.getRandomInteger(minIndexValue, maxIndexValue);
         const decodeKey: number = this.randomGenerator.getRandomIntegerExcluding(minIndexValue, maxIndexValue, [index]);

+ 7 - 0
src/options/Options.ts

@@ -344,6 +344,13 @@ export class Options implements IOptions {
     @Min(0)
     public readonly stringArrayWrappersCount!: number;
 
+    /**
+     * @type {boolean}
+     */
+    @IsNumber()
+    @Min(2)
+    public readonly stringArrayWrappersParametersMaxCount!: number;
+
     /**
      * @type {TStringArrayWrappersType}
      */

+ 1 - 0
src/options/presets/Default.ts

@@ -54,6 +54,7 @@ export const DEFAULT_PRESET: TInputOptions = Object.freeze({
     stringArrayIndexShift: true,
     stringArrayWrappersChainedCalls: true,
     stringArrayWrappersCount: 1,
+    stringArrayWrappersParametersMaxCount: 2,
     stringArrayWrappersType: StringArrayWrappersType.Variable,
     stringArrayThreshold: 0.75,
     target: ObfuscationTarget.Browser,

+ 1 - 2
src/options/presets/HighObfuscation.ts

@@ -2,7 +2,6 @@ import { TInputOptions } from '../../types/options/TInputOptions';
 
 import { OptionsPreset } from '../../enums/options/presets/OptionsPreset';
 import { StringArrayEncoding } from '../../enums/node-transformers/string-array-transformers/StringArrayEncoding';
-import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
 
 import { MEDIUM_OBFUSCATION_PRESET } from './MediumObfuscation';
 
@@ -18,6 +17,6 @@ export const HIGH_OBFUSCATION_PRESET: TInputOptions = Object.freeze({
         StringArrayEncoding.Rc4
     ],
     stringArrayWrappersCount: 5,
-    stringArrayWrappersType: StringArrayWrappersType.Function,
+    stringArrayWrappersParametersMaxCount: 5,
     stringArrayThreshold: 1
 });

+ 3 - 0
src/options/presets/MediumObfuscation.ts

@@ -2,6 +2,7 @@ import { TInputOptions } from '../../types/options/TInputOptions';
 
 import { OptionsPreset } from '../../enums/options/presets/OptionsPreset';
 import { StringArrayEncoding } from '../../enums/node-transformers/string-array-transformers/StringArrayEncoding';
+import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
 
 import { LOW_OBFUSCATION_PRESET } from './LowObfuscation';
 
@@ -17,5 +18,7 @@ export const MEDIUM_OBFUSCATION_PRESET: TInputOptions = Object.freeze({
         StringArrayEncoding.Base64
     ],
     stringArrayWrappersCount: 2,
+    stringArrayWrappersParametersMaxCount: 4,
+    stringArrayWrappersType: StringArrayWrappersType.Function,
     transformObjectKeys: true
 });

+ 1 - 0
src/options/presets/NoCustomNodes.ts

@@ -51,6 +51,7 @@ export const NO_ADDITIONAL_NODES_PRESET: TInputOptions = Object.freeze({
     stringArrayIndexShift: false,
     stringArrayWrappersChainedCalls: false,
     stringArrayWrappersCount: 0,
+    stringArrayWrappersParametersMaxCount: 2,
     stringArrayWrappersType: StringArrayWrappersType.Variable,
     stringArrayThreshold: 0,
     target: ObfuscationTarget.Browser,

+ 2 - 0
test/dev/dev.ts

@@ -37,6 +37,7 @@ import { StringArrayEncoding } from '../../src/enums/node-transformers/string-ar
             shuffleStringArray: true,
             stringArray: true,
             stringArrayEncoding: [
+                StringArrayEncoding.None,
                 StringArrayEncoding.Rc4
             ],
             stringArrayIndexesType: [
@@ -47,6 +48,7 @@ import { StringArrayEncoding } from '../../src/enums/node-transformers/string-ar
             stringArrayThreshold: 1,
             stringArrayWrappersCount: 2,
             stringArrayWrappersChainedCalls: true,
+            stringArrayWrappersParametersMaxCount: 5,
             stringArrayWrappersType: 'function'
         }
     ).getObfuscatedCode();

+ 1 - 0
test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts

@@ -926,6 +926,7 @@ describe('JavaScriptObfuscator', () => {
                         stringArrayIndexShift: true,
                         stringArrayWrappersChainedCalls: true,
                         stringArrayWrappersCount: 10,
+                        stringArrayWrappersParametersMaxCount: 5,
                         stringArrayWrappersType: StringArrayWrappersType.Function,
                         stringArrayThreshold: 1,
                         transformObjectKeys: true,

+ 1 - 0
test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts

@@ -48,6 +48,7 @@ describe('JavaScriptObfuscator runtime eval', function () {
         stringArrayIndexShift: true,
         stringArrayWrappersChainedCalls: true,
         stringArrayWrappersCount: 5,
+        stringArrayWrappersParametersMaxCount: 5,
         stringArrayWrappersType: StringArrayWrappersType.Function,
         stringArrayThreshold: 1,
         transformObjectKeys: true,