@@ -7,6 +7,7 @@ import * as ESTree from 'estree';
7
7
8
8
import { TObfuscatedCodeFactory } from './types/container/source-code/TObfuscatedCodeFactory' ;
9
9
10
+ import { ICodeTransformersRunner } from './interfaces/code-transformers/ICodeTransformersRunner' ;
10
11
import { IGeneratorOutput } from './interfaces/IGeneratorOutput' ;
11
12
import { IJavaScriptObfuscator } from './interfaces/IJavaScriptObfsucator' ;
12
13
import { ILogger } from './interfaces/logger/ILogger' ;
@@ -15,6 +16,8 @@ import { IOptions } from './interfaces/options/IOptions';
15
16
import { IRandomGenerator } from './interfaces/utils/IRandomGenerator' ;
16
17
import { INodeTransformersRunner } from './interfaces/node-transformers/INodeTransformersRunner' ;
17
18
19
+ import { CodeTransformer } from './enums/code-transformers/CodeTransformer' ;
20
+ import { CodeTransformationStage } from './enums/code-transformers/CodeTransformationStage' ;
18
21
import { LoggingMessage } from './enums/logger/LoggingMessage' ;
19
22
import { NodeTransformer } from './enums/node-transformers/NodeTransformer' ;
20
23
import { NodeTransformationStage } from './enums/node-transformers/NodeTransformationStage' ;
@@ -48,10 +51,17 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
48
51
sourceMapWithCode : true
49
52
} ;
50
53
54
+ /**
55
+ * @type {CodeTransformer[] }
56
+ */
57
+ private static readonly codeTransformersList : CodeTransformer [ ] = [
58
+ CodeTransformer . HashbangOperatorTransformer
59
+ ] ;
60
+
51
61
/**
52
62
* @type {NodeTransformer[] }
53
63
*/
54
- private static readonly transformersList : NodeTransformer [ ] = [
64
+ private static readonly nodeTransformersList : NodeTransformer [ ] = [
55
65
NodeTransformer . BlockStatementControlFlowTransformer ,
56
66
NodeTransformer . CommentsTransformer ,
57
67
NodeTransformer . CustomCodeHelpersTransformer ,
@@ -73,6 +83,11 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
73
83
NodeTransformer . VariablePreserveTransformer
74
84
] ;
75
85
86
+ /**
87
+ * @type {ICodeTransformersRunner }
88
+ */
89
+ private readonly codeTransformersRunner : ICodeTransformersRunner ;
90
+
76
91
/**
77
92
* @type {ILogger }
78
93
*/
@@ -96,23 +111,26 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
96
111
/**
97
112
* @type {INodeTransformersRunner }
98
113
*/
99
- private readonly transformersRunner : INodeTransformersRunner ;
114
+ private readonly nodeTransformersRunner : INodeTransformersRunner ;
100
115
101
116
/**
102
- * @param {INodeTransformersRunner } transformersRunner
117
+ * @param {ICodeTransformersRunner } codeTransformersRunner
118
+ * @param {INodeTransformersRunner } nodeTransformersRunner
103
119
* @param {IRandomGenerator } randomGenerator
104
120
* @param {TObfuscatedCodeFactory } obfuscatedCodeFactory
105
121
* @param {ILogger } logger
106
122
* @param {IOptions } options
107
123
*/
108
124
public constructor (
109
- @inject ( ServiceIdentifiers . ITransformersRunner ) transformersRunner : INodeTransformersRunner ,
125
+ @inject ( ServiceIdentifiers . ICodeTransformersRunner ) codeTransformersRunner : ICodeTransformersRunner ,
126
+ @inject ( ServiceIdentifiers . INodeTransformersRunner ) nodeTransformersRunner : INodeTransformersRunner ,
110
127
@inject ( ServiceIdentifiers . IRandomGenerator ) randomGenerator : IRandomGenerator ,
111
128
@inject ( ServiceIdentifiers . Factory__IObfuscatedCode ) obfuscatedCodeFactory : TObfuscatedCodeFactory ,
112
129
@inject ( ServiceIdentifiers . ILogger ) logger : ILogger ,
113
130
@inject ( ServiceIdentifiers . IOptions ) options : IOptions
114
131
) {
115
- this . transformersRunner = transformersRunner ;
132
+ this . codeTransformersRunner = codeTransformersRunner ;
133
+ this . nodeTransformersRunner = nodeTransformersRunner ;
116
134
this . randomGenerator = randomGenerator ;
117
135
this . obfuscatedCodeFactory = obfuscatedCodeFactory ;
118
136
this . logger = logger ;
@@ -129,6 +147,9 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
129
147
this . logger . info ( LoggingMessage . ObfuscationStarted ) ;
130
148
this . logger . info ( LoggingMessage . RandomGeneratorSeed , this . randomGenerator . getInputSeed ( ) ) ;
131
149
150
+ // preparing code transformations
151
+ sourceCode = this . runCodeTransformationStage ( sourceCode , CodeTransformationStage . PreparingTransformers ) ;
152
+
132
153
// parse AST tree
133
154
const astTree : ESTree . Program = this . parseCode ( sourceCode ) ;
134
155
@@ -138,6 +159,9 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
138
159
// generate code
139
160
const generatorOutput : IGeneratorOutput = this . generateCode ( sourceCode , obfuscatedAstTree ) ;
140
161
162
+ // finalizing code transformations
163
+ generatorOutput . code = this . runCodeTransformationStage ( generatorOutput . code , CodeTransformationStage . FinalizingTransformers ) ;
164
+
141
165
const obfuscationTime : number = ( Date . now ( ) - timeStart ) / 1000 ;
142
166
this . logger . success ( LoggingMessage . ObfuscationCompleted , obfuscationTime ) ;
143
167
@@ -157,7 +181,7 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
157
181
* @returns {Program }
158
182
*/
159
183
private transformAstTree ( astTree : ESTree . Program ) : ESTree . Program {
160
- astTree = this . runTransformationStage ( astTree , NodeTransformationStage . Initializing ) ;
184
+ astTree = this . runNodeTransformationStage ( astTree , NodeTransformationStage . Initializing ) ;
161
185
162
186
const isEmptyAstTree : boolean = NodeGuards . isProgramNode ( astTree )
163
187
&& ! astTree . body . length
@@ -170,19 +194,19 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
170
194
return astTree ;
171
195
}
172
196
173
- astTree = this . runTransformationStage ( astTree , NodeTransformationStage . Preparing ) ;
197
+ astTree = this . runNodeTransformationStage ( astTree , NodeTransformationStage . Preparing ) ;
174
198
175
199
if ( this . options . deadCodeInjection ) {
176
- astTree = this . runTransformationStage ( astTree , NodeTransformationStage . DeadCodeInjection ) ;
200
+ astTree = this . runNodeTransformationStage ( astTree , NodeTransformationStage . DeadCodeInjection ) ;
177
201
}
178
202
179
203
if ( this . options . controlFlowFlattening ) {
180
- astTree = this . runTransformationStage ( astTree , NodeTransformationStage . ControlFlowFlattening ) ;
204
+ astTree = this . runNodeTransformationStage ( astTree , NodeTransformationStage . ControlFlowFlattening ) ;
181
205
}
182
206
183
- astTree = this . runTransformationStage ( astTree , NodeTransformationStage . Converting ) ;
184
- astTree = this . runTransformationStage ( astTree , NodeTransformationStage . Obfuscating ) ;
185
- astTree = this . runTransformationStage ( astTree , NodeTransformationStage . Finalizing ) ;
207
+ astTree = this . runNodeTransformationStage ( astTree , NodeTransformationStage . Converting ) ;
208
+ astTree = this . runNodeTransformationStage ( astTree , NodeTransformationStage . Obfuscating ) ;
209
+ astTree = this . runNodeTransformationStage ( astTree , NodeTransformationStage . Finalizing ) ;
186
210
187
211
return astTree ;
188
212
}
@@ -222,17 +246,32 @@ export class JavaScriptObfuscator implements IJavaScriptObfuscator {
222
246
return this . obfuscatedCodeFactory ( generatorOutput . code , generatorOutput . map ) ;
223
247
}
224
248
249
+ /**
250
+ * @param {string } code
251
+ * @param {CodeTransformationStage } codeTransformationStage
252
+ * @returns {string }
253
+ */
254
+ private runCodeTransformationStage ( code : string , codeTransformationStage : CodeTransformationStage ) : string {
255
+ this . logger . info ( LoggingMessage . CodeTransformationStage , codeTransformationStage ) ;
256
+
257
+ return this . codeTransformersRunner . transform (
258
+ code ,
259
+ JavaScriptObfuscator . codeTransformersList ,
260
+ codeTransformationStage
261
+ ) ;
262
+ }
263
+
225
264
/**
226
265
* @param {Program } astTree
227
266
* @param {NodeTransformationStage } nodeTransformationStage
228
267
* @returns {Program }
229
268
*/
230
- private runTransformationStage ( astTree : ESTree . Program , nodeTransformationStage : NodeTransformationStage ) : ESTree . Program {
231
- this . logger . info ( LoggingMessage . TransformationStage , nodeTransformationStage ) ;
269
+ private runNodeTransformationStage ( astTree : ESTree . Program , nodeTransformationStage : NodeTransformationStage ) : ESTree . Program {
270
+ this . logger . info ( LoggingMessage . NodeTransformationStage , nodeTransformationStage ) ;
232
271
233
- return this . transformersRunner . transform (
272
+ return this . nodeTransformersRunner . transform (
234
273
astTree ,
235
- JavaScriptObfuscator . transformersList ,
274
+ JavaScriptObfuscator . nodeTransformersList ,
236
275
nodeTransformationStage
237
276
) ;
238
277
}
0 commit comments