Skip to content

Commit c85f6c0

Browse files
author
sanex3339
committed
Added ObjectPatternPropertiesTransformer. Added helper for stubbing selected node transformers.
1 parent f360d0e commit c85f6c0

File tree

18 files changed

+227
-54
lines changed

18 files changed

+227
-54
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
Change Log
22

3+
v1.8.2
4+
---
5+
* Improved obfuscation of destructured variables. https://github.com/javascript-obfuscator/javascript-obfuscator/issues/688
6+
37
v1.8.1
48
---
59
* Fixed runtime error `Uncaught SyntaxError: yield is a reserved identifier` when `deadCodeInjection` is enabled

dist/index.browser.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.cli.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "javascript-obfuscator",
3-
"version": "1.8.1",
3+
"version": "1.8.2",
44
"description": "JavaScript obfuscator",
55
"keywords": [
66
"obfuscator",
@@ -54,7 +54,7 @@
5454
"@types/mkdirp": "1.0.1",
5555
"@types/mocha": "8.0.0",
5656
"@types/multimatch": "4.0.0",
57-
"@types/node": "14.0.26",
57+
"@types/node": "14.0.27",
5858
"@types/rimraf": "3.0.0",
5959
"@types/sinon": "9.0.4",
6060
"@types/string-template": "1.0.2",
@@ -65,13 +65,13 @@
6565
"coveralls": "3.1.0",
6666
"eslint": "7.5.0",
6767
"eslint-plugin-import": "2.22.0",
68-
"eslint-plugin-jsdoc": "30.0.3",
68+
"eslint-plugin-jsdoc": "30.1.0",
6969
"eslint-plugin-no-null": "1.0.2",
7070
"eslint-plugin-prefer-arrow": "1.2.2",
7171
"eslint-plugin-unicorn": "21.0.0",
7272
"fork-ts-checker-notifier-webpack-plugin": "3.0.0",
73-
"fork-ts-checker-webpack-plugin": "5.0.11",
74-
"mocha": "8.0.1",
73+
"fork-ts-checker-webpack-plugin": "5.0.12",
74+
"mocha": "8.1.0",
7575
"nyc": "15.1.0",
7676
"pjson": "1.0.9",
7777
"pre-commit": "1.2.2",
@@ -81,7 +81,7 @@
8181
"ts-loader": "8.0.1",
8282
"ts-node": "8.10.2",
8383
"typescript": "3.9.7",
84-
"webpack": "4.44.0",
84+
"webpack": "4.44.1",
8585
"webpack-cli": "3.3.12",
8686
"webpack-node-externals": "2.5.0"
8787
},

src/JavaScriptObfuscator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
8181
NodeTransformer.ObfuscatingGuardsTransformer,
8282
NodeTransformer.ObjectExpressionKeysTransformer,
8383
NodeTransformer.ObjectExpressionTransformer,
84+
NodeTransformer.ObjectPatternPropertiesTransformer,
8485
NodeTransformer.ParentificationTransformer,
8586
NodeTransformer.ScopeIdentifiersTransformer,
8687
NodeTransformer.SplitStringTransformer,

src/container/modules/node-transformers/ConvertingTransformersModule.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { MethodDefinitionTransformer } from '../../../node-transformers/converti
1515
import { NumberToNumericalExpressionTransformer } from '../../../node-transformers/converting-transformers/NumberToNumericalExpressionTransformer';
1616
import { ObjectExpressionKeysTransformer } from '../../../node-transformers/converting-transformers/ObjectExpressionKeysTransformer';
1717
import { ObjectExpressionTransformer } from '../../../node-transformers/converting-transformers/ObjectExpressionTransformer';
18+
import { ObjectPatternPropertiesTransformer } from '../../../node-transformers/converting-transformers/ObjectPatternPropertiesTransformer';
1819
import { SplitStringTransformer } from '../../../node-transformers/converting-transformers/SplitStringTransformer';
1920
import { TemplateLiteralTransformer } from '../../../node-transformers/converting-transformers/TemplateLiteralTransformer';
2021

