一、JavaScript反混淆工具
当我们从其他来源获取的JavaScript代码非常复杂且混淆时,我们可能需要反混淆它们以便更好地理解和修改。JavaScript反混淆工具可帮助我们自动化这个过程。
以下是一个基于JavaScript的反混淆工具示例:
// 将带有多个$$、 _0x、_0X 开头变量名的 JavaScript 代码反混淆
function deobfuscate(code) {
return code.replace(/\$\$(\w+)\['(\w+)'](\(\))?\['(\w+)'](\(\))?/g, function(full, c1, c2, p1, c3, p2) {
let name = c2;
if (c3) {
name += c3;
}
return `${name}`;
}).replace(/(_0x\w{4,6})\[(\d+)\]/g, function(full, c1, c2) {
const index = parseInt(c2, 10);
const charCode = parseInt(c1, 16) - index;
return String.fromCharCode(charCode);
}).replace(/_0X(\w+)/g, function(full, c1) {
return String.fromCharCode(parseInt(c1, 16));
});
}
以上代码可以将JavaScript代码中的多个$$、 _0x、_0X 开头的变量名反混淆成易于理解的名称。
二、JavaScript反混淆工具解密
当JavaScript代码被混淆后,可能会出现eval()和Function()等函数代码,这些代码很难直接理解。
以下是一个用于反混淆JavaScript中eval代码的示例:
function decryptEval(input) {
let result = '';
for(let i = 0; i < input.length; i += 2){
result += String.fromCharCode(parseInt(input.substr(i, 2), 16));
}
return result;
}
这段代码将16进制字符转换为字符,以便更容易地读取JavaScript eval()评估函数代码中的内容。
三、JavaScript反混淆App
有很多开发人员设计了一些应用程序以处理混淆的JavaScript代码。
以下是一个名为“JavaScript混淆”的Android App例子:
public class JavaScriptObfuscator {
public static String deobfuscate(String code) {
String deobfuscatedCode = JavascriptObfuscator.restore(code);
deobfuscatedCode = JavascriptObfuscator.replaceCharCodes(deobfuscatedCode);
deobfuscatedCode = JavascriptObfuscator.replaceStrings(deobfuscatedCode);
deobfuscatedCode = JavascriptObfuscator.restorePropertyAccess(deobfuscatedCode);
deobfuscatedCode = JavascriptObfuscator.restoreIdentifiers(deobfuscatedCode);
return deobfuscatedCode;
}
// Reverse the first stage of obfuscation (converts Js+Symbol obfuscation to standard JavaScript)
private static String restore(String s) {/*...*/}
private static String replaceStrings(String s) {/*...*/}
private static String replaceCharCodes(String s) {/*...*/}
private static String restorePropertyAccess(String s) {/*...*/}
private static String restoreIdentifiers(String s) {/*...*/}
}
这个App采用多种技术来反混淆JavaScript代码,包括还原字符串、字符转换等。
四、JavaScript反混淆还原工具
当我们需要通过混淆的JavaScript代码重构应用程序时,反混淆还原工具就特别有用了。
以下是一个基于俄语的JavaScript反混淆还原工具示例:
var f$ = function (a$) {
a$ = a$.replace(/\s+/g, "");
return [a$.slice(0, a$.length / 2), a$.slice(a$.length / 2)]
}
该代码将字符串拆分成两个部分。应用程序可以使用此工具来还原并解码被混淆的JavaScript代码。
五、JavaScript反混淆 Node.js
Node.js是一组基于Chrome V8引擎的JavaScript运行时。Node.js可以用于服务器端编程,同时也支持在命令行窗口中执行JavaScript命令。
以下是一个基于Node.js的反混淆代码的示例:
var vm = require('vm');
var script = new vm.Script('p\x72i\x6et(\x22Hel\x6co Wor\x6cd!\x22);');
script.runInThisContext();
这段代码实现了将混淆代码还原为可读的字符串的效果。可以在Node.js环境中运行。
六、JavaScript反混淆滑块验证
在现代网站中,滑块验证用于防止机器人攻击。使用反混淆技术,可以更容易地突破这种验证。
以下是一个基于JavaScript的反混淆滑块验证示例:
function decodeSliderPos(input) {
const result = [];
for (let i = 0; i < input.length; i += 2) {
const pos = parseInt(input.substr(i, 2), 16) ^ 9;
result.push(pos);
}
return result;
}
这个函数用于解码滑块验证的位置信息,并将它们还原为可读的字符串。
七、代码反混淆
反混淆不仅仅适用于JavaScript代码,也适用于其他编程语言的代码。以下示例展示了如何在使用Java编写的应用程序中反混淆代码:
public class JavaCodeDeobfuscator {
private int getIndex(String str) {
int index = 0;
for (int i = 0; i < str.length(); i++) {
index += str.charAt(i);
}
return index % 10;
}
public String deobfuscate(String code) {
String[] tokens = code.split("\\s+");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i];
int index = getIndex(token);
char c = (char) (token.charAt(0) - index);
sb.append(c);
if (token.length() > 1) {
sb.append(token.substring(1));
}
sb.append(' ');
}
return sb.toString();
}
}
此代码将文字代码反混淆为易于理解的名称。