Skip to content

Instantly share code, notes, and snippets.

@orlv
Created May 29, 2019 17:00
Show Gist options
  • Select an option

  • Save orlv/dd62ded8a6478fef3de299def4d16b54 to your computer and use it in GitHub Desktop.

Select an option

Save orlv/dd62ded8a6478fef3de299def4d16b54 to your computer and use it in GitHub Desktop.
#!/usr/bin/env node
const fs = require('fs')
const path = require('path')
const ArgumentParser = require('argparse').ArgumentParser
const sourceMap = require('source-map')
const parser = new ArgumentParser({
addHelp: true,
description: 'Deobfuscate JavaScript code using a source map',
})
parser.addArgument(['src-js'], { help: 'Path to javascript file to recover', nargs: 1 })
parser.addArgument(['out-dir'], { help: 'Path to directory where sources will be dumped', nargs: 1 })
const args = parser.parseArgs()
const code = fs.readFileSync(args['src-js'][0], 'utf8')
const mapData = fs.readFileSync(`${args['src-js'][0]}.map`, 'utf8')
const map = new sourceMap.SourceMapConsumer(mapData)
const outDir = args['out-dir'][0]
if (!fs.existsSync(outDir)) {
fs.mkdirSync(outDir, { recursive: true })
}
for (let i = 0; i < map.sources.length; i++) {
const sUrl = map.sources[i]
const dest = outDir + '/' + sUrl
const contents = map.sourceContentFor(sUrl)
console.log('Writing', sUrl)
const dirname = path.dirname(dest)
if (!fs.existsSync(dirname)) {
fs.mkdirSync(dirname, { recursive: true })
}
fs.writeFileSync(dest, contents, 'utf8', 0o644)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment