Deobfuscate JS 混淆脚本用于在服务器端执行它
Deobfuscate JS obfuscated script for performing it server-side
如何对 javaScript 代码进行去混淆处理?它是 here(在最后一个脚本标签内)。
基本上我知道它做了什么(混淆表单的 login/password name 属性值并向表单添加一个带有 name='char' 和随机值的隐藏输入,参见相关问题 here).我想解码脚本以了解它如何执行混淆,以便 我可以在服务器端模仿它 (使用 php)。
这个tool无法解码。
我通过评估 hd
对象完成了一些反混淆。我提取了部分代码(用分号 ;
分隔)并对它们进行了评估:
<script>
var hd =~[];
hd={___:++hd,$$$$:(![]+"")[hd],__$:++hd,$_$_:(![]+"")[hd],_$_:++hd,$_$$:({}+"")[hd],$$_$:(hd[hd]+"")[hd],_$$:++hd,$$$_:(!""+"")[hd],$__:++hd,$_$:++hd,$$__:({}+"")[hd],$$_:++hd,$$$:++hd,$___:++hd,$__$:++hd};
hd.$_=(hd.$_=hd+"")[hd.$_$]+(hd._$=hd.$_[hd.__$])+(hd.$$=(hd.$+"")[hd.__$])+((!hd)+"")[hd._$$]+(hd.__=hd.$_[hd.$$_])+(hd.$=(!""+"")[hd.__$])+(hd._=(!""+"")[hd._$_])+hd.$_[hd.$_$]+hd.__+hd._$+hd.$;
hd.$$=hd.$+(!""+"")[hd._$$]+hd.__+hd._+hd.$+hd.$$;
hd.$=(hd.___)[hd.$_][hd.$_];
console.log('hd: ');
console.dir(hd);
console.log('hd length: ' + Object.keys(hd).length);
</script>
您可能会在浏览器控制台中看到它的输出 there。
然而代码的最后一部分,显然是一个调用自身的函数:
hd.$(hd.$(... _+"\"")())();
hd.$
是对象的函数,见图:
但是我不知道怎么解码。
我试图替换对象的所有实例,例如。 hd.$$$$、hd.$_$ 等代码的其余部分,但结果仅类似于 this。不知道如何继续前进。
你的hd
对象构造完成后,没有进行其他变量赋值,只是构造一个大字符串解析成一个函数。
因此,使用生成的 hd
对象,我提取了构建字符串的部分并得到了这个:
"return\"docu5e6t.7et5le5e6t211d('lo716fo25').166e20454='<d163t1le=\"5a2716-botto5:2500\"cla33=\"160ut-72ou0\"><30a6cla33=\"160ut-72ou0-addo6\"><1cla33=\"7l1001co67l1001co6-u3e2\"></1></30a6><160ut1d=\"lo716-u3e26a5e\"t10e=\"te0t\"cla33=\"fo25-co6t2ol\"6a5e=\"01560376e7\"6alue=\"\"0lace0olde2=\"4o716\"></d16><d163t1le=\"5a2716-botto5:2500\"cla33=\"160ut-72ou0\"><30a6cla33=\"160ut-72ou0-addo6\"><1cla33=\"7l1001co67l1001co6-loc3\"></1></30a6><160ut1d=\"lo716-0a337o2d\"t10e=\"0a337o2d\"cla33=\"fo25-co6t2ol\"6a5e=\"1l06010462\"0lace0olde2=\"0a337o2d\">\</d16>\<d16cla33=\"160ut-72ou0\">\<d16cla33=\"c0ec3bo0\">\<label>\<160ut1d=\"lo716-2e5e5be2\"t10e=\"c0ec3bo0\"6a5e=\"2e5e5be2\"6alue=\"1\">2e5e5be25e\</label>\</d16>\</d16>\<d163t1le=\"5a2716-to0:1000\"cla33=\"fo25-72ou0\">\<d16cla33=\"col-35-12co6t2ol3\">\<a1d=\"bt6-lo716\"02ef=\"#\"cla33=\"bt6bt6-3ucce33\">4o716</a>\</d16>\</d16>\<160utt10e=\"01dde6\"6a5e=\"c0a2\"6alue=\"&6ot;\">';$(\"#bt6-lo716\").cl1c3(fu6ct1o6(){6a23e2=$(\"#lo716fo25\").3e21al12e();$.0o3t(\"/0o3t.000\",3e2+\"&0a30=\"+5d5(3e2),fu6ct1o6(){locat1o6.2e0lace(\"/lo77ed.000\");});});\"";
这让我们成功了。但是很多字符都是URI-encoded(\xxx)。我做了一个简单的正则表达式替换来解码这些值:
var raw = "return\"docu5e6t.7et5le5e6t211d('lo716fo25').166e20454='<d163t1le=\"5a2716-botto5:2500\"cla33=\"160ut-72ou0\"><30a6cla33=\"160ut-72ou0-addo6\"><1cla33=\"7l1001co67l1001co6-u3e2\"></1></30a6><160ut1d=\"lo716-u3e26a5e\"t10e=\"te0t\"cla33=\"fo25-co6t2ol\"6a5e=\"01560376e7\"6alue=\"\"0lace0olde2=\"4o716\"></d16><d163t1le=\"5a2716-botto5:2500\"cla33=\"160ut-72ou0\"><30a6cla33=\"160ut-72ou0-addo6\"><1cla33=\"7l1001co67l1001co6-loc3\"></1></30a6><160ut1d=\"lo716-0a337o2d\"t10e=\"0a337o2d\"cla33=\"fo25-co6t2ol\"6a5e=\"1l06010462\"0lace0olde2=\"0a337o2d\">\</d16>\<d16cla33=\"160ut-72ou0\">\<d16cla33=\"c0ec3bo0\">\<label>\<160ut1d=\"lo716-2e5e5be2\"t10e=\"c0ec3bo0\"6a5e=\"2e5e5be2\"6alue=\"1\">2e5e5be25e\</label>\</d16>\</d16>\<d163t1le=\"5a2716-to0:1000\"cla33=\"fo25-72ou0\">\<d16cla33=\"col-35-12co6t2ol3\">\<a1d=\"bt6-lo716\"02ef=\"#\"cla33=\"bt6bt6-3ucce33\">4o716</a>\</d16>\</d16>\<160utt10e=\"01dde6\"6a5e=\"c0a2\"6alue=\"&6ot;\">';$(\"#bt6-lo716\").cl1c3(fu6ct1o6(){6a23e2=$(\"#lo716fo25\").3e21al12e();$.0o3t(\"/0o3t.000\",3e2+\"&0a30=\"+5d5(3e2),fu6ct1o6(){locat1o6.2e0lace(\"/lo77ed.000\");});});\"";
var decoded = raw.replace(/\\d+/g, function(match) {
return window.decodeURIComponent(match);
});
这给了我以下内容(稍作整理和格式化):
document.getElementById('loginform').innerHTML = '
<div style="margin-bottom: 25px" class="input-group">
<span class="input-group-addon">
<i class="glyphicon glyphicon-user"></i>
</span>
<input id="login-username" type="text" class="form-control" name="XqUFp3Gneg" value="" placeholder="Login">
</div>
<div style="margin-bottom: 25px" class="input-group">
<span class="input-group-addon">
<i class="glyphicon glyphicon-lock"></i>
</span>
<input id="login-password" type="password" class="form-control" name="ylHnHqhDV2" placeholder="Password">
</div>
<div class="input-group">
<div class="checkbox">
<label>
<input id="login-remember" type="checkbox" name="remember" value="1">
Remember me
</label>
</div>
</div>
<div style="margin-top:10px" class="form-group">
<div class="col-sm-12 controls">
<a id="btn-login" href="#" class="btn btn-success">Login</a>
</div>
</div>
<input type="hidden" name="char" value="¬">
';
$("#btn-login").click(function(){
var ser = $( "#loginform" ).serialize();
$.post("/post.php",
ser + "&hash=" + md5(ser),
function() { location.replace("/logged.php"); }
);
});
换句话说,它使用 jquery serialize()
序列化表单值,然后创建该序列化值的 md5 散列并将其作为 hash
查询字符串传递给服务器调用.
如何对 javaScript 代码进行去混淆处理?它是 here(在最后一个脚本标签内)。
基本上我知道它做了什么(混淆表单的 login/password name 属性值并向表单添加一个带有 name='char' 和随机值的隐藏输入,参见相关问题 here).我想解码脚本以了解它如何执行混淆,以便 我可以在服务器端模仿它 (使用 php)。
这个tool无法解码。
我通过评估 hd
对象完成了一些反混淆。我提取了部分代码(用分号 ;
分隔)并对它们进行了评估:
<script>
var hd =~[];
hd={___:++hd,$$$$:(![]+"")[hd],__$:++hd,$_$_:(![]+"")[hd],_$_:++hd,$_$$:({}+"")[hd],$$_$:(hd[hd]+"")[hd],_$$:++hd,$$$_:(!""+"")[hd],$__:++hd,$_$:++hd,$$__:({}+"")[hd],$$_:++hd,$$$:++hd,$___:++hd,$__$:++hd};
hd.$_=(hd.$_=hd+"")[hd.$_$]+(hd._$=hd.$_[hd.__$])+(hd.$$=(hd.$+"")[hd.__$])+((!hd)+"")[hd._$$]+(hd.__=hd.$_[hd.$$_])+(hd.$=(!""+"")[hd.__$])+(hd._=(!""+"")[hd._$_])+hd.$_[hd.$_$]+hd.__+hd._$+hd.$;
hd.$$=hd.$+(!""+"")[hd._$$]+hd.__+hd._+hd.$+hd.$$;
hd.$=(hd.___)[hd.$_][hd.$_];
console.log('hd: ');
console.dir(hd);
console.log('hd length: ' + Object.keys(hd).length);
</script>
您可能会在浏览器控制台中看到它的输出 there。
然而代码的最后一部分,显然是一个调用自身的函数:
hd.$(hd.$(... _+"\"")())();
hd.$
是对象的函数,见图:
但是我不知道怎么解码。 我试图替换对象的所有实例,例如。 hd.$$$$、hd.$_$ 等代码的其余部分,但结果仅类似于 this。不知道如何继续前进。
你的hd
对象构造完成后,没有进行其他变量赋值,只是构造一个大字符串解析成一个函数。
因此,使用生成的 hd
对象,我提取了构建字符串的部分并得到了这个:
"return\"docu5e6t.7et5le5e6t211d('lo716fo25').166e20454='<d163t1le=\"5a2716-botto5:2500\"cla33=\"160ut-72ou0\"><30a6cla33=\"160ut-72ou0-addo6\"><1cla33=\"7l1001co67l1001co6-u3e2\"></1></30a6><160ut1d=\"lo716-u3e26a5e\"t10e=\"te0t\"cla33=\"fo25-co6t2ol\"6a5e=\"01560376e7\"6alue=\"\"0lace0olde2=\"4o716\"></d16><d163t1le=\"5a2716-botto5:2500\"cla33=\"160ut-72ou0\"><30a6cla33=\"160ut-72ou0-addo6\"><1cla33=\"7l1001co67l1001co6-loc3\"></1></30a6><160ut1d=\"lo716-0a337o2d\"t10e=\"0a337o2d\"cla33=\"fo25-co6t2ol\"6a5e=\"1l06010462\"0lace0olde2=\"0a337o2d\">\</d16>\<d16cla33=\"160ut-72ou0\">\<d16cla33=\"c0ec3bo0\">\<label>\<160ut1d=\"lo716-2e5e5be2\"t10e=\"c0ec3bo0\"6a5e=\"2e5e5be2\"6alue=\"1\">2e5e5be25e\</label>\</d16>\</d16>\<d163t1le=\"5a2716-to0:1000\"cla33=\"fo25-72ou0\">\<d16cla33=\"col-35-12co6t2ol3\">\<a1d=\"bt6-lo716\"02ef=\"#\"cla33=\"bt6bt6-3ucce33\">4o716</a>\</d16>\</d16>\<160utt10e=\"01dde6\"6a5e=\"c0a2\"6alue=\"&6ot;\">';$(\"#bt6-lo716\").cl1c3(fu6ct1o6(){6a23e2=$(\"#lo716fo25\").3e21al12e();$.0o3t(\"/0o3t.000\",3e2+\"&0a30=\"+5d5(3e2),fu6ct1o6(){locat1o6.2e0lace(\"/lo77ed.000\");});});\"";
这让我们成功了。但是很多字符都是URI-encoded(\xxx)。我做了一个简单的正则表达式替换来解码这些值:
var raw = "return\"docu5e6t.7et5le5e6t211d('lo716fo25').166e20454='<d163t1le=\"5a2716-botto5:2500\"cla33=\"160ut-72ou0\"><30a6cla33=\"160ut-72ou0-addo6\"><1cla33=\"7l1001co67l1001co6-u3e2\"></1></30a6><160ut1d=\"lo716-u3e26a5e\"t10e=\"te0t\"cla33=\"fo25-co6t2ol\"6a5e=\"01560376e7\"6alue=\"\"0lace0olde2=\"4o716\"></d16><d163t1le=\"5a2716-botto5:2500\"cla33=\"160ut-72ou0\"><30a6cla33=\"160ut-72ou0-addo6\"><1cla33=\"7l1001co67l1001co6-loc3\"></1></30a6><160ut1d=\"lo716-0a337o2d\"t10e=\"0a337o2d\"cla33=\"fo25-co6t2ol\"6a5e=\"1l06010462\"0lace0olde2=\"0a337o2d\">\</d16>\<d16cla33=\"160ut-72ou0\">\<d16cla33=\"c0ec3bo0\">\<label>\<160ut1d=\"lo716-2e5e5be2\"t10e=\"c0ec3bo0\"6a5e=\"2e5e5be2\"6alue=\"1\">2e5e5be25e\</label>\</d16>\</d16>\<d163t1le=\"5a2716-to0:1000\"cla33=\"fo25-72ou0\">\<d16cla33=\"col-35-12co6t2ol3\">\<a1d=\"bt6-lo716\"02ef=\"#\"cla33=\"bt6bt6-3ucce33\">4o716</a>\</d16>\</d16>\<160utt10e=\"01dde6\"6a5e=\"c0a2\"6alue=\"&6ot;\">';$(\"#bt6-lo716\").cl1c3(fu6ct1o6(){6a23e2=$(\"#lo716fo25\").3e21al12e();$.0o3t(\"/0o3t.000\",3e2+\"&0a30=\"+5d5(3e2),fu6ct1o6(){locat1o6.2e0lace(\"/lo77ed.000\");});});\"";
var decoded = raw.replace(/\\d+/g, function(match) {
return window.decodeURIComponent(match);
});
这给了我以下内容(稍作整理和格式化):
document.getElementById('loginform').innerHTML = '
<div style="margin-bottom: 25px" class="input-group">
<span class="input-group-addon">
<i class="glyphicon glyphicon-user"></i>
</span>
<input id="login-username" type="text" class="form-control" name="XqUFp3Gneg" value="" placeholder="Login">
</div>
<div style="margin-bottom: 25px" class="input-group">
<span class="input-group-addon">
<i class="glyphicon glyphicon-lock"></i>
</span>
<input id="login-password" type="password" class="form-control" name="ylHnHqhDV2" placeholder="Password">
</div>
<div class="input-group">
<div class="checkbox">
<label>
<input id="login-remember" type="checkbox" name="remember" value="1">
Remember me
</label>
</div>
</div>
<div style="margin-top:10px" class="form-group">
<div class="col-sm-12 controls">
<a id="btn-login" href="#" class="btn btn-success">Login</a>
</div>
</div>
<input type="hidden" name="char" value="¬">
';
$("#btn-login").click(function(){
var ser = $( "#loginform" ).serialize();
$.post("/post.php",
ser + "&hash=" + md5(ser),
function() { location.replace("/logged.php"); }
);
});
换句话说,它使用 jquery serialize()
序列化表单值,然后创建该序列化值的 md5 散列并将其作为 hash
查询字符串传递给服务器调用.