Skip to content

Commit a3dad6c

Browse files
committed
Added ability to add specific node guard to the black list of nodes.
This nodes wont obfuscated.
1 parent 384bb51 commit a3dad6c

File tree

21 files changed

+163
-62
lines changed

21 files changed

+163
-62
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ v0.10.0
1111
* added support for async functions
1212
* fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/65
1313
* fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/60
14+
* fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/59
1415
* fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/54
1516
* fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/57
1617
* fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/58

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: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "javascript-obfuscator",
3-
"version": "0.10.0-beta.8",
3+
"version": "0.10.0-beta.9",
44
"description": "JavaScript obfuscator",
55
"keywords": [
66
"obfuscator",
@@ -46,8 +46,8 @@
4646
"@types/md5": "2.1.32",
4747
"@types/mkdirp": "0.5.0",
4848
"@types/mocha": "2.2.41",
49-
"@types/node": "8.0.13",
50-
"@types/sinon": "2.3.2",
49+
"@types/node": "8.0.14",
50+
"@types/sinon": "2.3.3",
5151
"@types/string-template": "1.0.2",
5252
"awesome-typescript-loader": "3.2.1",
5353
"babel-cli": "6.24.1",
@@ -64,7 +64,7 @@
6464
"tslint": "5.5.0",
6565
"tslint-eslint-rules": "4.1.1",
6666
"tslint-loader": "3.5.3",
67-
"typescript": "2.4.1",
67+
"typescript": "2.4.2",
6868
"webpack": "3.3.0",
6969
"webpack-node-externals": "1.6.0"
7070
},

src/Obfuscator.ts

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import { ServiceIdentifiers } from './container/ServiceIdentifiers';
44
import * as estraverse from 'estraverse';
55
import * as ESTree from 'estree';
66

7+
import { TNodeGuard } from './types/node/TNodeGuard';
78
import { TNodeTransformerFactory } from './types/container/node-transformers/TNodeTransformerFactory';
89
import { TVisitorDirection } from './types/TVisitorDirection';
910
import { TVisitorFunction } from './types/TVisitorFunction';
11+
import { TVisitorResult } from './types/TVisitorResult';
1012

1113
import { ICustomNodeGroup } from './interfaces/custom-nodes/ICustomNodeGroup';
1214
import { IObfuscationEventEmitter } from './interfaces/event-emitters/IObfuscationEventEmitter';
@@ -26,6 +28,13 @@ import { NodeUtils } from './node/NodeUtils';
2628

