From 67d877668231f90c09c14d8a489666afa5f12832 Mon Sep 17 00:00:00 2001 From: sanex Date: Wed, 9 Feb 2022 21:51:30 +0300 Subject: [PATCH] Dead code injection transformer ignores PrivateIdentifier nodes --- CHANGELOG.md | 4 ++ package.json | 2 +- src/enums/node/NodeType.ts | 1 + .../DeadCodeInjectionTransformer.ts | 3 +- src/node/NodeGuards.ts | 8 +++ .../DeadCodeInjectionTransformer.spec.ts | 51 +++++++++++++++++++ .../fixtures/private-identifier.js | 29 +++++++++++ 7 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/private-identifier.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f92df5e1..0df82e551 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ Change Log +v3.2.5 +--- +* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1056 + v3.2.4 --- * Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1052 diff --git a/package.json b/package.json index 11227e279..eb31e247c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "javascript-obfuscator", - "version": "3.2.4", + "version": "3.2.5", "description": "JavaScript obfuscator", "keywords": [ "obfuscator", diff --git a/src/enums/node/NodeType.ts b/src/enums/node/NodeType.ts index 4723442d5..4d35273bc 100644 --- a/src/enums/node/NodeType.ts +++ b/src/enums/node/NodeType.ts @@ -40,6 +40,7 @@ export enum NodeType { NewExpression = 'NewExpression', ObjectExpression = 'ObjectExpression', ObjectPattern = 'ObjectPattern', + PrivateIdentifier = 'PrivateIdentifier', Program = 'Program', Property = 'Property', PropertyDefinition = 'PropertyDefinition', diff --git a/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts b/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts index 46493ba62..abf6b85d0 100644 --- a/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts +++ b/src/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.ts @@ -107,7 +107,8 @@ export class DeadCodeInjectionTransformer extends AbstractNodeTransformer { || NodeGuards.isAwaitExpressionNode(targetNode) || NodeGuards.isYieldExpressionNode(targetNode) || NodeGuards.isSuperNode(targetNode) - || (NodeGuards.isForOfStatementNode(targetNode) && targetNode.await); + || (NodeGuards.isForOfStatementNode(targetNode) && targetNode.await) + || NodeGuards.isPrivateIdentifierNode(targetNode); } /** diff --git a/src/node/NodeGuards.ts b/src/node/NodeGuards.ts index 2015435d6..0cec976da 100644 --- a/src/node/NodeGuards.ts +++ b/src/node/NodeGuards.ts @@ -447,6 +447,14 @@ export class NodeGuards { return node.type === NodeType.ObjectExpression; } + /** + * @param {Node} node + * @returns {boolean} + */ + public static isPrivateIdentifierNode (node: ESTree.Node): node is ESTree.PrivateIdentifier { + return node.type === NodeType.PrivateIdentifier; + } + /** * @param {Node} node * @returns {boolean} diff --git a/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts b/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts index 708edee61..239f152a4 100644 --- a/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts +++ b/test/functional-tests/node-transformers/dead-code-injection-transformers/DeadCodeInjectionTransformer.spec.ts @@ -489,6 +489,57 @@ describe('DeadCodeInjectionTransformer', () => { assert.equal(awaitExpressionMatchesLength, expectedAwaitExpressionMatchesLength); }); }); + + describe('Variant #7 - private identifier in block statement', () => { + const functionRegExp: RegExp = new RegExp( + `var ${variableMatch} *= *function *\\(\\) *\\{` + + `console\\[${variableMatch}\\(${hexMatch}\\)\\]\\(${variableMatch}\\(${hexMatch}\\)\\);` + + `\\};`, + 'g' + ); + const privateIdentifierRegExp: RegExp = new RegExp( + `this\.#private *= *0x1;`, + 'g' + ); + const expectedFunctionMatchesLength: number = 4; + const expectedPrivateIdentifierMatchesLength: number = 1; + + let functionMatchesLength: number = 0, + privateIdentifierMatchesLength: number = 0; + + before(() => { + const code: string = readFileAsString(__dirname + '/fixtures/private-identifier.js'); + + const obfuscatedCode: string = JavaScriptObfuscator.obfuscate( + code, + { + ...NO_ADDITIONAL_NODES_PRESET, + deadCodeInjection: true, + deadCodeInjectionThreshold: 1, + stringArray: true, + stringArrayThreshold: 1 + } + ).getObfuscatedCode(); + const functionMatches: RegExpMatchArray = obfuscatedCode.match(functionRegExp); + const privateIdentifierMatches: RegExpMatchArray = obfuscatedCode.match(privateIdentifierRegExp); + + if (functionMatches) { + functionMatchesLength = functionMatches.length; + } + + if (privateIdentifierMatches) { + privateIdentifierMatchesLength = privateIdentifierMatches.length; + } + }); + + it('match #1: shouldn\'t add dead code', () => { + assert.equal(functionMatchesLength, expectedFunctionMatchesLength); + }); + + it('match #2: shouldn\'t add dead code', () => { + assert.equal(privateIdentifierMatchesLength, expectedPrivateIdentifierMatchesLength); + }); + }); }); describe('Variant #5 - chance of `IfStatement` variant', () => { diff --git a/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/private-identifier.js b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/private-identifier.js new file mode 100644 index 000000000..4872e698b --- /dev/null +++ b/test/functional-tests/node-transformers/dead-code-injection-transformers/fixtures/private-identifier.js @@ -0,0 +1,29 @@ +class Foo { + #private; + + constructor(props) { + if (true) { + var foo = function () { + console.log('abc'); + }; + var bar = function () { + console.log('def'); + }; + var baz = function () { + console.log('ghi'); + }; + var bark = function () { + console.log('jkl'); + }; + + if (true) { + this.#private = 1; + } + + foo(); + bar(); + baz(); + bark(); + } + } +} \ No newline at end of file