From c0cd04d2bf386948afe7d6bc067de5e82c5e301a Mon Sep 17 00:00:00 2001 From: sanex Date: Sun, 15 Nov 2020 23:14:30 +0300 Subject: [PATCH] Added `stringArrayWrappersParametersMaxCount` option --- CHANGELOG.md | 2 ++ README.md | 19 ++++++++++++++++--- src/cli/JavaScriptObfuscatorCLI.ts | 5 +++++ ...yRootCallsWrapperParametersDefaultCount.ts | 6 ------ ...rrayScopeCallsWrapperParametersMaxCount.ts | 6 ------ .../AbstractStringArrayCallNode.ts | 7 +++++++ .../string-array-nodes/StringArrayCallNode.ts | 7 ++----- ...tringArrayScopeCallsWrapperFunctionNode.ts | 11 ++++------- src/interfaces/options/IOptions.ts | 1 + .../StringArrayTransformer.ts | 4 +--- src/options/Options.ts | 7 +++++++ src/options/presets/Default.ts | 1 + src/options/presets/HighObfuscation.ts | 3 +-- src/options/presets/MediumObfuscation.ts | 3 +++ src/options/presets/NoCustomNodes.ts | 1 + test/dev/dev.ts | 2 ++ .../JavaScriptObfuscator.spec.ts | 1 + .../JavaScriptObfuscatorRuntime.spec.ts | 1 + 18 files changed, 55 insertions(+), 32 deletions(-) delete mode 100644 src/constants/node-transformers/string-array-transformers/StringArrayRootCallsWrapperParametersDefaultCount.ts delete mode 100644 src/constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 24b460de..be2ce221 100644 --- a/CHANGELOG.md +++ b/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 --- diff --git a/README.md b/README.md index d32e1e3f..ad713dd6 100644 --- a/README.md +++ b/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 diff --git a/src/cli/JavaScriptObfuscatorCLI.ts b/src/cli/JavaScriptObfuscatorCLI.ts index e44da194..77ffca00 100644 --- a/src/cli/JavaScriptObfuscatorCLI.ts +++ b/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 ', + 'Allows to control the maximum number of string array wrappers parameters', + parseInt + ) .option( '--string-array-wrappers-type ', 'Allows to select a type of the wrappers that are appending by the `--string-array-wrappers-count` option. ' + diff --git a/src/constants/node-transformers/string-array-transformers/StringArrayRootCallsWrapperParametersDefaultCount.ts b/src/constants/node-transformers/string-array-transformers/StringArrayRootCallsWrapperParametersDefaultCount.ts deleted file mode 100644 index ec693a45..00000000 --- a/src/constants/node-transformers/string-array-transformers/StringArrayRootCallsWrapperParametersDefaultCount.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Max count of root string array calls wrapper parameters - * - * @type {number} - */ -export const stringArrayRootCallsWrapperParametersDefaultCount: number = 2; diff --git a/src/constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount.ts b/src/constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount.ts deleted file mode 100644 index 7e48c371..00000000 --- a/src/constants/node-transformers/string-array-transformers/StringArrayScopeCallsWrapperParametersMaxCount.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Max count of scope string array calls wrapper parameters - * - * @type {number} - */ -export const stringArrayScopeCallsWrapperParametersMaxCount: number = 5; diff --git a/src/custom-nodes/string-array-nodes/AbstractStringArrayCallNode.ts b/src/custom-nodes/string-array-nodes/AbstractStringArrayCallNode.ts index 99df254a..eb56201b 100644 --- a/src/custom-nodes/string-array-nodes/AbstractStringArrayCallNode.ts +++ b/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} */ diff --git a/src/custom-nodes/string-array-nodes/StringArrayCallNode.ts b/src/custom-nodes/string-array-nodes/StringArrayCallNode.ts index acc978b9..446e6c67 100644 --- a/src/custom-nodes/string-array-nodes/StringArrayCallNode.ts +++ b/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) ); diff --git a/src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode.ts b/src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode.ts index 4cb3620e..ada05c2e 100644 --- a/src/custom-nodes/string-array-nodes/StringArrayScopeCallsWrapperFunctionNode.ts +++ b/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() diff --git a/src/interfaces/options/IOptions.ts b/src/interfaces/options/IOptions.ts index a264155f..ac435b11 100644 --- a/src/interfaces/options/IOptions.ts +++ b/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; diff --git a/src/node-transformers/string-array-transformers/StringArrayTransformer.ts b/src/node-transformers/string-array-transformers/StringArrayTransformer.ts index 0a28d31b..4fcc25ab 100644 --- a/src/node-transformers/string-array-transformers/StringArrayTransformer.ts +++ b/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]); diff --git a/src/options/Options.ts b/src/options/Options.ts index e7c99a22..582d1dcf 100644 --- a/src/options/Options.ts +++ b/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} */ diff --git a/src/options/presets/Default.ts b/src/options/presets/Default.ts index 4a88e4cb..c708324f 100644 --- a/src/options/presets/Default.ts +++ b/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, diff --git a/src/options/presets/HighObfuscation.ts b/src/options/presets/HighObfuscation.ts index 7528ad7f..0a01af73 100644 --- a/src/options/presets/HighObfuscation.ts +++ b/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 }); diff --git a/src/options/presets/MediumObfuscation.ts b/src/options/presets/MediumObfuscation.ts index d2dc4ef8..a88044e6 100644 --- a/src/options/presets/MediumObfuscation.ts +++ b/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 }); diff --git a/src/options/presets/NoCustomNodes.ts b/src/options/presets/NoCustomNodes.ts index 81daad76..175cafef 100644 --- a/src/options/presets/NoCustomNodes.ts +++ b/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, diff --git a/test/dev/dev.ts b/test/dev/dev.ts index 9479ed99..de40728b 100644 --- a/test/dev/dev.ts +++ b/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(); diff --git a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts b/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts index dda758db..7ce6517e 100644 --- a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts +++ b/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, diff --git a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts b/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts index d33107f4..4908054c 100644 --- a/test/runtime-tests/JavaScriptObfuscatorRuntime.spec.ts +++ b/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,