Skip to content

Commit 985d5e9

Browse files
authored
Merge pull request javascript-obfuscator#310 from javascript-obfuscator/function-obfuscation-bugs
Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/…
2 parents 6e569be + df4ac27 commit 985d5e9

File tree

9 files changed

+99
-27
lines changed

9 files changed

+99
-27
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Change Log
33
v0.18.0
44
---
55
* **New option:** `reservedStrings` disables transformation of string literals, which being matched by passed RegExp patterns
6+
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/307
67

78
v0.17.3
89
---

dist/index.browser.js

Lines changed: 16 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.cli.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.

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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "javascript-obfuscator",
3-
"version": "0.18.0-dev.2",
3+
"version": "0.18.0-dev.3",
44
"description": "JavaScript obfuscator",
55
"keywords": [
66
"obfuscator",

src/node-transformers/obfuscating-transformers/FunctionTransformer.ts

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,26 @@ export class FunctionTransformer extends AbstractNodeTransformer {
5555

5656
/**
5757
* @param {Node} node
58+
* @param {Node} parentNode
5859
* @returns {boolean}
5960
*/
60-
private static isProhibitedPropertyNode (node: ESTree.Node): node is ESTree.Property & {key: ESTree.Identifier} {
61+
private static isProhibitedIdentifierOfPropertyNode (
62+
node: ESTree.Node,
63+
parentNode: ESTree.Node | null
64+
): node is ESTree.Identifier {
65+
return NodeGuards.isIdentifierNode(node)
66+
&& !!parentNode
67+
&& NodeGuards.isPropertyNode(parentNode)
68+
&& parentNode.key === node;
69+
}
70+
71+
/**
72+
* @param {Node} node
73+
* @returns {boolean}
74+
*/
75+
private static isProhibitedIdentifierOfShorthandPropertyNode (
76+
node: ESTree.Node,
77+
): node is ESTree.Property & {key: ESTree.Identifier} {
6178
return NodeGuards.isPropertyNode(node)
6279
&& node.shorthand
6380
&& NodeGuards.isIdentifierNode(node.key);
@@ -109,9 +126,11 @@ export class FunctionTransformer extends AbstractNodeTransformer {
109126
functionNode.params
110127
.forEach((paramsNode: ESTree.Node) => {
111128
estraverse.traverse(paramsNode, {
112-
enter: (node: ESTree.Node): estraverse.VisitorOption | void => {
113-
if (FunctionTransformer.isProhibitedPropertyNode(node)) {
114-
return estraverse.VisitorOption.Skip;
129+
enter: (node: ESTree.Node, parentNode: ESTree.Node | null): estraverse.VisitorOption | void => {
130+
// Should check with identifier as first argument,
131+
// because prohibited identifier can be easily ignored
132+
if (FunctionTransformer.isProhibitedIdentifierOfPropertyNode(node, parentNode)) {
133+
return;
115134
}
116135

117136
if (NodeGuards.isAssignmentPatternNode(node) && NodeGuards.isIdentifierNode(node.left)) {
@@ -150,10 +169,12 @@ export class FunctionTransformer extends AbstractNodeTransformer {
150169
}
151170

152171
/**
153-
* Should to ignore all identifiers that related to shorthand properties
172+
* Should ignore all shorthand `key` identifiers of the `PropertyNode`
154173
*/
155-
if (FunctionTransformer.isProhibitedPropertyNode(node)) {
174+
if (FunctionTransformer.isProhibitedIdentifierOfShorthandPropertyNode(node)) {
156175
ignoredIdentifierNamesSet.add(node.key.name);
176+
177+
return;
157178
}
158179

159180
if (

test/dev/dev.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,13 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
66

77
let obfuscatedCode: string = JavaScriptObfuscator.obfuscate(
88
`
9-
const foo = 1;
10-
[].map(foo=>1).map(bar=>[foo]);
9+
(function(){
10+
function foo ({id}) {
11+
function bar ({id: baz}) {
12+
return id !== baz;
13+
}
14+
}
15+
})();
1116
`,
1217
{
1318
...NO_ADDITIONAL_NODES_PRESET,

test/functional-tests/node-transformers/obfuscating-transformers/function-transformer/FunctionTransformer.spec.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,42 @@ describe('FunctionTransformer', () => {
143143
assert.match(obfuscatedCode, returnRegExp2);
144144
});
145145
});
146+
147+
describe('Variant #4: shorthand property node', () => {
148+
const functionObjectPatternParameterRegExp1: RegExp = /function _0x[a-f0-9]{4,6} *\({id}\) *{/;
149+
const functionObjectPatternParameterRegExp2: RegExp = /function _0x[a-f0-9]{4,6} *\({id: *_0x[a-f0-9]{4,6}}\) *{/;
150+
const consoleLogRegExp: RegExp = /console\['log']\(id\);/;
151+
const returnRegExp: RegExp = /return id *\+ *_0x[a-f0-9]{4,6};/;
152+
153+
let obfuscatedCode: string;
154+
155+
before(() => {
156+
const code: string = readFileAsString(__dirname + '/fixtures/object-pattern-as-parameter-4.js');
157+
158+
obfuscatedCode = JavaScriptObfuscator.obfuscate(
159+
code,
160+
{
161+
...NO_ADDITIONAL_NODES_PRESET
162+
}
163+
).getObfuscatedCode();
164+
});
165+
166+
it('match #1: should transform function parameter object pattern rest identifier', () => {
167+
assert.match(obfuscatedCode, functionObjectPatternParameterRegExp1);
168+
});
169+
170+
it('match #2: should transform function parameter object pattern rest identifier', () => {
171+
assert.match(obfuscatedCode, functionObjectPatternParameterRegExp2);
172+
});
173+
174+
it('match #3: should transform identifier in `console.log` of outer function', () => {
175+
assert.match(obfuscatedCode, consoleLogRegExp);
176+
});
177+
178+
it('match #4: should transform identifier in `ReturnStatement` of inner function', () => {
179+
assert.match(obfuscatedCode, returnRegExp);
180+
});
181+
});
146182
});
147183

148184
describe('assignment pattern as parameter', () => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
(function(){
2+
function foo ({id}) {
3+
console.log(id);
4+
5+
function bar ({id: baz}) {
6+
return id +baz;
7+
}
8+
}
9+
})();

0 commit comments

Comments
 (0)