diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f5aaa68..9a977709 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change Log === +v0.7.0-dev.3 +--- +* Obfuscator now returns an empty string instead of obfuscated code if source code is empty + v0.7.0-dev.2 --- * Fix of incorrect `Utils.decToHex` method diff --git a/dist/index.js b/dist/index.js index 7e68cee3..2f83076c 100644 --- a/dist/index.js +++ b/dist/index.js @@ -220,8 +220,8 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var escodegen = __webpack_require__(10); var esprima = __webpack_require__(18); var estraverse = __webpack_require__(4); -var NodeType_1 = __webpack_require__(6); -var Nodes_1 = __webpack_require__(8); +var NodeType_1 = __webpack_require__(7); +var Nodes_1 = __webpack_require__(6); var Utils_1 = __webpack_require__(0); var NodeUtils = function () { @@ -414,7 +414,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 JSFuck_1 = __webpack_require__(16); -var Nodes_1 = __webpack_require__(8); +var Nodes_1 = __webpack_require__(6); var Utils_1 = __webpack_require__(0); var NodeObfuscator = function () { @@ -519,55 +519,11 @@ exports.NodeObfuscator = NodeObfuscator; "use strict"; "use strict"; -var Utils_1 = __webpack_require__(0); -exports.NodeType = Utils_1.Utils.strEnumify({ - ArrayExpression: 'ArrayExpression', - ArrowFunctionExpression: 'ArrowFunctionExpression', - AssignmentExpression: 'AssignmentExpression', - BinaryExpression: 'BinaryExpression', - BlockStatement: 'BlockStatement', - CallExpression: 'CallExpression', - CatchClause: 'CatchClause', - ClassDeclaration: 'ClassDeclaration', - ExpressionStatement: 'ExpressionStatement', - FunctionDeclaration: 'FunctionDeclaration', - FunctionExpression: 'FunctionExpression', - Identifier: 'Identifier', - IfStatement: 'IfStatement', - Literal: 'Literal', - LogicalExpression: 'LogicalExpression', - MemberExpression: 'MemberExpression', - MethodDefinition: 'MethodDefinition', - ObjectExpression: 'ObjectExpression', - Program: 'Program', - Property: 'Property', - ReturnStatement: 'ReturnStatement', - TryStatement: 'TryStatement', - UnaryExpression: 'UnaryExpression', - UpdateExpression: 'UpdateExpression', - VariableDeclaration: 'VariableDeclaration', - VariableDeclarator: 'VariableDeclarator', - WhileStatement: 'WhileStatement' -}); - -/***/ }, -/* 7 */ -/***/ function(module, exports) { - -module.exports = require("format-unicorn"); - -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { - -"use strict"; -"use strict"; - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var NodeType_1 = __webpack_require__(6); +var NodeType_1 = __webpack_require__(7); var Nodes = function () { function Nodes() { @@ -630,6 +586,50 @@ var Nodes = function () { exports.Nodes = Nodes; +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + +"use strict"; +"use strict"; + +var Utils_1 = __webpack_require__(0); +exports.NodeType = Utils_1.Utils.strEnumify({ + ArrayExpression: 'ArrayExpression', + ArrowFunctionExpression: 'ArrowFunctionExpression', + AssignmentExpression: 'AssignmentExpression', + BinaryExpression: 'BinaryExpression', + BlockStatement: 'BlockStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + ClassDeclaration: 'ClassDeclaration', + ExpressionStatement: 'ExpressionStatement', + FunctionDeclaration: 'FunctionDeclaration', + FunctionExpression: 'FunctionExpression', + Identifier: 'Identifier', + IfStatement: 'IfStatement', + Literal: 'Literal', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + MethodDefinition: 'MethodDefinition', + ObjectExpression: 'ObjectExpression', + Program: 'Program', + Property: 'Property', + ReturnStatement: 'ReturnStatement', + TryStatement: 'TryStatement', + UnaryExpression: 'UnaryExpression', + UpdateExpression: 'UpdateExpression', + VariableDeclaration: 'VariableDeclaration', + VariableDeclarator: 'VariableDeclarator', + WhileStatement: 'WhileStatement' +}); + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + +module.exports = require("format-unicorn"); + /***/ }, /* 9 */ /***/ function(module, exports, __webpack_require__) { @@ -981,7 +981,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var estraverse = __webpack_require__(4); var AppendState_1 = __webpack_require__(2); -var NodeType_1 = __webpack_require__(6); +var NodeType_1 = __webpack_require__(7); var CatchClauseObfuscator_1 = __webpack_require__(38); var ConsoleOutputNodesGroup_1 = __webpack_require__(34); var DebugProtectionNodesGroup_1 = __webpack_require__(35); @@ -990,6 +990,7 @@ var FunctionObfuscator_1 = __webpack_require__(40); var LiteralObfuscator_1 = __webpack_require__(41); var MemberExpressionObfuscator_1 = __webpack_require__(42); var MethodDefinitionObfuscator_1 = __webpack_require__(43); +var Nodes_1 = __webpack_require__(6); var NodeUtils_1 = __webpack_require__(1); var ObjectExpressionObfuscator_1 = __webpack_require__(44); var SelfDefendingNodesGroup_1 = __webpack_require__(36); @@ -1008,6 +1009,9 @@ var Obfuscator = function () { _createClass(Obfuscator, [{ key: 'obfuscateNode', value: function obfuscateNode(node) { + if (Nodes_1.Nodes.isProgramNode(node) && !node.body.length) { + return node; + } NodeUtils_1.NodeUtils.parentize(node); this.beforeObfuscation(node); this.obfuscate(node); @@ -1420,7 +1424,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -__webpack_require__(7); +__webpack_require__(8); var AppendState_1 = __webpack_require__(2); var DebufProtectionFunctionCallTemplate_1 = __webpack_require__(51); var Node_1 = __webpack_require__(3); @@ -1473,7 +1477,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -__webpack_require__(7); +__webpack_require__(8); var AppendState_1 = __webpack_require__(2); var DebugProtectionFunctionIntervalTemplate_1 = __webpack_require__(52); var Node_1 = __webpack_require__(3); @@ -1526,7 +1530,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -__webpack_require__(7); +__webpack_require__(8); var AppendState_1 = __webpack_require__(2); var DebugProtectionFunctionTemplate_1 = __webpack_require__(53); var Node_1 = __webpack_require__(3); @@ -1658,7 +1662,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -__webpack_require__(7); +__webpack_require__(8); var AppendState_1 = __webpack_require__(2); var UnicodeArrayCallsWrapperTemplate_1 = __webpack_require__(55); var Node_1 = __webpack_require__(3); @@ -1732,7 +1736,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -__webpack_require__(7); +__webpack_require__(8); var AppendState_1 = __webpack_require__(2); var NoCustomNodesPreset_1 = __webpack_require__(13); var AtobTemplate_1 = __webpack_require__(49); @@ -1813,7 +1817,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -__webpack_require__(7); +__webpack_require__(8); var AppendState_1 = __webpack_require__(2); var UnicodeArrayTemplate_1 = __webpack_require__(58); var Node_1 = __webpack_require__(3); @@ -1900,7 +1904,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -__webpack_require__(7); +__webpack_require__(8); var AppendState_1 = __webpack_require__(2); var NoCustomNodesPreset_1 = __webpack_require__(13); var SelfDefendingTemplate_1 = __webpack_require__(59); @@ -2231,7 +2235,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var estraverse = __webpack_require__(4); -var NodeType_1 = __webpack_require__(6); +var NodeType_1 = __webpack_require__(7); var NodeObfuscator_1 = __webpack_require__(5); var NodeUtils_1 = __webpack_require__(1); @@ -2388,7 +2392,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var escodegen = __webpack_require__(10); var NodeObfuscator_1 = __webpack_require__(5); -var Nodes_1 = __webpack_require__(8); +var Nodes_1 = __webpack_require__(6); var LiteralObfuscator = function (_NodeObfuscator_1$Nod) { _inherits(LiteralObfuscator, _NodeObfuscator_1$Nod); @@ -2451,9 +2455,9 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var escodegen = __webpack_require__(10); var estraverse = __webpack_require__(4); -var NodeType_1 = __webpack_require__(6); +var NodeType_1 = __webpack_require__(7); var NodeObfuscator_1 = __webpack_require__(5); -var Nodes_1 = __webpack_require__(8); +var Nodes_1 = __webpack_require__(6); var MemberExpressionObfuscator = function (_NodeObfuscator_1$Nod) { _inherits(MemberExpressionObfuscator, _NodeObfuscator_1$Nod); @@ -2535,7 +2539,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var estraverse = __webpack_require__(4); var NodeObfuscator_1 = __webpack_require__(5); -var Nodes_1 = __webpack_require__(8); +var Nodes_1 = __webpack_require__(6); var Utils_1 = __webpack_require__(0); var MethodDefinitionObfuscator = function (_NodeObfuscator_1$Nod) { @@ -2601,9 +2605,9 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" var escodegen = __webpack_require__(10); var estraverse = __webpack_require__(4); -var NodeType_1 = __webpack_require__(6); +var NodeType_1 = __webpack_require__(7); var NodeObfuscator_1 = __webpack_require__(5); -var Nodes_1 = __webpack_require__(8); +var Nodes_1 = __webpack_require__(6); var Utils_1 = __webpack_require__(0); var ObjectExpressionObfuscator = function (_NodeObfuscator_1$Nod) { @@ -2683,7 +2687,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var estraverse = __webpack_require__(4); -var NodeType_1 = __webpack_require__(6); +var NodeType_1 = __webpack_require__(7); var NodeObfuscator_1 = __webpack_require__(5); var NodeUtils_1 = __webpack_require__(1); var Utils_1 = __webpack_require__(0); diff --git a/package.json b/package.json index 1f86ea5f..62dc14d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "javascript-obfuscator", - "version": "0.7.0-dev.2", + "version": "0.7.0-dev.3", "description": "JavaScript obfuscator", "keywords": [ "obfuscator", @@ -35,11 +35,11 @@ "@types/chai": "^3.4.29", "@types/chance": "^0.7.28", "@types/commander": "^2.3.29", - "@types/escodegen": "0.0.1", - "@types/esprima": "^2.1.28", - "@types/estraverse": "0.0.1", - "@types/format-unicorn": "0.0.28", - "@types/joi": "^6.5.28", + "@types/escodegen": "^0.0.2", + "@types/esprima": "^2.1.29", + "@types/estraverse": "^0.0.2", + "@types/format-unicorn": "^0.0.28", + "@types/joi": "^9.0.29", "@types/mkdirp": "^0.3.28", "@types/mocha": "^2.2.28", "@types/node": "^4.0.30", diff --git a/src/Obfuscator.ts b/src/Obfuscator.ts index 5feb09e6..fbc1e86b 100644 --- a/src/Obfuscator.ts +++ b/src/Obfuscator.ts @@ -18,6 +18,7 @@ import { FunctionObfuscator } from './node-obfuscators/FunctionObfuscator'; import { LiteralObfuscator } from './node-obfuscators/LiteralObfuscator'; import { MemberExpressionObfuscator } from './node-obfuscators/MemberExpressionObfuscator'; import { MethodDefinitionObfuscator } from './node-obfuscators/MethodDefinitionObfuscator'; +import { Nodes } from "./Nodes"; import { NodeUtils } from "./NodeUtils"; import { ObjectExpressionObfuscator } from './node-obfuscators/ObjectExpressionObfuscator'; import { SelfDefendingNodesGroup } from "./node-groups/SelfDefendingNodesGroup"; @@ -73,6 +74,10 @@ export class Obfuscator implements IObfuscator { * @returns {INode} */ public obfuscateNode (node: INode): INode { + if (Nodes.isProgramNode(node) && !node.body.length) { + return node; + } + NodeUtils.parentize(node); this.beforeObfuscation(node); diff --git a/test/functional-tests/JavaScriptObfuscator.spec.ts b/test/functional-tests/JavaScriptObfuscator.spec.ts index 814a2a8a..e0c5a697 100644 --- a/test/functional-tests/JavaScriptObfuscator.spec.ts +++ b/test/functional-tests/JavaScriptObfuscator.spec.ts @@ -53,9 +53,9 @@ describe('JavaScriptObfuscator', () => { it('should returns object with empty obfuscated code and source map with empty data if source code is empty', () => { let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate( '', - Object.assign({}, NO_CUSTOM_NODES_PRESET, { + { sourceMap: true - }) + } ); assert.isNotOk(obfuscationResult.getObfuscatedCode()); @@ -65,11 +65,18 @@ describe('JavaScriptObfuscator', () => { }); }); - it('should returns empty string if source code is empty', () => { + it('should returns an empty string if source code is empty', () => { assert.isNotOk( JavaScriptObfuscator.obfuscate( - '', - Object.assign({}, NO_CUSTOM_NODES_PRESET) + '' + ).getObfuscatedCode() + ); + }); + + it('should returns an empty string if source code contains only comments', () => { + assert.isNotOk( + JavaScriptObfuscator.obfuscate( + '// comment' ).getObfuscatedCode() ); });