Skip to content

Commit 9e0a60b

Browse files
authored
chore: convert CommonJS to ESM (#129)
* chore: convert common to esm Signed-off-by: echo094 <20028238+echo094@users.noreply.github.com> * chore: stop at uncaught exceptions Signed-off-by: echo094 <20028238+echo094@users.noreply.github.com> --------- Signed-off-by: echo094 <20028238+echo094@users.noreply.github.com>
1 parent 4da4b62 commit 9e0a60b

23 files changed

+138
-114
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"name": "decode-js",
3+
"type": "module",
34
"scripts": {
45
"decode": "node src/main.js",
56
"deob": "node src/main.js -t obfuscator",

src/main.js

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
const fs = require('fs')
2-
const PluginCommon = require('./plugin/common.js')
3-
const PluginJjencode = require('./plugin/jjencode.js')
4-
const PluginSojson = require('./plugin/sojson.js')
5-
const PluginSojsonV7 = require('./plugin/sojsonv7.js')
6-
const PluginObfuscator = require('./plugin/obfuscator.js')
7-
const PluginAwsc = require('./plugin/awsc.js')
1+
import fs from 'fs'
2+
import PluginCommon from './plugin/common.js'
3+
import PluginJjencode from './plugin/jjencode.js'
4+
import PluginSojson from './plugin/sojson.js'
5+
import PluginSojsonV7 from './plugin/sojsonv7.js'
6+
import PluginObfuscator from './plugin/obfuscator.js'
7+
import PluginAwsc from './plugin/awsc.js'
88

99
// 读取参数
1010
let type = 'common'
@@ -25,26 +25,32 @@ console.log(`类型: ${type}`)
2525
console.log(`输入: ${encodeFile}`)
2626
console.log(`输出: ${decodeFile}`)
2727

28-
// 读取源代码
29-
const sourceCode = fs.readFileSync(encodeFile, { encoding: 'utf-8' })
28+
const main = () => {
29+
// 读取源代码
30+
const sourceCode = fs.readFileSync(encodeFile, { encoding: 'utf-8' })
3031

31-
// 净化源代码
32-
let code
33-
if (type === 'sojson') {
34-
code = PluginSojson(sourceCode)
35-
} else if (type === 'sojsonv7') {
36-
code = PluginSojsonV7(sourceCode)
37-
} else if (type === 'obfuscator') {
38-
code = PluginObfuscator(sourceCode)
39-
} else if (type === 'awsc') {
40-
code = PluginAwsc(sourceCode)
41-
} else if (type === 'jjencode') {
42-
code = PluginJjencode(sourceCode)
43-
} else {
44-
code = PluginCommon(sourceCode)
45-
}
32+
// 净化源代码
33+
let code
34+
if (type === 'sojson') {
35+
code = PluginSojson(sourceCode)
36+
} else if (type === 'sojsonv7') {
37+
code = PluginSojsonV7(sourceCode)
38+
} else if (type === 'obfuscator') {
39+
code = PluginObfuscator(sourceCode)
40+
} else if (type === 'awsc') {
41+
code = PluginAwsc(sourceCode)
42+
} else if (type === 'jjencode') {
43+
code = PluginJjencode(sourceCode)
44+
} else {
45+
code = PluginCommon(sourceCode)
46+
}
4647

47-
// 输出代码
48-
if (code) {
49-
fs.writeFile(decodeFile, code, () => {})
48+
// 输出代码
49+
if (code) {
50+
fs.writeFile(decodeFile, code, () => {})
51+
}
5052
}
53+
54+
process.nextTick(async () => {
55+
main()
56+
})

src/plugin/awsc.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
* Reference:
33
* * [某宝登录bx-ua参数逆向思路(fireyejs 225算法)](https://zhuanlan.zhihu.com/p/626187669)
44
*/
5-
const { parse } = require('@babel/parser')
6-
const generator = require('@babel/generator').default
7-
const traverse = require('@babel/traverse').default
8-
const t = require('@babel/types')
5+
import { parse } from '@babel/parser'
6+
import _generate from '@babel/generator'
7+
const generator = _generate.default
8+
import _traverse from '@babel/traverse'
9+
const traverse = _traverse.default
10+
import * as t from '@babel/types'
911

1012
function RemoveVoid(path) {
1113
if (path.node.operator === 'void') {
@@ -204,7 +206,7 @@ function LintBlock(path) {
204206
path.replaceWith(t.blockStatement(arr))
205207
}
206208

207-
module.exports = function (code) {
209+
export default function (code) {
208210
let ast = parse(code)
209211
// Lint
210212
traverse(ast, {

src/plugin/common.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
1-
const { parse } = require('@babel/parser')
2-
const generator = require('@babel/generator').default
3-
const traverse = require('@babel/traverse').default
1+
import { parse } from '@babel/parser'
2+
import _generate from '@babel/generator'
3+
const generator = _generate.default
4+
import _traverse from '@babel/traverse'
5+
const traverse = _traverse.default
6+
import deleteUnreachableCode from '../visitor/delete-unreachable-code.js'
7+
import deleteNestedBlocks from '../visitor/delete-nested-blocks.js'
8+
import calculateConstantExp from '../visitor/calculate-constant-exp.js'
9+
import calculateRString from '../visitor/calculate-rstring.js'
410

5-
module.exports = function (code) {
11+
export default function (code) {
612
let ast
713
try {
814
ast = parse(code, { errorRecovery: true })
915
} catch (e) {
1016
console.error(`Cannot parse code: ${e.reasonCode}`)
1117
return null
1218
}
13-
const deleteUnreachableCode = require('../visitor/delete-unreachable-code')
1419
traverse(ast, deleteUnreachableCode)
15-
const deleteNestedBlocks = require('../visitor/delete-nested-blocks')
1620
traverse(ast, deleteNestedBlocks)
17-
const calculateConstantExp = require('../visitor/calculate-constant-exp')
1821
traverse(ast, calculateConstantExp)
19-
const calculateRString = require('../visitor/calculate-rstring')
2022
traverse(ast, calculateRString)
2123
code = generator(ast).code
2224
return code

src/plugin/eval.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
const { parse } = require('@babel/parser')
2-
const generator = require('@babel/generator').default
3-
const traverse = require('@babel/traverse').default
4-
const t = require('@babel/types')
1+
import { parse } from '@babel/parser'
2+
import _generate from '@babel/generator'
3+
const generator = _generate.default
4+
import _traverse from '@babel/traverse'
5+
const traverse = _traverse.default
6+
import * as t from '@babel/types'
57

68
function unpack(code) {
79
let ast = parse(code, { errorRecovery: true })
@@ -46,7 +48,7 @@ function pack(code) {
4648
return code
4749
}
4850

49-
module.exports = {
51+
export default {
5052
unpack,
5153
pack,
5254
}

src/plugin/jjencode.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ function getCode(code) {
5757
* This encoding method originates from http://utf-8.jp/public/jjencode.html,
5858
* and it does not change the original code (encoder, not obfuscation).
5959
*/
60-
module.exports = function (code) {
60+
export default function (code) {
6161
code = getCode(code)
6262
if (!code) {
6363
return null

src/plugin/obfuscator.js

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,23 @@
33
* * cilame/v_jstools
44
* * Cqxstevexw/decodeObfuscator
55
*/
6-
const { parse } = require('@babel/parser')
7-
const generator = require('@babel/generator').default
8-
const traverse = require('@babel/traverse').default
9-
const t = require('@babel/types')
10-
const ivm = require('isolated-vm')
11-
const PluginEval = require('./eval.js')
12-
const calculateConstantExp = require('../visitor/calculate-constant-exp')
6+
import { parse } from '@babel/parser'
7+
import _generate from '@babel/generator'
8+
const generator = _generate.default
9+
import _traverse from '@babel/traverse'
10+
const traverse = _traverse.default
11+
import * as t from '@babel/types'
12+
import ivm from 'isolated-vm'
13+
import PluginEval from './eval.js'
14+
import calculateConstantExp from '../visitor/calculate-constant-exp.js'
15+
import deleteIllegalReturn from '../visitor/delete-illegal-return.js'
16+
import deleteUnusedVar from '../visitor/delete-unused-var.js'
17+
import lintIfStatement from '../visitor/lint-if-statement.js'
18+
import mergeObject from '../visitor/merge-object.js'
19+
import parseControlFlowStorage from '../visitor/parse-control-flow-storage.js'
20+
import pruneIfBranch from '../visitor/prune-if-branch.js'
21+
import splitSequence from '../visitor/split-sequence.js'
22+
import splitVarDeclaration from '../visitor/split-variable-declaration.js'
1323

1424
const isolate = new ivm.Isolate()
1525
const globalContext = isolate.createContextSync()
@@ -609,10 +619,8 @@ function decodeCodeBlock(ast) {
609619
// 合并字面量
610620
traverse(ast, calculateConstantExp)
611621
// 先合并分离的Object定义
612-
const mergeObject = require('../visitor/merge-object')
613622
traverse(ast, mergeObject)
614623
// 在变量定义完成后判断是否为代码块加密内容
615-
const parseControlFlowStorage = require('../visitor/parse-control-flow-storage')
616624
traverse(ast, parseControlFlowStorage)
617625
// 合并字面量(在解除区域混淆后会出现新的可合并分割)
618626
traverse(ast, calculateConstantExp)
@@ -719,7 +727,6 @@ function cleanSwitchCode(path) {
719727

720728
function cleanDeadCode(ast) {
721729
traverse(ast, calculateConstantExp)
722-
const pruneIfBranch = require('../visitor/prune-if-branch')
723730
traverse(ast, pruneIfBranch)
724731
traverse(ast, { WhileStatement: { exit: cleanSwitchCode } })
725732
return ast
@@ -797,7 +804,6 @@ function purifyCode(ast) {
797804
})
798805
// 删除未使用的变量
799806
traverse(ast, splitVariableDeclarator)
800-
const deleteUnusedVar = require('../visitor/delete-unused-var')
801807
traverse(ast, deleteUnusedVar)
802808
// 替换索引器
803809
function FormatMember(path) {
@@ -844,7 +850,6 @@ function purifyCode(ast) {
844850
})
845851

846852
// 拆分语句
847-
const splitSequence = require('../visitor/split-sequence')
848853
traverse(ast, splitSequence)
849854
return ast
850855
}
@@ -1041,7 +1046,7 @@ function unlockEnv(ast) {
10411046
return ast
10421047
}
10431048

1044-
module.exports = function (code) {
1049+
export default function (code) {
10451050
let ret = PluginEval.unpack(code)
10461051
let global_eval = false
10471052
if (ret) {
@@ -1056,13 +1061,10 @@ module.exports = function (code) {
10561061
return null
10571062
}
10581063
// IllegalReturn
1059-
const deleteIllegalReturn = require('../visitor/delete-illegal-return')
10601064
traverse(ast, deleteIllegalReturn)
10611065
// Lint before split statements
1062-
const lintIfStatement = require('../visitor/lint-if-statement')
10631066
traverse(ast, lintIfStatement)
10641067
// Split declarations to avoid bugs
1065-
const splitVarDeclaration = require('../visitor/split-variable-declaration')
10661068
traverse(ast, splitVarDeclaration)
10671069
// 清理二进制显示内容
10681070
traverse(ast, {

src/plugin/sojson.js

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
/**
22
* 在 babel_asttool.js 的基础上修改而来
33
*/
4-
const { parse } = require('@babel/parser')
5-
const generator = require('@babel/generator').default
6-
const traverse = require('@babel/traverse').default
7-
const t = require('@babel/types')
8-
const ivm = require('isolated-vm')
9-
const PluginEval = require('./eval.js')
10-
const calculateConstantExp = require('../visitor/calculate-constant-exp')
4+
import { parse } from '@babel/parser'
5+
import _generate from '@babel/generator'
6+
const generator = _generate.default
7+
import _traverse from '@babel/traverse'
8+
const traverse = _traverse.default
9+
import * as t from '@babel/types'
10+
import ivm from 'isolated-vm'
11+
import PluginEval from './eval.js'
12+
import calculateConstantExp from '../visitor/calculate-constant-exp.js'
13+
import deleteUnusedVar from '../visitor/delete-unused-var.js'
14+
import parseControlFlowStorage from '../visitor/parse-control-flow-storage.js'
15+
import pruneIfBranch from '../visitor/prune-if-branch.js'
16+
import splitSequence from '../visitor/split-sequence.js'
1117

1218
const isolate = new ivm.Isolate()
1319
const globalContext = isolate.createContextSync()
@@ -166,7 +172,6 @@ function cleanSwitchCode(path) {
166172

167173
function cleanDeadCode(ast) {
168174
traverse(ast, calculateConstantExp)
169-
const pruneIfBranch = require('../visitor/prune-if-branch')
170175
traverse(ast, pruneIfBranch)
171176
traverse(ast, { WhileStatement: { exit: cleanSwitchCode } })
172177
return ast
@@ -469,7 +474,6 @@ function purifyCode(ast) {
469474
}
470475
traverse(ast, { MemberExpression: FormatMember })
471476
// 分割表达式
472-
const splitSequence = require('../visitor/split-sequence')
473477
traverse(ast, splitSequence)
474478
// 删除空语句
475479
traverse(ast, {
@@ -478,12 +482,11 @@ function purifyCode(ast) {
478482
},
479483
})
480484
// 删除未使用的变量
481-
const deleteUnusedVar = require('../visitor/delete-unused-var')
482485
traverse(ast, deleteUnusedVar)
483486
return ast
484487
}
485488

486-
module.exports = function (code) {
489+
export default function (code) {
487490
let ret = PluginEval.unpack(code)
488491
let global_eval = false
489492
if (ret) {
@@ -508,7 +511,6 @@ module.exports = function (code) {
508511
return null
509512
}
510513
console.log('处理代码块加密...')
511-
const parseControlFlowStorage = require('../visitor/parse-control-flow-storage')
512514
traverse(ast, parseControlFlowStorage)
513515
console.log('清理死代码...')
514516
ast = cleanDeadCode(ast)

src/plugin/sojsonv7.js

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
/**
22
* For jsjiami.com.v7
33
*/
4-
const { parse } = require('@babel/parser')
5-
const generator = require('@babel/generator').default
6-
const traverse = require('@babel/traverse').default
7-
const t = require('@babel/types')
8-
const ivm = require('isolated-vm')
9-
const PluginEval = require('./eval.js')
10-
const calculateConstantExp = require('../visitor/calculate-constant-exp')
4+
import { parse } from '@babel/parser'
5+
import _generate from '@babel/generator'
6+
const generator = _generate.default
7+
import _traverse from '@babel/traverse'
8+
const traverse = _traverse.default
9+
import * as t from '@babel/types'
10+
import ivm from 'isolated-vm'
11+
import PluginEval from './eval.js'
12+
import calculateConstantExp from '../visitor/calculate-constant-exp.js'
13+
import deleteIllegalReturn from '../visitor/delete-illegal-return.js'
14+
import deleteUnusedVar from '../visitor/delete-unused-var.js'
15+
import parseControlFlowStorage from '../visitor/parse-control-flow-storage.js'
16+
import pruneIfBranch from '../visitor/prune-if-branch.js'
17+
import splitSequence from '../visitor/split-sequence.js'
1118

1219
const isolate = new ivm.Isolate()
1320
const globalContext = isolate.createContextSync()
@@ -490,7 +497,6 @@ function cleanSwitchCode2(path) {
490497

491498
function cleanDeadCode(ast) {
492499
traverse(ast, calculateConstantExp)
493-
const pruneIfBranch = require('../visitor/prune-if-branch')
494500
traverse(ast, pruneIfBranch)
495501
traverse(ast, { WhileStatement: { exit: cleanSwitchCode1 } })
496502
traverse(ast, { ForStatement: { exit: cleanSwitchCode2 } })
@@ -735,7 +741,6 @@ function purifyCode(ast) {
735741
}
736742
traverse(ast, { MemberExpression: FormatMember })
737743
// 分割表达式
738-
const splitSequence = require('../visitor/split-sequence')
739744
traverse(ast, splitSequence)
740745
// 删除空语句
741746
traverse(ast, {
@@ -744,11 +749,10 @@ function purifyCode(ast) {
744749
},
745750
})
746751
// 删除未使用的变量
747-
const deleteUnusedVar = require('../visitor/delete-unused-var')
748752
traverse(ast, deleteUnusedVar)
749753
}
750754

751-
module.exports = function (code) {
755+
export default function (code) {
752756
let ret = PluginEval.unpack(code)
753757
let global_eval = false
754758
if (ret) {
@@ -763,7 +767,6 @@ module.exports = function (code) {
763767
return null
764768
}
765769
// IllegalReturn
766-
const deleteIllegalReturn = require('../visitor/delete-illegal-return')
767770
traverse(ast, deleteIllegalReturn)
768771
// 清理二进制显示内容
769772
traverse(ast, {
@@ -782,7 +785,6 @@ module.exports = function (code) {
782785
return null
783786
}
784787
console.log('处理代码块加密...')
785-
const parseControlFlowStorage = require('../visitor/parse-control-flow-storage')
786788
traverse(ast, parseControlFlowStorage)
787789
console.log('清理死代码...')
788790
ast = cleanDeadCode(ast)

0 commit comments

Comments
 (0)