Browse Source

Obfuscator now returns an empty string instead of obfuscated code if source code is empty

sanex3339 8 years ago
parent
commit
a2ce24a206
5 changed files with 95 additions and 75 deletions
  1. 4 0
      CHANGELOG.md
  2. 68 64
      dist/index.js
  3. 6 6
      package.json
  4. 5 0
      src/Obfuscator.ts
  5. 12 5
      test/functional-tests/JavaScriptObfuscator.spec.ts

+ 4 - 0
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

+ 68 - 64
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);

+ 6 - 6
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",

+ 5 - 0
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);

+ 12 - 5
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()
             );
         });