反混淆Javascript - 如何替换随机变量名?

时间:2017-12-16 23:40:18

标签: javascript deobfuscation

所以我正在解决使用一些javascript代码去混淆的问题并使用www.jsbeautifier.org我已经得到了我的代码。是否可以进行搜索并替换某种或其他方法的查询以将随机变量名称替换为此实际内容,例如:

O7 = "string";
o9 = "test";    
function o9(O7) {
       .... etc
    }

function test(string) {
    ...... etc.
}

由于

1 个答案:

答案 0 :(得分:1)

你不能在纯正则表达式或语言不可知的情况下这样做,只是因为你不能使用条件替换(或替换)。这意味着您无法执行以下操作:

  • b(a)?,并说:if a is empty, then replace the whole match to "c"; otherwise, to "d".

为什么有用?继续阅读,看看我们将使用什么来匹配正确的文本。

目前,一些正则表达式口味允许您使用不同的变量'在替换文本中  (例如:$n$'$&$` ...) - 请查看Substitutions in Regular Expressions

但是,假设您使用 Javascript对Javascript代码进行反欺骗,那么您正在搜索的正则表达式是:

/"[^"]*"|'[^']*'|\/\*[\s\S]*?\*\/|\/\/.*$|\b(<text>)\b/mg

解释

如果您在Regex101中使用它,您会发现它与\b<text>\b相同,任何其他评论
/* foo */// bar)以及任何其他引用文字("baz"'qux'),这实际上是预期的。正则表达式的前两部分将负责匹配任何字符串:

  • "[^"]*" - 匹配:"..."
  • '[^']*' - 匹配:'...'

这没关系,因为我们想要排除替换变量的可能性&#39;如果它实际上在字符串内。
然后第三个,负责多行注释,第四个(正常注释)部分应该这样工作:

  • \/\*[\s\S]*?\*\/ - 匹配:/*...*/
  • \/\/.*$ - 匹配://...直到换行

现在,我们要搜索的文字只能与正则表达式匹配,但也会捕获。看看最后一部分:

  • \b(<text>)\b - 捕获 <text>(之前未被捕获过的那些)。

现在,在我们的脚本中,我们可以简单地匹配所需输入的所有匹配项,并在我们的代码检测到组1($1)不为空时替换为输出。

结果(TL; DR)

function deobfuscate(code, from, to){
    var re = RegExp('"[^"]*"|\'[^\']*\'|\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*$|\\b('+ from +')\\b', 'gm');
    return code.replace(re, function(match, g1) { return (g1) ? to:match; });
}

使用该功能,您可以执行所需的操作,例如,解析:

O7 = "string";
o9 = "test";    
function o9(O7) { ...

并在开始时检索<toFind> = <toReplace>,然后使用它(在循环内或其他内容),如下所示:

code = deobfuscate(code, toFind[i], toReplace[i]);

工作示例

&#13;
&#13;
/* Textarea & Inputs' DOMs */
var code = document.getElementById("code");
var from = document.getElementById("from");
var to = document.getElementById("to");
code.placeholder = "Code goes here...";
from.placeholder = "From";
to.placeholder = "To";

/* Example Values */
code.value = "Example:			//Switch(?):\n"+
"function o9(o9) {		//true, true\n"+
"	o9 = 'o9';  		//true, false\n"+
"	/*\n"+
"		o9		//false\n"+
"	*/\n"+
"	var test = o9+\"o9\"+o9;	//true, false, true\n"+
"	return o9;	//o9	//true, false\n"+
"}\n";
from.value = "o9";
to.value = "ok";

/* Called onclick action */
function doStuff(){
    code.value = deobfuscate(code.value, from.value, to.value);
}

function deobfuscate(code, from, to){
    var re = RegExp('"[^"]*"|\'[^\']*\'|\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*$|\\b('+ from +')\\b', 'gm');
    return code.replace(re, function(match, g1) { return (g1) ? to:match; });
}
&#13;
<html>
<body>
  <textarea id="code" rows="10" cols="55"></textarea> <br>
  <input id="from"/> &rarr; <input id="to"/>          <br><br>
  <button onclick="doStuff()">Deobfuscate</button>
</body>
</html>
&#13;
&#13;
&#13;

OBS

由于你的问题不够明确,我无法告诉你在寻找什么,很多是可能的。例如,它应该在代码中搜索随机变量然后全部替换它吗?这需要一个单词字典,所以不会真正反混淆代码,因为必须指定输入和输出。如果您认为我遗失了某些内容,请将其添加到评论部分。