Skip to content

Instantly share code, notes, and snippets.

@Esonhugh
Created December 10, 2024 16:36
Show Gist options
  • Save Esonhugh/9226176939ca972439aaf0a2750d6c6d to your computer and use it in GitHub Desktop.
Save Esonhugh/9226176939ca972439aaf0a2750d6c6d to your computer and use it in GitHub Desktop.
deobf javascript auto rename variable from require import method
var esprima = require("meriyah");
var estraverse = require("estraverse");
var escodegen = require("escodegen");
var fs = require("node:fs");
function basename(path) {
return path.split("/").reverse()[0].split(":").reverse()[0].replace("-", "_");
}
let scope = 0;
let renamingObj = {};
function parse(ast) {
estraverse.traverse(ast, {
enter: function (node) {
if (node.type === "BlockStatement" || node.type === "Program") {
scope++;
}
if (node.type === "VariableDeclaration") {
node.declarations.forEach((value) => {
if (value.init) {
if (
value.init.type == "CallExpression" &&
value.init.callee.name == "require"
) {
if (value.id.type === "ObjectPattern") {
return // don't parse
}
if (value.id.name === undefined) {
console.log("bad_key", escodegen.generate(node));
} else {
renamingObj[value.id.name] = {
scope: scope,
name: basename(value.init.arguments[0].value),
};
value.id.name = basename(value.init.arguments[0].value);
}
}
}
});
}
if (node.type === "Identifier") {
if (renamingObj[node.name] !== undefined) {
node.name = renamingObj[node.name].name;
}
}
},
leave: function (node) {
if (node.type == "Program" || node.type == "BlockStatement") {
scope--;
var nameList = [];
var keys = Object.keys(renamingObj);
keys.forEach((k) => {
if (renamingObj[k].scope > scope) {
nameList.push(k);
}
});
nameList.forEach((k) => {
delete renamingObj[k];
});
}
},
});
return ast;
}
function main() {
if (process.argv.length <= 2) {
// node ./this.js target.js
// generate target.ast target.deobf.js
console.log(`Usage: node ${process.argv[1]} target.js`);
return
}
let file = process.argv[2]
let code = fs.readFileSync(file, "utf8");
let ast = esprima.parse(code);
ast = parse(ast);
console.log("write to ast file");
fs.writeFileSync(`${file}.ast`, JSON.stringify(ast));
// console.log(escodegen.generate(ast));
console.log("generate code ....")
fs.writeFileSync(`${file}.deobf.js`, escodegen.generate(ast, {}));
// console.log(renamingObj);
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment