diff --git a/dist/index.js b/dist/index.js index c039e420..d854b32e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -88,7 +88,7 @@ module.exports = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 122); +/******/ return __webpack_require__(__webpack_require__.s = 123); /******/ }) /************************************************************************/ /******/ ([ @@ -424,7 +424,7 @@ var _createClass = (function () { function defineProperties(target, props) { for function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var _ = __webpack_require__(35); +var _ = __webpack_require__(34); var JSFuck_1 = __webpack_require__(27); var Utils = function () { @@ -951,7 +951,7 @@ var JavaScriptObfuscator = function () { } _createClass(JavaScriptObfuscator, null, [{ - key: 'obfuscate', + key: "obfuscate", value: function obfuscate(sourceCode) { var inputOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; @@ -960,7 +960,7 @@ var JavaScriptObfuscator = function () { return javaScriptObfuscator.obfuscate(sourceCode); } }, { - key: 'runCLI', + key: "runCLI", value: function runCLI(argv) { new JavaScriptObfuscatorCLI_1.JavaScriptObfuscatorCLI(argv).run(); } @@ -1713,13 +1713,13 @@ module.exports = require("esprima"); /* 34 */ /***/ function(module, exports) { -module.exports = require("path"); +module.exports = require("lodash"); /***/ }, /* 35 */ /***/ function(module, exports) { -module.exports = require("underscore"); +module.exports = require("path"); /***/ }, /* 36 */ @@ -2061,7 +2061,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var fs = __webpack_require__(119); var mkdirp = __webpack_require__(120); -var path = __webpack_require__(34); +var path = __webpack_require__(35); var CLIUtils = function () { function CLIUtils() { @@ -2160,7 +2160,7 @@ var __assign = undefined && undefined.__assign || Object.assign || function (t) return t; }; var commander = __webpack_require__(117); -var path = __webpack_require__(34); +var path = __webpack_require__(35); var SourceMapMode_1 = __webpack_require__(19); var StringArrayEncoding_1 = __webpack_require__(22); var DefaultPreset_1 = __webpack_require__(31); @@ -4153,7 +4153,7 @@ var __param = undefined && undefined.__param || function (paramIndex, decorator) var inversify_1 = __webpack_require__(0); var ServiceIdentifiers_1 = __webpack_require__(1); var estraverse = __webpack_require__(5); -var _ = __webpack_require__(35); +var _ = __webpack_require__(34); var CustomNodes_1 = __webpack_require__(12); var NodeType_1 = __webpack_require__(10); var AbstractNodeTransformer_1 = __webpack_require__(11); @@ -4192,7 +4192,7 @@ var FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = function return; } var controlFlowStorage = this.controlFlowStorageFactory(); - var hostNode = NodeUtils_1.NodeUtils.getBlockScopeOfNode(functionNode.body, RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomInteger(1, 5)); + var hostNode = FunctionControlFlowTransformer_1.getHostNode(functionNode); var controlFlowStorageNodeName = RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomVariableName(6); if (!this.controlFlowData.has(hostNode)) { this.controlFlowData.set(hostNode, { @@ -4232,6 +4232,18 @@ var FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = function NodeAppender_1.NodeAppender.prependNode(hostNode, controlFlowStorageNode); } }], [{ + key: "getHostNode", + value: function getHostNode(functionNode) { + var currentBlockScopeDepth = NodeUtils_1.NodeUtils.getNodeBlockScopeDepth(functionNode); + if (currentBlockScopeDepth <= 1) { + return functionNode.body; + } + var minDepth = _.clamp(FunctionControlFlowTransformer_1.hostNodeSearchMinDepth, 0, currentBlockScopeDepth); + var maxDepth = Math.min(currentBlockScopeDepth, FunctionControlFlowTransformer_1.hostNodeSearchMaxDepth); + var depth = _.clamp(RandomGeneratorUtils_1.RandomGeneratorUtils.getRandomInteger(minDepth, maxDepth) - 1, 0, Infinity); + return NodeUtils_1.NodeUtils.getBlockScopeOfNode(functionNode, depth); + } + }, { key: "removeOldControlFlowNodeFromHostNodeBody", value: function removeOldControlFlowNodeFromHostNodeBody(hostNodeBody, controlFlowNodesList) { var _iteratorNormalCompletion = true; @@ -4270,6 +4282,8 @@ var FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = function return FunctionControlFlowTransformer; }(AbstractNodeTransformer_1.AbstractNodeTransformer); FunctionControlFlowTransformer.controlFlowReplacersMap = new Map([[NodeType_1.NodeType.BinaryExpression, NodeControlFlowReplacers_1.NodeControlFlowReplacers.BinaryExpressionControlFlowReplacer]]); +FunctionControlFlowTransformer.hostNodeSearchMinDepth = 2; +FunctionControlFlowTransformer.hostNodeSearchMaxDepth = 10; FunctionControlFlowTransformer = FunctionControlFlowTransformer_1 = __decorate([inversify_1.injectable(), __param(0, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers['Factory>'])), __param(1, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers['Factory'])), __param(2, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers['Factory'])), __param(3, inversify_1.inject(ServiceIdentifiers_1.ServiceIdentifiers.IOptions)), __metadata("design:paramtypes", [Function, Function, Function, Object])], FunctionControlFlowTransformer); exports.FunctionControlFlowTransformer = FunctionControlFlowTransformer; var FunctionControlFlowTransformer_1; @@ -5599,7 +5613,7 @@ var class_validator_1 = __webpack_require__(116); var DefaultPreset_1 = __webpack_require__(31); var OptionsNormalizer_1 = __webpack_require__(85); var ValidationErrorsFormatter_1 = __webpack_require__(86); -var Options_1 = function Options(inputOptions) { +var Options = Options_1 = function Options(inputOptions) { _classCallCheck(this, Options); Object.assign(this, DefaultPreset_1.DEFAULT_PRESET, inputOptions); @@ -5609,42 +5623,41 @@ var Options_1 = function Options(inputOptions) { } Object.assign(this, OptionsNormalizer_1.OptionsNormalizer.normalizeOptions(this)); }; -var Options = Options_1; Options.validatorOptions = { validationError: { target: false } }; -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "compact", void 0); -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "controlFlowFlattening", void 0); -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "debugProtection", void 0); -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "debugProtectionInterval", void 0); -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "disableConsoleOutput", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "compact", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "controlFlowFlattening", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "debugProtection", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "debugProtectionInterval", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "disableConsoleOutput", void 0); __decorate([class_validator_1.IsArray(), class_validator_1.ArrayUnique(), class_validator_1.IsString({ each: true -}), __metadata('design:type', Array)], Options.prototype, "domainLock", void 0); +}), __metadata("design:type", Array)], Options.prototype, "domainLock", void 0); __decorate([class_validator_1.IsArray(), class_validator_1.ArrayUnique(), class_validator_1.IsString({ each: true -}), __metadata('design:type', Array)], Options.prototype, "reservedNames", void 0); -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "rotateStringArray", void 0); -__decorate([class_validator_1.IsNumber(), __metadata('design:type', Number)], Options.prototype, "seed", void 0); -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "selfDefending", void 0); -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "sourceMap", void 0); +}), __metadata("design:type", Array)], Options.prototype, "reservedNames", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "rotateStringArray", void 0); +__decorate([class_validator_1.IsNumber(), __metadata("design:type", Number)], Options.prototype, "seed", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "selfDefending", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "sourceMap", void 0); __decorate([class_validator_1.IsString(), class_validator_1.ValidateIf(function (options) { return Boolean(options.sourceMapBaseUrl); }), class_validator_1.IsUrl({ require_protocol: true, require_valid_protocol: true -}), __metadata('design:type', String)], Options.prototype, "sourceMapBaseUrl", void 0); -__decorate([class_validator_1.IsString(), __metadata('design:type', String)], Options.prototype, "sourceMapFileName", void 0); -__decorate([class_validator_1.IsIn(['inline', 'separate']), __metadata('design:type', String)], Options.prototype, "sourceMapMode", void 0); -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "stringArray", void 0); -__decorate([class_validator_1.IsIn([true, false, 'base64', 'rc4']), __metadata('design:type', Object)], Options.prototype, "stringArrayEncoding", void 0); -__decorate([class_validator_1.IsNumber(), class_validator_1.Min(0), class_validator_1.Max(1), __metadata('design:type', Number)], Options.prototype, "stringArrayThreshold", void 0); -__decorate([class_validator_1.IsBoolean(), __metadata('design:type', Boolean)], Options.prototype, "unicodeEscapeSequence", void 0); -Options = Options_1 = __decorate([inversify_1.injectable(), __metadata('design:paramtypes', [typeof (_a = typeof TInputOptions_1.TInputOptions !== 'undefined' && TInputOptions_1.TInputOptions) === 'function' && _a || Object])], Options); +}), __metadata("design:type", String)], Options.prototype, "sourceMapBaseUrl", void 0); +__decorate([class_validator_1.IsString(), __metadata("design:type", String)], Options.prototype, "sourceMapFileName", void 0); +__decorate([class_validator_1.IsIn(['inline', 'separate']), __metadata("design:type", String)], Options.prototype, "sourceMapMode", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "stringArray", void 0); +__decorate([class_validator_1.IsIn([true, false, 'base64', 'rc4']), __metadata("design:type", Object)], Options.prototype, "stringArrayEncoding", void 0); +__decorate([class_validator_1.IsNumber(), class_validator_1.Min(0), class_validator_1.Max(1), __metadata("design:type", Number)], Options.prototype, "stringArrayThreshold", void 0); +__decorate([class_validator_1.IsBoolean(), __metadata("design:type", Boolean)], Options.prototype, "unicodeEscapeSequence", void 0); +Options = Options_1 = __decorate([inversify_1.injectable(), __metadata("design:paramtypes", [Object])], Options); exports.Options = Options; -var _a; +var Options_1; /***/ }, /* 85 */ @@ -6866,7 +6879,8 @@ module.exports = require("mkdirp"); module.exports = require("reflect-metadata"); /***/ }, -/* 122 */ +/* 122 */, +/* 123 */ /***/ function(module, exports, __webpack_require__) { "use strict"; diff --git a/package.json b/package.json index 75ba541d..ac0f5a7f 100644 --- a/package.json +++ b/package.json @@ -28,11 +28,11 @@ "esprima": "3.1.2", "estraverse": "4.2.0", "inversify": "^3.0.0-rc.2", + "lodash": "^4.17.2", "mkdirp": "0.5.1", "reflect-metadata": "^0.1.8", "source-map-support": "0.4.6", - "string-template": "^1.0.0", - "underscore": "^1.8.3" + "string-template": "^1.0.0" }, "devDependencies": { "@types/chai": "3.4.34", @@ -43,12 +43,12 @@ "@types/estraverse": "0.0.6", "@types/estree": "0.0.34", "@types/joi": "9.0.33", + "@types/lodash": "^4.14.43", "@types/mkdirp": "0.3.29", "@types/mocha": "2.2.33", "@types/node": "6.0.52", "@types/sinon": "1.16.33", "@types/string-template": "1.0.2", - "@types/underscore": "^1.7.36", "awesome-typescript-loader": "3.0.0-beta.17", "babel-cli": "6.18.0", "babel-loader": "6.2.9", diff --git a/src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts b/src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts index c7b02f58..9352da93 100644 --- a/src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts +++ b/src/node-transformers/node-control-flow-transformers/FunctionControlFlowTransformer.ts @@ -3,7 +3,7 @@ import { ServiceIdentifiers } from '../../container/ServiceIdentifiers'; import * as estraverse from 'estraverse'; import * as ESTree from 'estree'; -import * as _ from 'underscore'; +import * as _ from 'lodash'; import { TControlFlowReplacerFactory } from '../../types/container/TControlFlowReplacerFactory'; import { TControlFlowStorageFactory } from '../../types/container/TControlFlowStorageFactory'; @@ -35,6 +35,16 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { [NodeType.BinaryExpression, NodeControlFlowReplacers.BinaryExpressionControlFlowReplacer] ]); + /** + * @type {number} + */ + private static readonly hostNodeSearchMinDepth: number = 2; + + /** + * @type {number} + */ + private static readonly hostNodeSearchMaxDepth: number = 10; + /** * @type {Map} */ @@ -79,6 +89,24 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { this.customNodeFactory = customNodeFactory; } + /** + * @param functionNode + * @returns {TNodeWithBlockStatement} + */ + private static getHostNode (functionNode: ESTree.FunctionDeclaration | ESTree.FunctionExpression): TNodeWithBlockStatement { + const currentBlockScopeDepth: number = NodeUtils.getNodeBlockScopeDepth(functionNode); + + if (currentBlockScopeDepth <= 1) { + return functionNode.body; + } + + const minDepth: number = _.clamp(FunctionControlFlowTransformer.hostNodeSearchMinDepth, 0, currentBlockScopeDepth); + const maxDepth: number = Math.min(currentBlockScopeDepth, FunctionControlFlowTransformer.hostNodeSearchMaxDepth); + const depth: number = _.clamp(RandomGeneratorUtils.getRandomInteger(minDepth, maxDepth) - 1, 0, Infinity); + + return NodeUtils.getBlockScopeOfNode(functionNode, depth); + } + /** * @param hostNodeBody * @param controlFlowNodesList @@ -116,10 +144,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { } const controlFlowStorage: IStorage = this.controlFlowStorageFactory(); - const hostNode: TNodeWithBlockStatement = NodeUtils.getBlockScopeOfNode( - functionNode.body, - RandomGeneratorUtils.getRandomInteger(1, 5) - ); + const hostNode: TNodeWithBlockStatement = FunctionControlFlowTransformer.getHostNode(functionNode); let controlFlowStorageNodeName: string = RandomGeneratorUtils.getRandomVariableName(6); @@ -129,7 +154,7 @@ export class FunctionControlFlowTransformer extends AbstractNodeTransformer { controlFlowStorageNodeName }); } else { - hostNode.body = FunctionControlFlowTransformer + hostNode.body = FunctionControlFlowTransformer .removeOldControlFlowNodeFromHostNodeBody(hostNode.body, this.controlFlowNodesList); const { diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index eb2ec3c1..29f67ad3 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -1,4 +1,4 @@ -import * as _ from 'underscore'; +import * as _ from 'lodash'; import { JSFuck } from '../enums/JSFuck'; export class Utils {