diff --git a/CHANGELOG.md b/CHANGELOG.md index a4bbce6ee..e65d3f70c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ v4.1.2 --- * Fix `transformObjectKeys` performance in some edge-cases * Fix `controlFlowFlattening` + optional chaining compatibility. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1325 +* Don't obfuscate import.meta.*. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1267 * Revert `Improved stringArray calls wrapper templates` commit. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1330 * Don't publish root index.ts files to NPM. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1252 * Update `class-validator` version. Fixes https://github.com/javascript-obfuscator/javascript-obfuscator/issues/1324 diff --git a/src/container/modules/node-transformers/PreparingTransformersModule.ts b/src/container/modules/node-transformers/PreparingTransformersModule.ts index 57dd7f132..f7309b4a6 100644 --- a/src/container/modules/node-transformers/PreparingTransformersModule.ts +++ b/src/container/modules/node-transformers/PreparingTransformersModule.ts @@ -14,6 +14,9 @@ import { CustomCodeHelpersTransformer } from '../../../node-transformers/prepari import { EvalCallExpressionTransformer } from '../../../node-transformers/preparing-transformers/EvalCallExpressionTransformer'; import { ForceTransformStringObfuscatingGuard } from '../../../node-transformers/preparing-transformers/obfuscating-guards/ForceTransformStringObfuscatingGuard'; import { IgnoredImportObfuscatingGuard } from '../../../node-transformers/preparing-transformers/obfuscating-guards/IgnoredImportObfuscatingGuard'; +import { + ImportMetaObfuscationGuard +} from '../../../node-transformers/preparing-transformers/obfuscating-guards/ImportMetaObfuscationGuard'; import { MetadataTransformer } from '../../../node-transformers/preparing-transformers/MetadataTransformer'; import { ObfuscatingGuardsTransformer } from '../../../node-transformers/preparing-transformers/ObfuscatingGuardsTransformer'; import { ParentificationTransformer } from '../../../node-transformers/preparing-transformers/ParentificationTransformer'; @@ -67,6 +70,11 @@ export const preparingTransformersModule: interfaces.ContainerModule = new Conta .inSingletonScope() .whenTargetNamed(ObfuscatingGuard.IgnoredImportObfuscatingGuard); + bind(ServiceIdentifiers.INodeGuard) + .to(ImportMetaObfuscationGuard) + .inSingletonScope() + .whenTargetNamed(ObfuscatingGuard.ImportMetaObfuscationGuard); + bind(ServiceIdentifiers.INodeGuard) .to(ReservedStringObfuscatingGuard) .inSingletonScope() diff --git a/src/enums/node-transformers/preparing-transformers/obfuscating-guards/ObfuscatingGuard.ts b/src/enums/node-transformers/preparing-transformers/obfuscating-guards/ObfuscatingGuard.ts index 023c70726..3da243455 100644 --- a/src/enums/node-transformers/preparing-transformers/obfuscating-guards/ObfuscatingGuard.ts +++ b/src/enums/node-transformers/preparing-transformers/obfuscating-guards/ObfuscatingGuard.ts @@ -3,5 +3,6 @@ export enum ObfuscatingGuard { ConditionalCommentObfuscatingGuard = 'ConditionalCommentObfuscatingGuard', ForceTransformStringObfuscatingGuard = 'ForceTransformStringObfuscatingGuard', IgnoredImportObfuscatingGuard = 'IgnoredImportObfuscatingGuard', + ImportMetaObfuscationGuard = 'ImportMetaObfuscationGuard', ReservedStringObfuscatingGuard = 'ReservedStringObfuscatingGuard' } diff --git a/src/enums/node/NodeType.ts b/src/enums/node/NodeType.ts index 4d35273bc..65baf57c1 100644 --- a/src/enums/node/NodeType.ts +++ b/src/enums/node/NodeType.ts @@ -36,6 +36,7 @@ export enum NodeType { Literal = 'Literal', LogicalExpression = 'LogicalExpression', MemberExpression = 'MemberExpression', + MetaProperty = 'MetaProperty', MethodDefinition = 'MethodDefinition', NewExpression = 'NewExpression', ObjectExpression = 'ObjectExpression', diff --git a/src/node-transformers/converting-transformers/MemberExpressionTransformer.ts b/src/node-transformers/converting-transformers/MemberExpressionTransformer.ts index 300d66c46..731244995 100644 --- a/src/node-transformers/converting-transformers/MemberExpressionTransformer.ts +++ b/src/node-transformers/converting-transformers/MemberExpressionTransformer.ts @@ -12,6 +12,7 @@ import { NodeTransformationStage } from '../../enums/node-transformers/NodeTrans import { AbstractNodeTransformer } from '../AbstractNodeTransformer'; import { NodeFactory } from '../../node/NodeFactory'; import { NodeGuards } from '../../node/NodeGuards'; +import { NodeMetadata } from '../../node/NodeMetadata'; @injectable() export class MemberExpressionTransformer extends AbstractNodeTransformer { @@ -63,6 +64,10 @@ export class MemberExpressionTransformer extends AbstractNodeTransformer { * @returns {NodeGuards} */ public transformNode (memberExpressionNode: ESTree.MemberExpression, parentNode: ESTree.Node): ESTree.Node { + if (NodeMetadata.isIgnoredNode(memberExpressionNode.object) || NodeMetadata.isIgnoredNode(memberExpressionNode.property)) { + return memberExpressionNode; + } + if (NodeGuards.isIdentifierNode(memberExpressionNode.property)) { if (memberExpressionNode.computed) { return memberExpressionNode; diff --git a/src/node-transformers/preparing-transformers/ObfuscatingGuardsTransformer.ts b/src/node-transformers/preparing-transformers/ObfuscatingGuardsTransformer.ts index d8cb9d134..dad6fc5dc 100644 --- a/src/node-transformers/preparing-transformers/ObfuscatingGuardsTransformer.ts +++ b/src/node-transformers/preparing-transformers/ObfuscatingGuardsTransformer.ts @@ -32,6 +32,7 @@ export class ObfuscatingGuardsTransformer extends AbstractNodeTransformer { ObfuscatingGuard.ConditionalCommentObfuscatingGuard, ObfuscatingGuard.ForceTransformStringObfuscatingGuard, ObfuscatingGuard.IgnoredImportObfuscatingGuard, + ObfuscatingGuard.ImportMetaObfuscationGuard, ObfuscatingGuard.ReservedStringObfuscatingGuard ]; diff --git a/src/node-transformers/preparing-transformers/obfuscating-guards/ImportMetaObfuscationGuard.ts b/src/node-transformers/preparing-transformers/obfuscating-guards/ImportMetaObfuscationGuard.ts new file mode 100644 index 000000000..32ebd4b89 --- /dev/null +++ b/src/node-transformers/preparing-transformers/obfuscating-guards/ImportMetaObfuscationGuard.ts @@ -0,0 +1,23 @@ +import { injectable } from 'inversify'; + +import * as ESTree from 'estree'; + +import { IObfuscatingGuard } from '../../../interfaces/node-transformers/preparing-transformers/obfuscating-guards/IObfuscatingGuard'; + +import { ObfuscatingGuardResult } from '../../../enums/node/ObfuscatingGuardResult'; + +import { NodeGuards } from '../../../node/NodeGuards'; + +@injectable() +export class ImportMetaObfuscationGuard implements IObfuscatingGuard { + /** + * @param {Node} node + * @returns {ObfuscatingGuardResult} + */ + public check (node: ESTree.Node): ObfuscatingGuardResult { + const isMetaProperty = NodeGuards.isMetaPropertyNode(node); + const isMetaPropertyParent = !!node?.parentNode && NodeGuards.isMetaPropertyNode(node.parentNode); + + return isMetaProperty || isMetaPropertyParent ? ObfuscatingGuardResult.Ignore : ObfuscatingGuardResult.Transform; + } +} diff --git a/src/node/NodeGuards.ts b/src/node/NodeGuards.ts index 3a4da04b5..ee6d3568a 100644 --- a/src/node/NodeGuards.ts +++ b/src/node/NodeGuards.ts @@ -335,6 +335,14 @@ export class NodeGuards { return node.type === NodeType.MemberExpression; } + /** + * @param {Node} node + * @returns {boolean} + */ + public static isMetaPropertyNode (node: ESTree.Node): node is ESTree.MetaProperty { + return node.type === NodeType.MetaProperty; + } + /** * @param {Node} node * @returns {boolean} diff --git a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts b/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts index e264a30fd..483a9489b 100644 --- a/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts +++ b/test/functional-tests/javascript-obfuscator/JavaScriptObfuscator.spec.ts @@ -806,7 +806,7 @@ describe('JavaScriptObfuscator', () => { }); describe('import.meta support', () => { - const regExp: RegExp = /console\['log']\(import\.meta\['url']\);/; + const regExp: RegExp = /console\['log']\(import\.meta\.url\);/; let obfuscatedCode: string;