This commit is contained in:
sanex3339
2017-11-24 00:39:57 +03:00
parent e52fb4c84c
commit 5f61e88a7e
9 changed files with 92 additions and 99 deletions
+1
View File
@@ -2,6 +2,7 @@ Change Log
===
v0.12.3
---
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/129
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/125 (dead code injection and await expression)
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/123
+1 -1
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -27,7 +27,7 @@
"esmangle": "1.0.1",
"esprima": "4.0.0",
"estraverse": "4.2.0",
"inversify": "4.5.1",
"inversify": "4.5.2",
"md5": "2.2.1",
"mkdirp": "0.5.1",
"opencollective": "1.0.3",
@@ -57,7 +57,7 @@
"babel-plugin-array-includes": "2.0.3",
"babel-preset-es2015": "6.24.1",
"chai": "4.1.2",
"coveralls": "2.13.3",
"coveralls": "3.0.0",
"istanbul": "1.1.0-alpha.1",
"mocha": "4.0.1",
"pre-commit": "1.2.2",
@@ -11,6 +11,7 @@ import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
import { initializable } from '../../decorators/Initializable';
import { AbstractCustomNode } from '../AbstractCustomNode';
import { NodeGuards } from '../../node/NodeGuards';
import { Nodes } from '../../node/Nodes';
import { NodeUtils } from '../../node/NodeUtils';
@@ -100,12 +101,20 @@ export class BlockStatementControlFlowFlatteningNode extends AbstractCustomNode
true
),
this.shuffledKeys.map((key: number, index: number) => {
const statement: ESTree.Statement = this.blockStatementBody[key];
const consequent: ESTree.Statement[] = [statement];
/**
* We shouldn't add continue statement after return statement
* to prevent `unreachable code after return statement` warnings
*/
if (!NodeGuards.isReturnStatementNode(statement)) {
consequent.push(Nodes.getContinueStatement());
}
return Nodes.getSwitchCaseNode(
Nodes.getLiteralNode(String(index)),
[
this.blockStatementBody[key],
Nodes.getContinueStatement()
]
consequent
);
})
),
@@ -54,11 +54,14 @@ export class BlockStatementControlFlowTransformer extends AbstractNodeTransforme
*/
private static blockStatementHasProhibitedStatements (blockStatementNode: ESTree.BlockStatement): boolean {
return blockStatementNode.body.some((statement: ESTree.Statement) => {
const isBreakOrContinueStatement: boolean = NodeGuards.isBreakStatementNode(statement) || NodeGuards.isContinueStatementNode(statement);
const isBreakOrContinueStatement: boolean = NodeGuards.isBreakStatementNode(statement)
|| NodeGuards.isContinueStatementNode(statement);
const isVariableDeclarationWithLetOrConstKind: boolean = NodeGuards.isVariableDeclarationNode(statement)
&& (statement.kind === 'const' || statement.kind === 'let');
return NodeGuards.isFunctionDeclarationNode(statement) || isBreakOrContinueStatement || isVariableDeclarationWithLetOrConstKind;
return NodeGuards.isFunctionDeclarationNode(statement)
|| isBreakOrContinueStatement
|| isVariableDeclarationWithLetOrConstKind;
});
}
+8
View File
@@ -234,6 +234,14 @@ export class NodeGuards {
!NodeGuards.isLabelIdentifierNode(node, parentNode);
}
/**
* @param {Node} node
* @returns {boolean}
*/
public static isReturnStatementNode (node: ESTree.Node): node is ESTree.ReturnStatement {
return node.type === NodeType.ReturnStatement;
}
/**
* @param {Node} node
* @returns {boolean}
@@ -498,5 +498,42 @@ describe('BlockStatementControlFlowTransformer', function () {
assert.closeTo(untouchedStatementPercentage, controlFlowFlatteningThreshold, delta);
});
});
describe('variant #14: No `unreachable code after return statement` warning', () => {
const switchCaseRegExp: RegExp = /switch *\(_0x([a-f0-9]){4,6}\[_0x([a-f0-9]){4,6}\+\+\]\) *\{/;
const switchCaseLengthRegExp: RegExp = /case *'[0-5]': *console\['log'\]\(0x[0-6]\);/g;
const returnStatementRegExp: RegExp = /case *'[0-5]': *return; *(case|})/;
const expectedSwitchCaseLength: number = 5;
let obfuscatedCode: string,
switchCaseLength: number;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/no-unreachable-code-warning.js');
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
code,
{
...NO_CUSTOM_NODES_PRESET,
controlFlowFlattening: true,
controlFlowFlatteningThreshold: 1
}
);
obfuscatedCode = obfuscationResult.getObfuscatedCode();
switchCaseLength = obfuscatedCode.match(switchCaseLengthRegExp)!.length;
});
it('should wrap block statement statements in switch-case structure', () => {
assert.match(obfuscatedCode, switchCaseRegExp);
});
it('each statement should be wrapped by switch-case structure', () => {
assert.equal(switchCaseLength, expectedSwitchCaseLength);
});
it('should not add `continue` statement after `return` statement', () => {
assert.match(obfuscatedCode, returnStatementRegExp);
});
});
});
});
@@ -0,0 +1,8 @@
(function () {
console.log(1);
console.log(2);
console.log(3);
console.log(4);
console.log(5);
return;
})();
+17 -90
View File
@@ -903,10 +903,6 @@ camelcase@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
caseless@~0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -929,7 +925,7 @@ chai@4.1.2:
pathval "^1.0.0"
type-detect "^4.0.0"
chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
dependencies:
@@ -1112,15 +1108,15 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
coveralls@2.13.3:
version "2.13.3"
resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.3.tgz#9ad7c2ae527417f361e8b626483f48ee92dd2bc7"
coveralls@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.0.tgz#22ef730330538080d29b8c151dc9146afde88a99"
dependencies:
js-yaml "3.6.1"
lcov-parse "0.0.10"
log-driver "1.2.5"
minimist "1.2.0"
request "2.79.0"
js-yaml "^3.6.1"
lcov-parse "^0.0.10"
log-driver "^1.2.5"
minimist "^1.2.0"
request "^2.79.0"
create-ecdh@^4.0.0:
version "4.0.0"
@@ -1765,16 +1761,6 @@ gauge@~2.7.3:
strip-ansi "^3.0.1"
wide-align "^1.1.0"
generate-function@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
generate-object-property@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
dependencies:
is-property "^1.0.0"
get-caller-file@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
@@ -1847,15 +1833,6 @@ har-schema@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
har-validator@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
dependencies:
chalk "^1.1.1"
commander "^2.9.0"
is-my-json-valid "^2.12.4"
pinkie-promise "^2.0.0"
har-validator@~4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
@@ -2041,9 +2018,9 @@ invariant@^2.2.2:
dependencies:
loose-envify "^1.0.0"
inversify@4.5.1:
version "4.5.1"
resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.5.1.tgz#2f8a249e1fc5346e4f28b4b86dfae5af1b673178"
inversify@4.5.2:
version "4.5.2"
resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.5.2.tgz#f2478fd140f398836b2e1fee839f37588f1e6a9b"
invert-kv@^1.0.0:
version "1.0.0"
@@ -2137,15 +2114,6 @@ is-glob@^2.0.0, is-glob@^2.0.1:
dependencies:
is-extglob "^1.0.0"
is-my-json-valid@^2.12.4:
version "2.16.1"
resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11"
dependencies:
generate-function "^2.0.0"
generate-object-property "^1.1.0"
jsonpointer "^4.0.0"
xtend "^4.0.0"
is-number@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -2182,10 +2150,6 @@ is-promise@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
is-property@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -2304,14 +2268,14 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
js-yaml@3.6.1, js-yaml@3.x:
js-yaml@3.x:
version "3.6.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30"
dependencies:
argparse "^1.0.7"
esprima "^2.6.0"
js-yaml@^3.7.0:
js-yaml@^3.6.1, js-yaml@^3.7.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
dependencies:
@@ -2364,10 +2328,6 @@ jsonify@~0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
jsonpointer@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
jsprim@^1.2.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -2417,7 +2377,7 @@ lcid@^1.0.0:
dependencies:
invert-kv "^1.0.0"
lcov-parse@0.0.10:
lcov-parse@^0.0.10:
version "0.0.10"
resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3"
@@ -2471,7 +2431,7 @@ lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
log-driver@1.2.5:
log-driver@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056"
@@ -3111,10 +3071,6 @@ punycode@^1.2.4, punycode@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
qs@~6.3.0:
version "6.3.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
qs@~6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
@@ -3264,32 +3220,7 @@ repeating@^2.0.0:
dependencies:
is-finite "^1.0.0"
request@2.79.0:
version "2.79.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
dependencies:
aws-sign2 "~0.6.0"
aws4 "^1.2.1"
caseless "~0.11.0"
combined-stream "~1.0.5"
extend "~3.0.0"
forever-agent "~0.6.1"
form-data "~2.1.1"
har-validator "~2.0.6"
hawk "~3.1.3"
http-signature "~1.1.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.7"
oauth-sign "~0.8.1"
qs "~6.3.0"
stringstream "~0.0.4"
tough-cookie "~2.3.0"
tunnel-agent "~0.4.1"
uuid "^3.0.0"
request@2.81.0:
request@2.81.0, request@^2.79.0:
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
dependencies:
@@ -3869,10 +3800,6 @@ tunnel-agent@^0.6.0:
dependencies:
safe-buffer "^5.0.1"
tunnel-agent@~0.4.1:
version "0.4.3"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"