Added more tests, renamed some interfaces and classes

This commit is contained in:
sanex3339
2020-01-25 01:20:02 +03:00
parent 007af5f52b
commit f333b9d425
21 changed files with 128 additions and 26856 deletions
+6 -6
View File
File diff suppressed because one or more lines are too long
+1 -13711
View File
File diff suppressed because one or more lines are too long
+1 -13070
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -12,7 +12,7 @@ export enum ServiceIdentifiers {
Factory__IObfuscatedCode = 'Factory<IObfuscatedCode>',
Factory__IObfuscatingReplacer = 'Factory<IObfuscatingReplacer>',
Factory__IObjectExpressionKeysTransformerCustomNode = 'Factory<IObjectExpressionKeysTransformerCustomNode>',
Factory__IPropertiesExtractor = 'Factory<IPropertiesExtractor>',
Factory__IObjectExpressionExtractor = 'Factory<IObjectExpressionExtractor>',
Factory__TControlFlowStorage = 'Factory<TControlFlowStorage>',
IArrayUtils = 'IArrayUtils',
ICalleeDataExtractor = 'ICalleeDataExtractor',
@@ -37,7 +37,7 @@ export enum ServiceIdentifiers {
IOptionsNormalizer = 'IOptionsNormalizer',
IObfuscatingReplacer = 'IObfuscatingReplacer',
IPrevailingKindOfVariablesAnalyzer = 'IPrevailingKindOfVariablesAnalyzer',
IPropertiesExtractor = 'IPropertiesExtractor',
IObjectExpressionExtractor = 'IObjectExpressionExtractor',
IRandomGenerator = 'IRandomGenerator',
ISourceCode = 'ISourceCode',
ISourceMapCorrector = 'ISourceMapCorrector',
@@ -18,7 +18,7 @@ import { DomainLockCustomNodeGroup } from '../../../custom-nodes/domain-lock-nod
import { SelfDefendingCustomNodeGroup } from '../../../custom-nodes/self-defending-nodes/group/SelfDefendingCustomNodeGroup';
import { StringArrayCustomNodeGroup } from '../../../custom-nodes/string-array-nodes/group/StringArrayCustomNodeGroup';
import { BasePropertiesExtractorObjectExpressionHostNode } from '../../../custom-nodes/object-expression-keys-transformer-nodes/BasePropertiesExtractorObjectExpressionHostNode';
import { ObjectExpressionVariableDeclarationHostNode } from '../../../custom-nodes/object-expression-keys-transformer-nodes/ObjectExpressionVariableDeclarationHostNode';
import { BinaryExpressionFunctionNode } from '../../../custom-nodes/control-flow-flattening-nodes/BinaryExpressionFunctionNode';
import { BlockStatementControlFlowFlatteningNode } from '../../../custom-nodes/control-flow-flattening-nodes/BlockStatementControlFlowFlatteningNode';
import { BlockStatementDeadCodeInjectionNode } from '../../../custom-nodes/dead-code-injection-nodes/BlockStatementDeadCodeInjectionNode';
@@ -127,8 +127,8 @@ export const customNodesModule: interfaces.ContainerModule = new ContainerModule
// object expression keys transformer nodes
bind<interfaces.Newable<ICustomNode>>(ServiceIdentifiers.Newable__ICustomNode)
.toConstructor(BasePropertiesExtractorObjectExpressionHostNode)
.whenTargetNamed(ObjectExpressionKeysTransformerCustomNode.BasePropertiesExtractorObjectExpressionHostNode);
.toConstructor(ObjectExpressionVariableDeclarationHostNode)
.whenTargetNamed(ObjectExpressionKeysTransformerCustomNode.ObjectExpressionVariableDeclarationHostNode);
// node groups
bind<ICustomNodeGroup>(ServiceIdentifiers.ICustomNodeGroup)
@@ -3,10 +3,10 @@ import { InversifyContainerFacade } from '../../InversifyContainerFacade';
import { ServiceIdentifiers } from '../../ServiceIdentifiers';
import { INodeTransformer } from '../../../interfaces/node-transformers/INodeTransformer';
import { IPropertiesExtractor } from '../../../interfaces/node-transformers/converting-transformers/properties-extractors/IPropertiesExtractor';
import { IObjectExpressionExtractor } from '../../../interfaces/node-transformers/converting-transformers/object-expression-extractors/IObjectExpressionExtractor';
import { NodeTransformer } from '../../../enums/node-transformers/NodeTransformer';
import { PropertiesExtractor } from '../../../enums/node-transformers/converting-transformers/properties-extractors/PropertiesExtractor';
import { ObjectExpressionExtractor } from '../../../enums/node-transformers/converting-transformers/properties-extractors/ObjectExpressionExtractor';
import { ObjectExpressionToVariableDeclarationExtractor } from '../../../node-transformers/converting-transformers/object-expression-extractors/ObjectExpressionToVariableDeclarationExtractor';
import { MemberExpressionTransformer } from '../../../node-transformers/converting-transformers/MemberExpressionTransformer';
@@ -43,19 +43,19 @@ export const convertingTransformersModule: interfaces.ContainerModule = new Cont
.to(TemplateLiteralTransformer)
.whenTargetNamed(NodeTransformer.TemplateLiteralTransformer);
// properties extractors
bind<IPropertiesExtractor>(ServiceIdentifiers.IPropertiesExtractor)
// object expression extractors
bind<IObjectExpressionExtractor>(ServiceIdentifiers.IObjectExpressionExtractor)
.to(ObjectExpressionToVariableDeclarationExtractor)
.whenTargetNamed(PropertiesExtractor.ObjectExpressionToVariableDeclarationExtractor);
.whenTargetNamed(ObjectExpressionExtractor.ObjectExpressionToVariableDeclarationExtractor);
bind<IPropertiesExtractor>(ServiceIdentifiers.IPropertiesExtractor)
bind<IObjectExpressionExtractor>(ServiceIdentifiers.IObjectExpressionExtractor)
.to(BasePropertiesExtractor)
.whenTargetNamed(PropertiesExtractor.BasePropertiesExtractor);
.whenTargetNamed(ObjectExpressionExtractor.BasePropertiesExtractor);
// properties extractor factory
bind<IPropertiesExtractor>(ServiceIdentifiers.Factory__IPropertiesExtractor)
.toFactory<IPropertiesExtractor>(InversifyContainerFacade
.getCacheFactory<PropertiesExtractor, IPropertiesExtractor>(
ServiceIdentifiers.IPropertiesExtractor
// object expression extractor factory
bind<IObjectExpressionExtractor>(ServiceIdentifiers.Factory__IObjectExpressionExtractor)
.toFactory<IObjectExpressionExtractor>(InversifyContainerFacade
.getCacheFactory<ObjectExpressionExtractor, IObjectExpressionExtractor>(
ServiceIdentifiers.IObjectExpressionExtractor
));
});
@@ -14,7 +14,7 @@ import { AbstractCustomNode } from '../AbstractCustomNode';
import { NodeFactory } from '../../node/NodeFactory';
@injectable()
export class BasePropertiesExtractorObjectExpressionHostNode extends AbstractCustomNode {
export class ObjectExpressionVariableDeclarationHostNode extends AbstractCustomNode {
/**
* @ type {Property}
*/
@@ -1,4 +1,4 @@
export enum ObjectExpressionKeysTransformerCustomNode {
BasePropertiesExtractorObjectExpressionHostNode =
'BasePropertiesExtractorObjectExpressionHostNode'
ObjectExpressionVariableDeclarationHostNode =
'ObjectExpressionVariableDeclarationHostNode'
}
@@ -1,4 +1,4 @@
export enum PropertiesExtractor {
export enum ObjectExpressionExtractor {
BasePropertiesExtractor = 'BasePropertiesExtractor',
ObjectExpressionToVariableDeclarationExtractor = 'ObjectExpressionToVariableDeclarationExtractor'
}
@@ -1,3 +0,0 @@
export enum PropertiesExtractorFlag {
Skip = 'skip'
}
@@ -1,15 +1,15 @@
import * as ESTree from 'estree';
import { TPropertiesExtractorResult } from '../../../../types/node-transformers/TPropertiesExtractorResult';
import { IObjectExpressionExtractorResult } from './IObjectExpressionExtractorResult';
export interface IPropertiesExtractor {
export interface IObjectExpressionExtractor {
/**
* @param {ObjectExpression} objectExpressionNode
* @param {Statement} hostStatement
* @returns {TPropertiesExtractorResult}
* @returns {IObjectExpressionExtractorResult}
*/
extract (
objectExpressionNode: ESTree.ObjectExpression,
hostStatement: ESTree.Statement
): TPropertiesExtractorResult;
): IObjectExpressionExtractorResult;
}
@@ -0,0 +1,18 @@
import * as ESTree from 'estree';
export interface IObjectExpressionExtractorResult {
/**
* @type {Node}
*/
nodeToReplace: ESTree.Node;
/**
* @type {Statement}
*/
objectExpressionHostStatement: ESTree.Statement;
/**
* @type {ObjectExpression}
*/
objectExpressionNode: ESTree.ObjectExpression;
}
@@ -4,7 +4,7 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
import * as estraverse from 'estraverse';
import * as ESTree from 'estree';
import { TPropertiesExtractorFactory } from '../../types/container/node-transformers/TPropertiesExtractorFactory';
import { TObjectExpressionExtractorFactory } from '../../types/container/node-transformers/TObjectExpressionExtractorFactory';
import { IOptions } from '../../interfaces/options/IOptions';
import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
@@ -15,29 +15,29 @@ import { TransformationStage } from '../../enums/node-transformers/Transformatio
import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
import { NodeGuards } from '../../node/NodeGuards';
import { NodeStatementUtils } from '../../node/NodeStatementUtils';
import { PropertiesExtractor } from '../../enums/node-transformers/converting-transformers/properties-extractors/PropertiesExtractor';
import { ObjectExpressionExtractor } from '../../enums/node-transformers/converting-transformers/properties-extractors/ObjectExpressionExtractor';
@injectable()
export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
/**
* @type {TPropertiesExtractorFactory}
* @type {TObjectExpressionExtractorFactory}
*/
private readonly propertiesExtractorFactory: TPropertiesExtractorFactory;
private readonly objectExpressionExtractorFactory: TObjectExpressionExtractorFactory;
/**
* @param {TPropertiesExtractorFactory} propertiesExtractorFactory
* @param {TObjectExpressionExtractorFactory} objectExpressionExtractorFactory
* @param {IRandomGenerator} randomGenerator
* @param {IOptions} options
*/
constructor (
@inject(ServiceIdentifiers.Factory__IPropertiesExtractor)
propertiesExtractorFactory: TPropertiesExtractorFactory,
@inject(ServiceIdentifiers.Factory__IObjectExpressionExtractor)
objectExpressionExtractorFactory: TObjectExpressionExtractorFactory,
@inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
@inject(ServiceIdentifiers.IOptions) options: IOptions
) {
super(randomGenerator, options);
this.propertiesExtractorFactory = propertiesExtractorFactory;
this.objectExpressionExtractorFactory = objectExpressionExtractorFactory;
}
/**
@@ -213,11 +213,11 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
objectExpressionHostStatement: newObjectExpressionHostStatement,
objectExpressionNode: newObjectExpressionNode
} = this
.propertiesExtractorFactory(PropertiesExtractor.ObjectExpressionToVariableDeclarationExtractor)
.objectExpressionExtractorFactory(ObjectExpressionExtractor.ObjectExpressionToVariableDeclarationExtractor)
.extract(objectExpressionNode, hostStatement);
this
.propertiesExtractorFactory(PropertiesExtractor.BasePropertiesExtractor)
.objectExpressionExtractorFactory(ObjectExpressionExtractor.BasePropertiesExtractor)
.extract(newObjectExpressionNode, newObjectExpressionHostStatement);
return newObjectExpressionIdentifierReference;
@@ -3,9 +3,9 @@ import { injectable } from 'inversify';
import * as ESTree from 'estree';
import { TNodeWithStatements } from '../../../types/node/TNodeWithStatements';
import { TPropertiesExtractorResult } from '../../../types/node-transformers/TPropertiesExtractorResult';
import { IObjectExpressionExtractorResult } from '../../../interfaces/node-transformers/converting-transformers/object-expression-extractors/IObjectExpressionExtractorResult';
import { IPropertiesExtractor } from '../../../interfaces/node-transformers/converting-transformers/properties-extractors/IPropertiesExtractor';
import { IObjectExpressionExtractor } from '../../../interfaces/node-transformers/converting-transformers/object-expression-extractors/IObjectExpressionExtractor';
import { NodeAppender } from '../../../node/NodeAppender';
import { NodeFactory } from '../../../node/NodeFactory';
@@ -13,7 +13,7 @@ import { NodeGuards } from '../../../node/NodeGuards';
import { NodeStatementUtils } from '../../../node/NodeStatementUtils';
@injectable()
export class BasePropertiesExtractor implements IPropertiesExtractor {
export class BasePropertiesExtractor implements IObjectExpressionExtractor {
/**
* @param {Property} propertyNode
* @returns {string | null}
@@ -64,12 +64,12 @@ export class BasePropertiesExtractor implements IPropertiesExtractor {
*
* @param {ObjectExpression} objectExpressionNode
* @param {Statement} hostStatement
* @returns {TPropertiesExtractorResult}
* @returns {IObjectExpressionExtractorResult}
*/
public extract (
objectExpressionNode: ESTree.ObjectExpression,
hostStatement: ESTree.Statement
): TPropertiesExtractorResult {
): IObjectExpressionExtractorResult {
const hostNode: ESTree.Node | undefined = objectExpressionNode.parentNode;
if (
@@ -91,13 +91,13 @@ export class BasePropertiesExtractor implements IPropertiesExtractor {
* @param {ObjectExpression} objectExpressionNode
* @param {Statement} hostStatement
* @param {Expression} memberExpressionHostNode
* @returns {TPropertiesExtractorResult}
* @returns {IObjectExpressionExtractorResult}
*/
private transformObjectExpressionNode (
objectExpressionNode: ESTree.ObjectExpression,
hostStatement: ESTree.Statement,
memberExpressionHostNode: ESTree.Expression
): TPropertiesExtractorResult {
): IObjectExpressionExtractorResult {
const properties: ESTree.Property[] = objectExpressionNode.properties;
const [expressionStatements, removablePropertyIds]: [ESTree.ExpressionStatement[], number[]] = this
.extractPropertiesToExpressionStatements(
@@ -5,23 +5,23 @@ import * as ESTree from 'estree';
import { TNodeWithStatements } from '../../../types/node/TNodeWithStatements';
import { TObjectExpressionKeysTransformerCustomNodeFactory } from '../../../types/container/custom-nodes/TObjectExpressionKeysTransformerCustomNodeFactory';
import { TPropertiesExtractorResult } from '../../../types/node-transformers/TPropertiesExtractorResult';
import { IObjectExpressionExtractorResult } from '../../../interfaces/node-transformers/converting-transformers/object-expression-extractors/IObjectExpressionExtractorResult';
import { TStatement } from '../../../types/node/TStatement';
import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
import { TInitialData } from '../../../types/TInitialData';
import { IPropertiesExtractor } from '../../../interfaces/node-transformers/converting-transformers/properties-extractors/IPropertiesExtractor';
import { IObjectExpressionExtractor } from '../../../interfaces/node-transformers/converting-transformers/object-expression-extractors/IObjectExpressionExtractor';
import { ObjectExpressionKeysTransformerCustomNode } from '../../../enums/custom-nodes/ObjectExpressionKeysTransformerCustomNode';
import { BasePropertiesExtractorObjectExpressionHostNode } from '../../../custom-nodes/object-expression-keys-transformer-nodes/BasePropertiesExtractorObjectExpressionHostNode';
import { ObjectExpressionVariableDeclarationHostNode } from '../../../custom-nodes/object-expression-keys-transformer-nodes/ObjectExpressionVariableDeclarationHostNode';
import { NodeAppender } from '../../../node/NodeAppender';
import { NodeGuards } from '../../../node/NodeGuards';
import { NodeStatementUtils } from '../../../node/NodeStatementUtils';
import { NodeUtils } from '../../../node/NodeUtils';
@injectable()
export class ObjectExpressionToVariableDeclarationExtractor implements IPropertiesExtractor {
export class ObjectExpressionToVariableDeclarationExtractor implements IObjectExpressionExtractor {
/**
* @type {TObjectExpressionKeysTransformerCustomNodeFactory}
*/
@@ -53,12 +53,12 @@ export class ObjectExpressionToVariableDeclarationExtractor implements IProperti
*
* @param {ObjectExpression} objectExpressionNode
* @param {Statement} hostStatement
* @returns {TPropertiesExtractorResult}
* @returns {IObjectExpressionExtractorResult}
*/
public extract (
objectExpressionNode: ESTree.ObjectExpression,
hostStatement: ESTree.Statement
): TPropertiesExtractorResult {
): IObjectExpressionExtractorResult {
return this.transformObjectExpressionToVariableDeclaration(
objectExpressionNode,
hostStatement
@@ -73,7 +73,7 @@ export class ObjectExpressionToVariableDeclarationExtractor implements IProperti
private transformObjectExpressionToVariableDeclaration (
objectExpressionNode: ESTree.ObjectExpression,
hostStatement: ESTree.Statement
): TPropertiesExtractorResult {
): IObjectExpressionExtractorResult {
const properties: ESTree.Property[] = objectExpressionNode.properties;
const newObjectExpressionHostStatement: ESTree.VariableDeclaration = this.getObjectExpressionHostNode(properties);
@@ -99,14 +99,14 @@ export class ObjectExpressionToVariableDeclarationExtractor implements IProperti
* @returns {VariableDeclaration}
*/
private getObjectExpressionHostNode (properties: ESTree.Property[]): ESTree.VariableDeclaration {
const objectExpressionHostCustomNode: ICustomNode<TInitialData<BasePropertiesExtractorObjectExpressionHostNode>> =
const variableDeclarationHostNodeCustomNode: ICustomNode<TInitialData<ObjectExpressionVariableDeclarationHostNode>> =
this.objectExpressionKeysTransformerCustomNodeFactory(
ObjectExpressionKeysTransformerCustomNode.BasePropertiesExtractorObjectExpressionHostNode
ObjectExpressionKeysTransformerCustomNode.ObjectExpressionVariableDeclarationHostNode
);
objectExpressionHostCustomNode.initialize(properties);
variableDeclarationHostNodeCustomNode.initialize(properties);
const statementNode: TStatement = objectExpressionHostCustomNode.getNode()[0];
const statementNode: TStatement = variableDeclarationHostNodeCustomNode.getNode()[0];
if (
!statementNode
@@ -0,0 +1,6 @@
import { IObjectExpressionExtractor } from '../../../interfaces/node-transformers/converting-transformers/object-expression-extractors/IObjectExpressionExtractor';
import { ObjectExpressionExtractor } from '../../../enums/node-transformers/converting-transformers/properties-extractors/ObjectExpressionExtractor';
export type TObjectExpressionExtractorFactory =
(objectExpressionExtractorName: ObjectExpressionExtractor) => IObjectExpressionExtractor;
@@ -1,5 +0,0 @@
import { IPropertiesExtractor } from '../../../interfaces/node-transformers/converting-transformers/properties-extractors/IPropertiesExtractor';
import { PropertiesExtractor } from '../../../enums/node-transformers/converting-transformers/properties-extractors/PropertiesExtractor';
export type TPropertiesExtractorFactory = (propertiesExtractorName: PropertiesExtractor) => IPropertiesExtractor;
@@ -1,7 +0,0 @@
import * as ESTree from 'estree';
export type TPropertiesExtractorResult = {
nodeToReplace: ESTree.Node;
objectExpressionHostStatement: ESTree.Statement;
objectExpressionNode: ESTree.ObjectExpression;
};
@@ -1388,5 +1388,35 @@ describe('ObjectExpressionKeysTransformer', () => {
assert.match(obfuscatedCode, regExp);
});
});
describe('Variant #4: member expression node as property key', () => {
const match: string = `` +
`var ${variableMatch} *= *{};` +
`${variableMatch}\\['foo'] *= *'test';` +
`var foo *= *${variableMatch};` +
`var ${variableMatch} *= *{\\[foo.foo] *: *'1'};` +
`${variableMatch}\\['bar'] *= *'2';` +
`var bar *= *${variableMatch};` +
``;
const regExp: RegExp = new RegExp(match);
let obfuscatedCode: string;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/computed-key-member-expression.js');
obfuscatedCode = JavaScriptObfuscator.obfuscate(
code,
{
...NO_ADDITIONAL_NODES_PRESET,
transformObjectKeys: true
}
).getObfuscatedCode();
});
it('shouldn ignore extraction of property with member expression key', () => {
assert.match(obfuscatedCode, regExp);
});
});
});
});
@@ -0,0 +1,7 @@
var foo = {
foo: 'test'
};
var bar = {
[foo.foo]: '1',
bar: '2'
};
@@ -165,6 +165,11 @@ describe('SplitStringTransformer', () => {
describe('Variant #10: Integration with `transformObjectKeys` option', () => {
it('should correctly transform string when `transformObjectKeys` option is enabled', () => {
const regExp: RegExp = new RegExp(`` +
`var _0x[a-f0-9]{4,6} *= *{};` +
`*_0x[a-f0-9]{4,6}\\['ab' *\\+ *'cd' *\\+ *'ef' *\\+ *'g'] *= *'ab' *\\+ *'cd' *\\+ *'ef' *\\+ *'g';` +
`var test *= *_0x[a-f0-9]{4,6};` +
``);
const code: string = readFileAsString(__dirname + '/fixtures/object-string-literal.js');
obfuscatedCode = JavaScriptObfuscator.obfuscate(
@@ -179,7 +184,7 @@ describe('SplitStringTransformer', () => {
assert.match(
obfuscatedCode,
/^var *test *= *{}; *test\['ab' *\+ *'cd' *\+ *'ef' *\+ *'g'] *= *'ab' *\+ *'cd' *\+ *'ef' *\+ *'g';$/
regExp
);
});
});