Skip to content

Commit 813b91d

Browse files
authored
Merge pull request javascript-obfuscator#130 from javascript-obfuscator/0.12.3-release
Fixed javascript-obfuscator#129
2 parents 05d5b24 + 5f61e88 commit 813b91d

9 files changed

Lines changed: 92 additions & 99 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ Change Log
22
===
33
v0.12.3
44
---
5+
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/129
56
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/125 (dead code injection and await expression)
67
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/123
78

dist/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"esmangle": "1.0.1",
2828
"esprima": "4.0.0",
2929
"estraverse": "4.2.0",
30-
"inversify": "4.5.1",
30+
"inversify": "4.5.2",
3131
"md5": "2.2.1",
3232
"mkdirp": "0.5.1",
3333
"opencollective": "1.0.3",
@@ -57,7 +57,7 @@
5757
"babel-plugin-array-includes": "2.0.3",
5858
"babel-preset-es2015": "6.24.1",
5959
"chai": "4.1.2",
60-
"coveralls": "2.13.3",
60+
"coveralls": "3.0.0",
6161
"istanbul": "1.1.0-alpha.1",
6262
"mocha": "4.0.1",
6363
"pre-commit": "1.2.2",

src/custom-nodes/control-flow-flattening-nodes/BlockStatementControlFlowFlatteningNode.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
1111
import { initializable } from '../../decorators/Initializable';
1212

1313
import { AbstractCustomNode } from '../AbstractCustomNode';
14+
import { NodeGuards } from '../../node/NodeGuards';
1415
import { Nodes } from '../../node/Nodes';
1516
import { NodeUtils } from '../../node/NodeUtils';
1617

@@ -100,12 +101,20 @@ export class BlockStatementControlFlowFlatteningNode extends AbstractCustomNode
100101
true
101102
),
102103
this.shuffledKeys.map((key: number, index: number) => {
104+
const statement: ESTree.Statement = this.blockStatementBody[key];
105+
const consequent: ESTree.Statement[] = [statement];
106+
107+
/**
108+
* We shouldn't add continue statement after return statement
109+
* to prevent `unreachable code after return statement` warnings
110+
*/
111+
if (!NodeGuards.isReturnStatementNode(statement)) {
112+
consequent.push(Nodes.getContinueStatement());
113+
}
114+
103115
return Nodes.getSwitchCaseNode(
104116
Nodes.getLiteralNode(String(index)),
105-
[
106-
this.blockStatementBody[key],
107-
Nodes.getContinueStatement()
108-
]
117+
consequent
109118
);
110119
})
111120
),

src/node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,14 @@ export class BlockStatementControlFlowTransformer extends AbstractNodeTransforme
5454
*/
5555
private static blockStatementHasProhibitedStatements (blockStatementNode: ESTree.BlockStatement): boolean {
5656
return blockStatementNode.body.some((statement: ESTree.Statement) => {
57-
const isBreakOrContinueStatement: boolean = NodeGuards.isBreakStatementNode(statement) || NodeGuards.isContinueStatementNode(statement);
57+
const isBreakOrContinueStatement: boolean = NodeGuards.isBreakStatementNode(statement)
58+
|| NodeGuards.isContinueStatementNode(statement);
5859
const isVariableDeclarationWithLetOrConstKind: boolean = NodeGuards.isVariableDeclarationNode(statement)
5960
&& (statement.kind === 'const' || statement.kind === 'let');
6061

61-
return NodeGuards.isFunctionDeclarationNode(statement) || isBreakOrContinueStatement || isVariableDeclarationWithLetOrConstKind;
62+
return NodeGuards.isFunctionDeclarationNode(statement)
63+
|| isBreakOrContinueStatement
64+
|| isVariableDeclarationWithLetOrConstKind;
6265
});
6366
}
6467

src/node/NodeGuards.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,14 @@ export class NodeGuards {
234234
!NodeGuards.isLabelIdentifierNode(node, parentNode);
235235
}
236236

