Refactoring of mangle properties transformers and replacers

This commit is contained in:
sanex3339
2020-06-06 09:25:10 +03:00
parent f0465fc8f8
commit 06176c29a6
6 changed files with 84 additions and 90 deletions
+18 -22
View File
@@ -15982,7 +15982,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var _a, _b, _c;
var ManglePropertiesTransformer_1, _a, _b, _c;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ManglePropertiesTransformer = void 0;
const inversify_1 = __webpack_require__(/*! inversify */ "inversify");
@@ -15993,11 +15993,17 @@ const IRandomGenerator_1 = __webpack_require__(/*! ../../interfaces/utils/IRando
const NodeTransformationStage_1 = __webpack_require__(/*! ../../enums/node-transformers/NodeTransformationStage */ "./src/enums/node-transformers/NodeTransformationStage.ts");
const AbstractNodeTransformer_1 = __webpack_require__(/*! ../AbstractNodeTransformer */ "./src/node-transformers/AbstractNodeTransformer.ts");
const NodeGuards_1 = __webpack_require__(/*! ../../node/NodeGuards */ "./src/node/NodeGuards.ts");
let ManglePropertiesTransformer = class ManglePropertiesTransformer extends AbstractNodeTransformer_1.AbstractNodeTransformer {
let ManglePropertiesTransformer = ManglePropertiesTransformer_1 = class ManglePropertiesTransformer extends AbstractNodeTransformer_1.AbstractNodeTransformer {
constructor(manglePropertiesObfuscatingReplacer, randomGenerator, options) {
super(randomGenerator, options);
this.manglePropertiesObfuscatingReplacer = manglePropertiesObfuscatingReplacer;
}
static isValidPropertyNode(propertyNode, propertyKeyNode) {
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
return false;
}
return NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode);
}
getVisitor(nodeTransformationStage) {
switch (nodeTransformationStage) {
case NodeTransformationStage_1.NodeTransformationStage.MangleProperties:
@@ -16027,10 +16033,7 @@ let ManglePropertiesTransformer = class ManglePropertiesTransformer extends Abst
}
transformPropertyNode(propertyNode) {
const propertyKeyNode = propertyNode.key;
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
return propertyNode;
}
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
if (ManglePropertiesTransformer_1.isValidPropertyNode(propertyNode, propertyKeyNode)) {
propertyNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
propertyNode.shorthand = false;
}
@@ -16038,26 +16041,20 @@ let ManglePropertiesTransformer = class ManglePropertiesTransformer extends Abst
}
transformMemberExpressionNode(memberExpressionNode) {
const propertyKeyNode = memberExpressionNode.property;
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && memberExpressionNode.computed) {
return memberExpressionNode;
}
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
if (ManglePropertiesTransformer_1.isValidPropertyNode(memberExpressionNode, propertyKeyNode)) {
memberExpressionNode.property = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
}
return memberExpressionNode;
}
transformMethodDefinitionNode(methodDefinitionNode) {
const propertyKeyNode = methodDefinitionNode.key;
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && methodDefinitionNode.computed) {
return methodDefinitionNode;
}
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
if (ManglePropertiesTransformer_1.isValidPropertyNode(methodDefinitionNode, propertyKeyNode)) {
methodDefinitionNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
}
return methodDefinitionNode;
}
};
ManglePropertiesTransformer = __decorate([
ManglePropertiesTransformer = ManglePropertiesTransformer_1 = __decorate([
inversify_1.injectable(),
__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IManglePropertiesObfuscatingReplacer)),
__param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IRandomGenerator)),
@@ -16117,17 +16114,16 @@ let ManglePropertiesReplacer = class ManglePropertiesReplacer {
return node;
}
replacePropertyName(propertyName) {
var _a;
if (this.isReservedName(propertyName)) {
return propertyName;
}
let mangledPropertyName;
if (this.mangledPropertyNamesMap.has(propertyName)) {
mangledPropertyName = this.mangledPropertyNamesMap.get(propertyName);
}
else {
mangledPropertyName = this.identifierNamesGenerator.generateNext();
this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
let mangledPropertyName = (_a = this.mangledPropertyNamesMap.get(propertyName)) !== null && _a !== void 0 ? _a : null;
if (mangledPropertyName !== null) {
return mangledPropertyName;
}
mangledPropertyName = this.identifierNamesGenerator.generateNext();
this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
return mangledPropertyName;
}
isReservedName(name) {
+18 -22
View File
@@ -15309,7 +15309,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var _a, _b, _c;
var ManglePropertiesTransformer_1, _a, _b, _c;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ManglePropertiesTransformer = void 0;
const inversify_1 = __webpack_require__(/*! inversify */ "inversify");
@@ -15320,11 +15320,17 @@ const IRandomGenerator_1 = __webpack_require__(/*! ../../interfaces/utils/IRando
const NodeTransformationStage_1 = __webpack_require__(/*! ../../enums/node-transformers/NodeTransformationStage */ "./src/enums/node-transformers/NodeTransformationStage.ts");
const AbstractNodeTransformer_1 = __webpack_require__(/*! ../AbstractNodeTransformer */ "./src/node-transformers/AbstractNodeTransformer.ts");
const NodeGuards_1 = __webpack_require__(/*! ../../node/NodeGuards */ "./src/node/NodeGuards.ts");
let ManglePropertiesTransformer = class ManglePropertiesTransformer extends AbstractNodeTransformer_1.AbstractNodeTransformer {
let ManglePropertiesTransformer = ManglePropertiesTransformer_1 = class ManglePropertiesTransformer extends AbstractNodeTransformer_1.AbstractNodeTransformer {
constructor(manglePropertiesObfuscatingReplacer, randomGenerator, options) {
super(randomGenerator, options);
this.manglePropertiesObfuscatingReplacer = manglePropertiesObfuscatingReplacer;
}
static isValidPropertyNode(propertyNode, propertyKeyNode) {
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
return false;
}
return NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode);
}
getVisitor(nodeTransformationStage) {
switch (nodeTransformationStage) {
case NodeTransformationStage_1.NodeTransformationStage.MangleProperties:
@@ -15354,10 +15360,7 @@ let ManglePropertiesTransformer = class ManglePropertiesTransformer extends Abst
}
transformPropertyNode(propertyNode) {
const propertyKeyNode = propertyNode.key;
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
return propertyNode;
}
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
if (ManglePropertiesTransformer_1.isValidPropertyNode(propertyNode, propertyKeyNode)) {
propertyNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
propertyNode.shorthand = false;
}
@@ -15365,26 +15368,20 @@ let ManglePropertiesTransformer = class ManglePropertiesTransformer extends Abst
}
transformMemberExpressionNode(memberExpressionNode) {
const propertyKeyNode = memberExpressionNode.property;
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && memberExpressionNode.computed) {
return memberExpressionNode;
}
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
if (ManglePropertiesTransformer_1.isValidPropertyNode(memberExpressionNode, propertyKeyNode)) {
memberExpressionNode.property = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
}
return memberExpressionNode;
}
transformMethodDefinitionNode(methodDefinitionNode) {
const propertyKeyNode = methodDefinitionNode.key;
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) && methodDefinitionNode.computed) {
return methodDefinitionNode;
}
if (NodeGuards_1.NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards_1.NodeGuards.isLiteralNode(propertyKeyNode)) {
if (ManglePropertiesTransformer_1.isValidPropertyNode(methodDefinitionNode, propertyKeyNode)) {
methodDefinitionNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
}
return methodDefinitionNode;
}
};
ManglePropertiesTransformer = __decorate([
ManglePropertiesTransformer = ManglePropertiesTransformer_1 = __decorate([
inversify_1.injectable(),
__param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IManglePropertiesObfuscatingReplacer)),
__param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IRandomGenerator)),
@@ -15444,17 +15441,16 @@ let ManglePropertiesReplacer = class ManglePropertiesReplacer {
return node;
}
replacePropertyName(propertyName) {
var _a;
if (this.isReservedName(propertyName)) {
return propertyName;
}
let mangledPropertyName;
if (this.mangledPropertyNamesMap.has(propertyName)) {
mangledPropertyName = this.mangledPropertyNamesMap.get(propertyName);
}
else {
mangledPropertyName = this.identifierNamesGenerator.generateNext();
this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
let mangledPropertyName = (_a = this.mangledPropertyNamesMap.get(propertyName)) !== null && _a !== void 0 ? _a : null;
if (mangledPropertyName !== null) {
return mangledPropertyName;
}
mangledPropertyName = this.identifierNamesGenerator.generateNext();
this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
return mangledPropertyName;
}
isReservedName(name) {
@@ -2,8 +2,8 @@ import * as ESTree from 'estree';
export interface IManglePropertiesReplacer {
/**
* @param {TNode} node
* @returns {TNode}
* @param {ESTree.Identifier | ESTree.Literal} node
* @returns {ESTree.Identifier | ESTree.Literal}
*/
replace <TNode extends ESTree.Identifier | ESTree.Literal> (node: TNode): TNode;
replace (node: ESTree.Identifier | ESTree.Literal): ESTree.Identifier | ESTree.Literal;
}
@@ -36,6 +36,24 @@ export class ManglePropertiesTransformer extends AbstractNodeTransformer {
this.manglePropertiesObfuscatingReplacer = manglePropertiesObfuscatingReplacer;
}
/**
* @param {TNode} propertyNode
* @param {ESTree.Expression} propertyKeyNode
* @returns {boolean}
*/
private static isValidPropertyNode<
TNode extends ESTree.Property | ESTree.MemberExpression | ESTree.MethodDefinition
>(
propertyNode: TNode,
propertyKeyNode: ESTree.Expression
): propertyKeyNode is ESTree.Identifier | ESTree.Literal {
if (NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
return false;
}
return NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards.isLiteralNode(propertyKeyNode);
}
/**
* @param {NodeTransformationStage} nodeTransformationStage
* @returns {IVisitor | null}
@@ -86,11 +104,7 @@ export class ManglePropertiesTransformer extends AbstractNodeTransformer {
private transformPropertyNode (propertyNode: ESTree.Property): ESTree.Property {
const propertyKeyNode: ESTree.Expression = propertyNode.key;
if (NodeGuards.isIdentifierNode(propertyKeyNode) && propertyNode.computed) {
return propertyNode;
}
if (NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards.isLiteralNode(propertyKeyNode)) {
if (ManglePropertiesTransformer.isValidPropertyNode(propertyNode, propertyKeyNode)) {
propertyNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
propertyNode.shorthand = false;
}
@@ -105,11 +119,7 @@ export class ManglePropertiesTransformer extends AbstractNodeTransformer {
private transformMemberExpressionNode (memberExpressionNode: ESTree.MemberExpression): ESTree.MemberExpression {
const propertyKeyNode: ESTree.Expression = memberExpressionNode.property;
if (NodeGuards.isIdentifierNode(propertyKeyNode) && memberExpressionNode.computed) {
return memberExpressionNode;
}
if (NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards.isLiteralNode(propertyKeyNode)) {
if (ManglePropertiesTransformer.isValidPropertyNode(memberExpressionNode, propertyKeyNode)) {
memberExpressionNode.property = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
}
@@ -123,11 +133,7 @@ export class ManglePropertiesTransformer extends AbstractNodeTransformer {
private transformMethodDefinitionNode (methodDefinitionNode: ESTree.MethodDefinition): ESTree.MethodDefinition {
const propertyKeyNode: ESTree.Expression = methodDefinitionNode.key;
if (NodeGuards.isIdentifierNode(propertyKeyNode) && methodDefinitionNode.computed) {
return methodDefinitionNode;
}
if (NodeGuards.isIdentifierNode(propertyKeyNode) || NodeGuards.isLiteralNode(propertyKeyNode)) {
if (ManglePropertiesTransformer.isValidPropertyNode(methodDefinitionNode, propertyKeyNode)) {
methodDefinitionNode.key = this.manglePropertiesObfuscatingReplacer.replace(propertyKeyNode);
}
@@ -52,18 +52,18 @@ export class ManglePropertiesReplacer implements IManglePropertiesReplacer {
}
/**
* @param {string} node
* @returns {string}
* @param {ESTree.Identifier | ESTree.Literal} node
* @returns {ESTree.Identifier | ESTree.Literal}
*/
public replace <TNode extends ESTree.Identifier | ESTree.Literal> (node: TNode): TNode {
public replace (node: ESTree.Identifier | ESTree.Literal): ESTree.Identifier | ESTree.Literal {
if (NodeGuards.isIdentifierNode(node)) {
return <TNode>NodeFactory.identifierNode(
return NodeFactory.identifierNode(
this.replacePropertyName(node.name)
);
}
if (NodeGuards.isLiteralNode(node) && typeof node.value === 'string') {
return <TNode>NodeFactory.literalNode(
return NodeFactory.literalNode(
this.replacePropertyName(node.value)
);
}
@@ -81,15 +81,15 @@ export class ManglePropertiesReplacer implements IManglePropertiesReplacer {
return propertyName;
}
let mangledPropertyName: string;
let mangledPropertyName: string | null = this.mangledPropertyNamesMap.get(propertyName) ?? null;
if (this.mangledPropertyNamesMap.has(propertyName)) {
mangledPropertyName = <string>this.mangledPropertyNamesMap.get(propertyName);
} else {
mangledPropertyName = this.identifierNamesGenerator.generateNext();
this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
if (mangledPropertyName !== null) {
return mangledPropertyName;
}
mangledPropertyName = this.identifierNamesGenerator.generateNext();
this.mangledPropertyNamesMap.set(propertyName, mangledPropertyName);
return mangledPropertyName;
}
+13 -17
View File
@@ -7,31 +7,27 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
`
const foo = {
prop1: {
prop2: 'bar'
var x = {
baz_: 0,
foo_: 1,
calc: function() {
return this.foo_ + this.baz_;
}
};
foo.prop1.prop2;
const {prop1} = foo;
console.log(prop1.prop2);
class Foo {
prop1 () {}
}
const s = new Foo();
s.prop1();
x.bar_ = 2;
x["baz_"] = 3;
console.log(x.calc());
`,
{
...NO_ADDITIONAL_NODES_PRESET,
compact: false,
log: true,
identifierNamesGenerator: 'mangled',
renameGlobals: true,
splitStrings: true,
splitStringsChunkLength: 3
splitStringsChunkLength: 3,
stringArray: true,
stringArrayThreshold: 1
}
).getObfuscatedCode();