Skip to content

Commit 5b312fd

Browse files
committed
refactoring
1 parent c1b3afa commit 5b312fd

35 files changed

Lines changed: 1655 additions & 794 deletions

dist/index.js

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

src/ObfuscationResult.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1+
import { injectable } from 'inversify';
2+
13
import { IObfuscationResult } from './interfaces/IObfuscationResult';
24

5+
@injectable()
36
export class ObfuscationResult implements IObfuscationResult {
7+
/**
8+
* @type {boolean}
9+
*/
10+
public initialized: boolean = false;
11+
412
/**
513
* @type {string}
614
*/
@@ -11,33 +19,47 @@ export class ObfuscationResult implements IObfuscationResult {
1119
*/
1220
private sourceMap: string;
1321

22+
public checkInitialization (): void {
23+
if (!this.initialized) {
24+
throw new Error(`\`ObfuscationResult\` should be initialized first by calling \`initialize\` method!`);
25+
}
26+
}
27+
1428
/**
1529
* @param obfuscatedCode
1630
* @param sourceMap
1731
*/
18-
constructor (obfuscatedCode: string, sourceMap: string) {
32+
public initialize (obfuscatedCode: string, sourceMap: string): void {
1933
this.obfuscatedCode = obfuscatedCode;
2034
this.sourceMap = sourceMap;
35+
36+
this.initialized = true;
2137
}
2238

2339
/**
2440
* @returns {string}
2541
*/
2642
public getObfuscatedCode (): string {
43+
this.checkInitialization();
44+
2745
return this.obfuscatedCode;
2846
}
2947

3048
/**
3149
* @returns {string}
3250
*/
3351
public getSourceMap (): string {
52+
this.checkInitialization();
53+
3454
return this.sourceMap;
3555
}
3656

3757
/**
3858
* @returns {string}
3959
*/
4060
public toString (): string {
61+
this.checkInitialization();
62+
4163
return this.obfuscatedCode;
4264
}
4365
}

src/Obfuscator.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { VisitorDirection } from './enums/VisitorDirection';
2222

2323
import { Node } from './node/Node';
2424
import { NodeUtils } from './node/NodeUtils';
25+
import { IStackTraceData } from './interfaces/stack-trace-analyzer/IStackTraceData';
2526

2627
@injectable()
2728
export class Obfuscator implements IObfuscator {
@@ -103,15 +104,17 @@ export class Obfuscator implements IObfuscator {
103104

104105
NodeUtils.parentize(astTree);
105106

107+
const stackTraceData: IStackTraceData[] = this.stackTraceAnalyzer.analyze(astTree.body);
108+
106109
// prepare custom nodes
107-
customNodesStorage.initialize(this.stackTraceAnalyzer.analyze(astTree.body));
110+
customNodesStorage.initialize(stackTraceData);
108111
customNodesStorage
109112
.getStorage()
110113
.forEach((customNode: ICustomNode) => {
111114
this.obfuscationEventEmitter.once(customNode.getAppendEvent(), customNode.appendNode.bind(customNode));
112115
});
113116

114-
this.obfuscationEventEmitter.emit(ObfuscationEvents.BeforeObfuscation, astTree);
117+
this.obfuscationEventEmitter.emit(ObfuscationEvents.BeforeObfuscation, astTree, stackTraceData);
115118

116119
// first pass: control flow flattening
117120
if (this.options.controlFlowFlattening) {
@@ -129,7 +132,7 @@ export class Obfuscator implements IObfuscator {
129132
this.nodeTransformersFactory(Obfuscator.nodeObfuscatorsMap)
130133
);
131134

132-
this.obfuscationEventEmitter.emit(ObfuscationEvents.AfterObfuscation, astTree);
135+
this.obfuscationEventEmitter.emit(ObfuscationEvents.AfterObfuscation, astTree, stackTraceData);
133136

134137
return astTree;
135138
}

src/Utils.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ export class Utils {
1515
*/
1616
public static readonly randomGeneratorPool: string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
1717

18+
/**
19+
* @type {string}
20+
*/
21+
public static readonly randomGeneratorPoolWithNumbers: string = `${Utils.randomGeneratorPool}0123456789`;
22+
1823
/**
1924
* @type {Chance.Chance | Chance.SeededChance}
2025
*/

src/container/InversifyContainerFacade.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,21 @@ export class InversifyContainerFacade implements IInversifyContainerFacade {
5454
.to(Obfuscator)
5555
.inSingletonScope();
5656

57+
this.container
58+
.bind<IObfuscationResult>(ServiceIdentifiers.IObfuscationResult)
59+
.to(ObfuscationResult)
60+
.inSingletonScope();
61+
5762
this.container
5863
.bind<IObfuscationResult>(ServiceIdentifiers['Factory<IObfuscationResult>'])
59-
.toFactory<IObfuscationResult>(() => {
64+
.toFactory<IObfuscationResult>((context: interfaces.Context) => {
6065
return (obfuscatedCode: string, sourceMap: string) => {
61-
return new ObfuscationResult(obfuscatedCode, sourceMap);
66+
const obfuscationResult: IObfuscationResult = context.container
67+
.get<IObfuscationResult>(ServiceIdentifiers.IObfuscationResult);
68+
69+
obfuscationResult.initialize(obfuscatedCode, sourceMap);
70+
71+
return obfuscationResult;
6272
};
6373
});
6474

src/container/ServiceIdentifiers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const ServiceIdentifiers: IContainerServiceIdentifiers = {
1111
IJavaScriptObfuscator: Symbol('IJavaScriptObfuscator'),
1212
INodeTransformer: Symbol('INodeTransformer'),
1313
IObfuscationEventEmitter: Symbol('IObfuscationEventEmitter'),
14+
IObfuscationResult: Symbol('IObfuscationResult'),
1415
IObfuscator: Symbol('IObfuscator'),
1516
IOptions: Symbol('IOptions'),
1617
IReplacer: Symbol('IReplacer'),

src/custom-nodes/AbstractCustomNode.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
1+
import { injectable, inject } from 'inversify';
2+
import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
3+
14
import * as ESTree from 'estree';
25

36
import { TObfuscationEvent } from '../types/event-emitters/TObfuscationEvent';
47

58
import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode';
69
import { IOptions } from '../interfaces/options/IOptions';
10+
import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceData';
711
import { TStatement } from '../types/node/TStatement';
812

913
import { NodeUtils } from '../node/NodeUtils';
1014

15+
@injectable()
1116
export abstract class AbstractCustomNode implements ICustomNode {
17+
/**
18+
* @type {boolean}
19+
*/
20+
public initialized: boolean = false;
21+
1222
/**
1323
* @type {TObfuscationEvent}
1424
*/
@@ -22,14 +32,30 @@ export abstract class AbstractCustomNode implements ICustomNode {
2232
/**
2333
* @param options
2434
*/
25-
constructor (options: IOptions) {
35+
constructor (
36+
@inject(ServiceIdentifiers.IOptions) options: IOptions
37+
) {
2638
this.options = options;
2739
}
2840

41+
public checkInitialization (): void {
42+
if (!this.initialized) {
43+
throw new Error(`Custom node should be initialized first by calling \`initialize\` method!`);
44+
}
45+
}
46+
47+
/**
48+
* @param args
49+
*/
50+
public initialize (...args: any[]): void {
51+
this.initialized = true;
52+
};
53+
2954
/**
3055
* @param astTree
56+
* @param stackTraceData
3157
*/
32-
public abstract appendNode (astTree: ESTree.Node): void;
58+
public abstract appendNode (astTree: ESTree.Node, stackTraceData: IStackTraceData[]): void;
3359

3460
/**
3561
* @returns {TObfuscationEvent}
@@ -47,6 +73,8 @@ export abstract class AbstractCustomNode implements ICustomNode {
4773
* @returns {TStatement[]}
4874
*/
4975
public getNode (): TStatement[] {
76+
this.checkInitialization();
77+
5078
return this.getNodeStructure();
5179
}
5280

src/custom-nodes/AbstractCustomNodesFactory.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import { injectable, inject } from 'inversify';
2+
import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
3+
14
import { TObfuscationEvent } from '../types/event-emitters/TObfuscationEvent';
25

36
import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode';
@@ -7,6 +10,7 @@ import { IStackTraceData } from '../interfaces/stack-trace-analyzer/IStackTraceD
710

811
import { ObfuscationEvents } from '../enums/ObfuscationEvents';
912

13+
@injectable()
1014
export abstract class AbstractCustomNodesFactory implements ICustomNodesFactory {
1115
/**
1216
* @type {TObfuscationEvent}
@@ -26,7 +30,9 @@ export abstract class AbstractCustomNodesFactory implements ICustomNodesFactory
2630
/**
2731
* @param options
2832
*/
29-
constructor (options: IOptions) {
33+
constructor (
34+
@inject(ServiceIdentifiers.IOptions) options: IOptions
35+
) {
3036
this.options = options;
3137
}
3238

src/custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import { injectable, inject } from 'inversify';
2+
import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
3+
14
import * as format from 'string-template';
25

36
import { TNodeWithBlockStatement } from '../../types/node/TNodeWithBlockStatement';
@@ -14,6 +17,7 @@ import { AbstractCustomNode } from '../AbstractCustomNode';
1417
import { NodeAppender } from '../../node/NodeAppender';
1518
import { Utils } from '../../Utils';
1619

20+
@injectable()
1721
export class ConsoleOutputDisableExpressionNode extends AbstractCustomNode {
1822
/**
1923
* @type {TObfuscationEvent}
@@ -31,35 +35,32 @@ export class ConsoleOutputDisableExpressionNode extends AbstractCustomNode {
3135
protected randomStackTraceIndex: number;
3236

3337
/**
34-
* @type {IStackTraceData[]}
35-
*/
36-
protected stackTraceData: IStackTraceData[];
37-
38-
/**
39-
* @param stackTraceData
40-
* @param callsControllerFunctionName
41-
* @param randomStackTraceIndex
4238
* @param options
4339
*/
4440
constructor (
45-
stackTraceData: IStackTraceData[],
46-
callsControllerFunctionName: string,
47-
randomStackTraceIndex: number,
48-
options: IOptions
41+
@inject(ServiceIdentifiers.IOptions) options: IOptions
4942
) {
5043
super(options);
44+
}
5145

52-
this.stackTraceData = stackTraceData;
46+
/**
47+
* @param callsControllerFunctionName
48+
* @param randomStackTraceIndex
49+
*/
50+
public initialize (callsControllerFunctionName: string, randomStackTraceIndex: number): void {
5351
this.callsControllerFunctionName = callsControllerFunctionName;
5452
this.randomStackTraceIndex = randomStackTraceIndex;
53+
54+
super.initialize();
5555
}
5656

5757
/**
5858
* @param blockScopeNode
59+
* @param stackTraceData
5960
*/
60-
public appendNode (blockScopeNode: TNodeWithBlockStatement): void {
61+
public appendNode (blockScopeNode: TNodeWithBlockStatement, stackTraceData: IStackTraceData[]): void {
6162
NodeAppender.appendNodeToOptimalBlockScope(
62-
this.stackTraceData,
63+
stackTraceData,
6364
blockScopeNode,
6465
this.getNode(),
6566
this.randomStackTraceIndex
Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import { injectable, inject } from 'inversify';
2+
import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
3+
14
import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
5+
import { IOptions } from '../../../interfaces/options/IOptions';
26
import { IStackTraceData } from '../../../interfaces/stack-trace-analyzer/IStackTraceData';
37

48
import { ConsoleOutputDisableExpressionNode } from '../ConsoleOutputDisableExpressionNode';
@@ -8,7 +12,17 @@ import { AbstractCustomNodesFactory } from '../../AbstractCustomNodesFactory';
812
import { NodeAppender } from '../../../node/NodeAppender';
913
import { Utils } from '../../../Utils';
1014

15+
@injectable()
1116
export class ConsoleOutputCustomNodesFactory extends AbstractCustomNodesFactory {
17+
/**
18+
* @param options
19+
*/
20+
constructor (
21+
@inject(ServiceIdentifiers.IOptions) options: IOptions
22+
) {
23+
super(options);
24+
}
25+
1226
/**
1327
* @param stackTraceData
1428
* @returns {Map<string, ICustomNode>}
@@ -21,25 +35,15 @@ export class ConsoleOutputCustomNodesFactory extends AbstractCustomNodesFactory
2135
const callsControllerFunctionName: string = Utils.getRandomVariableName();
2236
const randomStackTraceIndex: number = NodeAppender.getRandomStackTraceIndex(stackTraceData.length);
2337

38+
const consoleOutputDisableExpressionNode: ICustomNode = new ConsoleOutputDisableExpressionNode(this.options);
39+
const nodeCallsControllerFunctionNode: ICustomNode = new NodeCallsControllerFunctionNode(this.options);
40+
41+
consoleOutputDisableExpressionNode.initialize(callsControllerFunctionName, randomStackTraceIndex);
42+
nodeCallsControllerFunctionNode.initialize(callsControllerFunctionName, randomStackTraceIndex);
43+
2444
return this.syncCustomNodesWithNodesFactory(new Map <string, ICustomNode> ([
25-
[
26-
'consoleOutputDisableExpressionNode',
27-
new ConsoleOutputDisableExpressionNode(
28-
stackTraceData,
29-
callsControllerFunctionName,
30-
randomStackTraceIndex,
31-
this.options
32-
)
33-
],
34-
[
35-
'ConsoleOutputNodeCallsControllerFunctionNode',
36-
new NodeCallsControllerFunctionNode(
37-
stackTraceData,
38-
callsControllerFunctionName,
39-
randomStackTraceIndex,
40-
this.options
41-
)
42-
]
45+
['consoleOutputDisableExpressionNode', consoleOutputDisableExpressionNode],
46+
['ConsoleOutputNodeCallsControllerFunctionNode', nodeCallsControllerFunctionNode]
4347
]));
4448
}
4549
}

0 commit comments

Comments
 (0)