2729
@injectable()
2830
export class Obfuscator implements IObfuscator {
31+
/**
32+
* @type {((node: Node) => boolean)[]}
33+
*/
34+
private static readonly blackListGuards: TNodeGuard[] = [
35+
Node.isUseStrictOperator
36+
];
37+
2938
/**
3039
* @type {NodeTransformer[]}
3140
*/
@@ -109,6 +118,26 @@ export class Obfuscator implements IObfuscator {
109118
this.options = options;
110119
}
111120

121+
/**
122+
* @param {Node} node
123+
* @returns {boolean}
124+
*/
125+
private static isBlackListNode (node: ESTree.Node): boolean {
126+
const guardsLength: number = Obfuscator.blackListGuards.length;
127+
128+
let guard: TNodeGuard;
129+
130+
for (let i: number = 0; i < guardsLength; i++) {
131+
guard = Obfuscator.blackListGuards[i];
132+
133+
if (guard(node)) {
134+
return true;
135+
}
136+
}
137+
138+
return false;
139+
}
140+
112141
/**
113142
* @param {Program} astTree
114143
* @returns {Program}
@@ -211,6 +240,10 @@ export class Obfuscator implements IObfuscator {
211240
let visitor: IVisitor;
212241

213242
return (node: ESTree.Node, parentNode: ESTree.Node) => {
243+
if (Obfuscator.isBlackListNode(node)) {
244+
return estraverse.VisitorOption.Skip;
245+
}
246+
214247
for (let i: number = 0; i < visitorsLength; i++) {
215248
visitor = visitors[i];
216249

@@ -220,9 +253,9 @@ export class Obfuscator implements IObfuscator {
220253
continue;
221254
}
222255

223-
const visitorResult: ESTree.Node | void = visitorFunction(node, parentNode);
256+
const visitorResult: TVisitorResult = visitorFunction(node, parentNode);
224257

225-
if (!visitorResult) {
258+
if (!visitorResult || !Node.isNode(visitorResult)) {
226259
continue;
227260
}
228261

src/container/modules/storages/StoragesModule.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ export const storagesModule: interfaces.ContainerModule = new ContainerModule((b
3333
const randomGenerator: IRandomGenerator = context.container
3434
.get<IRandomGenerator>(ServiceIdentifiers.IRandomGenerator);
3535

36-
return new constructor(randomGenerator);
36+
const storage: TControlFlowStorage = new constructor(randomGenerator);
37+
38+
storage.initialize();
39+
40+
return storage;
3741
};
3842
});
3943
});

src/declarations/ESTree.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ declare module 'estree' {
88
parentNode?: ESTree.Node;
99
}
1010

11+
interface ExpressionStatement extends ESTree.BaseStatement {
12+
directive?: 'use strict';
13+
}
14+
1115
interface SimpleLiteral extends ESTree.BaseNode, ESTree.BaseExpression {
1216
'x-verbatim-property'?: any;
1317
}

src/node-transformers/AbstractNodeTransformer.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
import { injectable, inject } from 'inversify';
1+
import { injectable, inject, postConstruct } from 'inversify';
22
import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
33

44
import * as ESTree from 'estree';
55

6+
import { IInitializable } from '../interfaces/IInitializable';
67
import { INodeTransformer } from '../interfaces/node-transformers/INodeTransformer';
78
import { IOptions } from '../interfaces/options/IOptions';
89
import { IRandomGenerator } from '../interfaces/utils/IRandomGenerator';
910
import { IVisitor } from '../interfaces/IVisitor';
1011

1112
@injectable()
12-
export abstract class AbstractNodeTransformer implements INodeTransformer {
13+
export abstract class AbstractNodeTransformer implements INodeTransformer, IInitializable {
1314
/**
1415
* @type {number}
1516
*/
@@ -35,7 +36,10 @@ export abstract class AbstractNodeTransformer implements INodeTransformer {
3536
) {
3637
this.randomGenerator = randomGenerator;
3738
this.options = options;
39+
}
3840

41+
@postConstruct()
42+
public initialize (): void {
3943
this.nodeIdentifier = this.randomGenerator.getRandomInteger(0, 10000);
4044
}
4145

src/node/Node.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,22 @@ export class Node {
146146
return node.type === NodeType.MethodDefinition;
147147
}
148148

149+
/**
150+
* @param {Object} object
151+
* @returns {boolean}
152+
*/
153+
public static isNode (object: Object & { type?: string }): object is ESTree.Node {
154+
return object && !object.type !== undefined;
155+
}
156+
157+
/**
158+
* @param {Node} node
159+
* @returns {boolean}
160+
*/
161+
public static isNodeHasBlockStatement (node: ESTree.Node): node is TNodeWithBlockStatement {
162+
return Array.isArray((<TNodeWithBlockStatement>node).body);
163+
}
164+
149165
/**
150166
* @param {Node} node
151167
* @returns {boolean}
@@ -218,23 +234,23 @@ export class Node {
218234
* @param {Node} node
219235
* @returns {boolean}
220236
*/
221-
public static isVariableDeclarationNode (node: ESTree.Node): node is ESTree.VariableDeclaration {
222-
return node.type === NodeType.VariableDeclaration;
237+
public static isUseStrictOperator (node: ESTree.Node): node is ESTree.ExpressionStatement {
238+
return node.type === NodeType.ExpressionStatement && node.directive === 'use strict';
223239
}
224240

225241
/**
226242
* @param {Node} node
227243
* @returns {boolean}
228244
*/
229-
public static isVariableDeclaratorNode (node: ESTree.Node): node is ESTree.VariableDeclarator {
230-
return node.type === NodeType.VariableDeclarator;
245+
public static isVariableDeclarationNode (node: ESTree.Node): node is ESTree.VariableDeclaration {
246+
return node.type === NodeType.VariableDeclaration;
231247
}
232248

233249
/**
234250
* @param {Node} node
235251
* @returns {boolean}
236252
*/
237-
public static isNodeHasBlockStatement (node: ESTree.Node): node is TNodeWithBlockStatement {
238-
return node.hasOwnProperty('body') && Array.isArray((<TNodeWithBlockStatement>node).body);
253+
public static isVariableDeclaratorNode (node: ESTree.Node): node is ESTree.VariableDeclarator {
254+
return node.type === NodeType.VariableDeclarator;
239255
}
240256
}

src/storages/ArrayStorage.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { injectable, inject } from 'inversify';
1+
import { injectable, inject, postConstruct } from 'inversify';
22
import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
33

44
import { IRandomGenerator } from '../interfaces/utils/IRandomGenerator';
@@ -39,6 +39,12 @@ export abstract class ArrayStorage <T> implements IStorage <T> {
3939
this.randomGenerator = randomGenerator;
4040
}
4141

42+
@postConstruct()
43+
public initialize (): void {
44+
this.storage = [];
45+
this.storageId = this.randomGenerator.getRandomString(6);
46+
}
47+
4248
/**
4349
* @param {number} key
4450
* @returns {T}
@@ -84,14 +90,6 @@ export abstract class ArrayStorage <T> implements IStorage <T> {
8490
return this.storageId;
8591
}
8692

87-
/**
88-
* @param {any[]} args
89-
*/
90-
public initialize (...args: any[]): void {
91-
this.storage = [];
92-
this.storageId = this.randomGenerator.getRandomString(6);
93-
}
94-
9593
/**
9694
* @param {this} storage
9795
* @param {boolean} mergeId

src/storages/MapStorage.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { injectable, inject } from 'inversify';
1+
import { injectable, inject, postConstruct } from 'inversify';
22
import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
33

44
import { IRandomGenerator } from '../interfaces/utils/IRandomGenerator';
@@ -34,6 +34,12 @@ export abstract class MapStorage <T> implements IStorage <T> {
3434
this.randomGenerator = randomGenerator;
3535
}
3636

37+
@postConstruct()
38+
public initialize (): void {
39+
this.storage = new Map <string | number, T>();
40+
this.storageId = this.randomGenerator.getRandomString(6);
41+
}
42+
3743
/**
3844
* @param {string | number} key
3945
* @returns {T}
@@ -83,14 +89,6 @@ export abstract class MapStorage <T> implements IStorage <T> {
8389
return this.storageId;
8490
}
8591

86-
/**
87-
* @param {any[]} args
88-
*/
89-
public initialize (...args: any[]): void {
90-
this.storage = new Map <string | number, T>();
91-
this.storageId = this.randomGenerator.getRandomString(6);
92-
}
93-
9492
/**
9593
* @param {this} storage
9694
* @param {boolean} mergeId

0 commit comments

Comments
 (0)