237+
/**
238+
* @param {Node} node
239+
* @returns {boolean}
240+
*/
241+
public static isReturnStatementNode (node: ESTree.Node): node is ESTree.ReturnStatement {
242+
return node.type === NodeType.ReturnStatement;
243+
}
244+
237245
/**
238246
* @param {Node} node
239247
* @returns {boolean}

test/functional-tests/node-transformers/control-flow-transformers/block-statement-control-flow-transformer/BlockStatementControlFlowTransformer.spec.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,5 +498,42 @@ describe('BlockStatementControlFlowTransformer', function () {
498498
assert.closeTo(untouchedStatementPercentage, controlFlowFlatteningThreshold, delta);
499499
});
500500
});
501+
502+
describe('variant #14: No `unreachable code after return statement` warning', () => {
503+
const switchCaseRegExp: RegExp = /switch *\(_0x([a-f0-9]){4,6}\[_0x([a-f0-9]){4,6}\+\+\]\) *\{/;
504+
const switchCaseLengthRegExp: RegExp = /case *'[0-5]': *console\['log'\]\(0x[0-6]\);/g;
505+
const returnStatementRegExp: RegExp = /case *'[0-5]': *return; *(case|})/;
506+
const expectedSwitchCaseLength: number = 5;
507+
508+
let obfuscatedCode: string,
509+
switchCaseLength: number;
510+
511+
before(() => {
512+
const code: string = readFileAsString(__dirname + '/fixtures/no-unreachable-code-warning.js');
513+
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
514+
code,
515+
{
516+
...NO_CUSTOM_NODES_PRESET,
517+
controlFlowFlattening: true,
518+
controlFlowFlatteningThreshold: 1
519+
}
520+
);
521+
522+
obfuscatedCode = obfuscationResult.getObfuscatedCode();
523+
switchCaseLength = obfuscatedCode.match(switchCaseLengthRegExp)!.length;
524+
});
525+
526+
it('should wrap block statement statements in switch-case structure', () => {
527+
assert.match(obfuscatedCode, switchCaseRegExp);
528+
});
529+
530+
it('each statement should be wrapped by switch-case structure', () => {
531+
assert.equal(switchCaseLength, expectedSwitchCaseLength);
532+
});
533+
534+
it('should not add `continue` statement after `return` statement', () => {
535+
assert.match(obfuscatedCode, returnStatementRegExp);
536+
});
537+
});
501538
});
502539
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
(function () {
2+
console.log(1);
3+
console.log(2);
4+
console.log(3);
5+
console.log(4);
6+
console.log(5);
7+
return;
8+
})();

yarn.lock

Lines changed: 17 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -903,10 +903,6 @@ camelcase@^4.1.0:
903903
version "4.1.0"
904904
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
905905

906-
caseless@~0.11.0:
907-
version "0.11.0"
908-
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
909-
910906
caseless@~0.12.0:
911907
version "0.12.0"
912908
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -929,7 +925,7 @@ [email protected]:
929925
pathval "^1.0.0"
930926
type-detect "^4.0.0"
931927

932-
[email protected], chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
928+
[email protected], chalk@^1.0.0, chalk@^1.1.3:
933929
version "1.1.3"
934930
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
935931
dependencies:
@@ -1112,15 +1108,15 @@ [email protected], core-util-is@~1.0.0:
11121108
version "1.0.2"
11131109
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
11141110

1115-
coveralls@2.13.3:
1116-
version "2.13.3"
1117-
resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.3.tgz#9ad7c2ae527417f361e8b626483f48ee92dd2bc7"
1111+
coveralls@3.0.0:
1112+
version "3.0.0"
1113+
resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.0.tgz#22ef730330538080d29b8c151dc9146afde88a99"
11181114
dependencies:
1119-
js-yaml "3.6.1"
1120-
lcov-parse "0.0.10"
1121-
log-driver "1.2.5"
1122-
minimist "1.2.0"
1123-
request "2.79.0"
1115+
js-yaml "^3.6.1"
1116+
lcov-parse "^0.0.10"
1117+
log-driver "^1.2.5"
1118+
minimist "^1.2.0"
1119+
request "^2.79.0"
11241120

11251121
create-ecdh@^4.0.0:
11261122
version "4.0.0"
@@ -1765,16 +1761,6 @@ gauge@~2.7.3:
17651761
strip-ansi "^3.0.1"
17661762
wide-align "^1.1.0"
17671763

1768-
generate-function@^2.0.0:
1769-
version "2.0.0"
1770-
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
1771-
1772-
generate-object-property@^1.1.0:
1773-
version "1.2.0"
1774-
resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
1775-
dependencies:
1776-
is-property "^1.0.0"
1777-
17781764
get-caller-file@^1.0.1:
17791765
version "1.0.2"
17801766
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:
18471833
version "1.0.5"
18481834
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
18491835

1850-
har-validator@~2.0.6:
1851-
version "2.0.6"
1852-
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
1853-
dependencies:
1854-
chalk "^1.1.1"
1855-
commander "^2.9.0"
1856-
is-my-json-valid "^2.12.4"
1857-
pinkie-promise "^2.0.0"
1858-
18591836
har-validator@~4.2.1:
18601837
version "4.2.1"
18611838
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
@@ -2041,9 +2018,9 @@ invariant@^2.2.2:
20412018
dependencies:
20422019
loose-envify "^1.0.0"
20432020

2044-
2045-
version "4.5.1"
2046-
resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.5.1.tgz#2f8a249e1fc5346e4f28b4b86dfae5af1b673178"
2021+
2022+
version "4.5.2"
2023+
resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.5.2.tgz#f2478fd140f398836b2e1fee839f37588f1e6a9b"
20472024

20482025
invert-kv@^1.0.0:
20492026
version "1.0.0"
@@ -2137,15 +2114,6 @@ is-glob@^2.0.0, is-glob@^2.0.1:
21372114
dependencies:
21382115
is-extglob "^1.0.0"
21392116

2140-
is-my-json-valid@^2.12.4:
2141-
version "2.16.1"
2142-
resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11"
2143-
dependencies:
2144-
generate-function "^2.0.0"
2145-
generate-object-property "^1.1.0"
2146-
jsonpointer "^4.0.0"
2147-
xtend "^4.0.0"
2148-
21492117
is-number@^2.1.0:
21502118
version "2.1.0"
21512119
resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -2182,10 +2150,6 @@ is-promise@^2.1.0:
21822150
version "2.1.0"
21832151
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
21842152

2185-
is-property@^1.0.0:
2186-
version "1.0.2"
2187-
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
2188-
21892153
is-stream@^1.0.1, is-stream@^1.1.0:
21902154
version "1.1.0"
21912155
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:
23042268
version "3.0.2"
23052269
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
23062270

2307-
js-yaml@3.6.1, js-yaml@3.x:
2271+
23082272
version "3.6.1"
23092273
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30"
23102274
dependencies:
23112275
argparse "^1.0.7"
23122276
esprima "^2.6.0"
23132277

2314-
js-yaml@^3.7.0:
2278+
js-yaml@^3.6.1, js-yaml@^3.7.0:
23152279
version "3.10.0"
23162280
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
23172281
dependencies:
@@ -2364,10 +2328,6 @@ jsonify@~0.0.0:
23642328
version "0.0.0"
23652329
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
23662330

2367-
jsonpointer@^4.0.0:
2368-
version "4.0.1"
2369-
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
2370-
23712331
jsprim@^1.2.2:
23722332
version "1.4.1"
23732333
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -2417,7 +2377,7 @@ lcid@^1.0.0:
24172377
dependencies:
24182378
invert-kv "^1.0.0"
24192379

2420-
2380+
lcov-parse@^0.0.10:
24212381
version "0.0.10"
24222382
resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3"
24232383

@@ -2471,7 +2431,7 @@ lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0:
24712431
version "4.17.4"
24722432
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
24732433

2474-
2434+
log-driver@^1.2.5:
24752435
version "1.2.5"
24762436
resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056"
24772437

@@ -3111,10 +3071,6 @@ punycode@^1.2.4, punycode@^1.4.1:
31113071
version "1.4.1"
31123072
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
31133073

3114-
qs@~6.3.0:
3115-
version "6.3.2"
3116-
resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
3117-
31183074
qs@~6.4.0:
31193075
version "6.4.0"
31203076
resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
@@ -3264,32 +3220,7 @@ repeating@^2.0.0:
32643220
dependencies:
32653221
is-finite "^1.0.0"
32663222

3267-
3268-
version "2.79.0"
3269-
resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
3270-
dependencies:
3271-
aws-sign2 "~0.6.0"
3272-
aws4 "^1.2.1"
3273-
caseless "~0.11.0"
3274-
combined-stream "~1.0.5"
3275-
extend "~3.0.0"
3276-
forever-agent "~0.6.1"
3277-
form-data "~2.1.1"
3278-
har-validator "~2.0.6"
3279-
hawk "~3.1.3"
3280-
http-signature "~1.1.0"
3281-
is-typedarray "~1.0.0"
3282-
isstream "~0.1.2"
3283-
json-stringify-safe "~5.0.1"
3284-
mime-types "~2.1.7"
3285-
oauth-sign "~0.8.1"
3286-
qs "~6.3.0"
3287-
stringstream "~0.0.4"
3288-
tough-cookie "~2.3.0"
3289-
tunnel-agent "~0.4.1"
3290-
uuid "^3.0.0"
3291-
3292-
3223+
[email protected], request@^2.79.0:
32933224
version "2.81.0"
32943225
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
32953226
dependencies:
@@ -3869,10 +3800,6 @@ tunnel-agent@^0.6.0:
38693800
dependencies:
38703801
safe-buffer "^5.0.1"
38713802

3872-
tunnel-agent@~0.4.1:
3873-
version "0.4.3"
3874-
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
3875-
38763803
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
38773804
version "0.14.5"
38783805
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"

0 commit comments

Comments
 (0)