@@ -41,6 +42,10 @@ export const convertingTransformersModule: interfaces.ContainerModule = new Cont
4142
.to(ObjectExpressionTransformer)
4243
.whenTargetNamed(NodeTransformer.ObjectExpressionTransformer);
4344

45+
bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
46+
.to(ObjectPatternPropertiesTransformer)
47+
.whenTargetNamed(NodeTransformer.ObjectPatternPropertiesTransformer);
48+
4449
bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
4550
.to(SplitStringTransformer)
4651
.whenTargetNamed(NodeTransformer.SplitStringTransformer);

src/enums/node-transformers/NodeTransformer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export enum NodeTransformer {
1717
ObfuscatingGuardsTransformer = 'ObfuscatingGuardsTransformer',
1818
ObjectExpressionKeysTransformer = 'ObjectExpressionKeysTransformer',
1919
ObjectExpressionTransformer = 'ObjectExpressionTransformer',
20+
ObjectPatternPropertiesTransformer = 'ObjectPatternPropertiesTransformer',
2021
ParentificationTransformer = 'ParentificationTransformer',
2122
RenamePropertiesTransformer = 'RenamePropertiesTransformer',
2223
ScopeIdentifiersTransformer = 'ScopeIdentifiersTransformer',
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { inject, injectable, } from 'inversify';
2+
import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
3+
4+
import * as ESTree from 'estree';
5+
6+
import { IOptions } from '../../interfaces/options/IOptions';
7+
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
8+
import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
9+
10+
import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage';
11+
12+
import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
13+
import { NodeGuards } from '../../node/NodeGuards';
14+
import { NodeUtils } from '../../node/NodeUtils';
15+
16+
@injectable()
17+
export class ObjectPatternPropertiesTransformer extends AbstractNodeTransformer {
18+
/**
19+
* @param {IRandomGenerator} randomGenerator
20+
* @param {IOptions} options
21+
*/
22+
public constructor (
23+
@inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
24+
@inject(ServiceIdentifiers.IOptions) options: IOptions
25+
) {
26+
super(randomGenerator, options);
27+
}
28+
29+
/**
30+
* @param {NodeTransformationStage} nodeTransformationStage
31+
* @returns {IVisitor | null}
32+
*/
33+
public getVisitor (nodeTransformationStage: NodeTransformationStage): IVisitor | null {
34+
switch (nodeTransformationStage) {
35+
case NodeTransformationStage.Converting:
36+
return {
37+
enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
38+
if (parentNode && NodeGuards.isPropertyNode(node)) {
39+
return this.transformNode(node, parentNode);
40+
}
41+
}
42+
};
43+
44+
default:
45+
return null;
46+
}
47+
}
48+
49+
/**
50+
* replaces:
51+
* const {foo} = bar;
52+
*
53+
* on:
54+
* const {foo: foo} = bar;
55+
*
56+
* @param {Property} propertyNode
57+
* @param {NodeGuards} parentNode
58+
* @returns {NodeGuards}
59+
*/
60+
public transformNode (propertyNode: ESTree.Property, parentNode: ESTree.Node): ESTree.Node {
61+
if (!NodeGuards.isObjectPatternNode(parentNode) || !propertyNode.shorthand) {
62+
return propertyNode;
63+
}
64+
65+
propertyNode.shorthand = false;
66+
propertyNode.value = NodeUtils.clone(propertyNode.value);
67+
68+
NodeUtils.parentizeNode(propertyNode.value, parentNode);
69+
70+
return propertyNode;
71+
}
72+
}

test/dev/dev.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
77

88
let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
99
`
10-
function foo () {
11-
console.log(7);
12-
13-
return 9;
14-
}
10+
const {bar, baz} = {bar: 1, baz: 2};
11+
console.log(bar, baz);
1512
`,
1613
{
1714
...NO_ADDITIONAL_NODES_PRESET,
1815
compact: false,
19-
simplify: true
16+
simplify: true,
17+
renameGlobals: true
2018
}
2119
).getObfuscatedCode();
2220

0 commit comments

Comments
 (0)