将混淆的Javascript代码还原为可读状态

33

我很抱歉要在这里提出这个问题,在学习JS代码混淆时,我对我的代码进行了编码,然后覆盖了原始代码,而没有进行任何备份 :) 以下是我的混淆后的代码。

var _0xf17f=["\x28","\x29","\x64\x69\x76","\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74","\x69\x64","\x53\x74\x75\x64\x65\x6E\x74\x5F\x6E\x61\x6D\x65","\x73\x74\x75\x64\x65\x6E\x74\x5F\x64\x6F\x62","\x3C\x62\x3E\x49\x44\x3A\x3C\x2F\x62\x3E","\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x6C\x65\x61\x72\x6E\x69\x6E\x67\x79\x69\x69\x2F\x69\x6E\x64\x65\x78\x2E\x70\x68\x70\x3F\x72\x3D\x73\x74\x75\x64\x65\x6E\x74\x2F\x76\x69\x65\x77\x26\x61\x6D\x70\x3B\x20\x69\x64\x3D","\x22\x3E","\x3C\x2F\x61\x3E","\x3C\x62\x72\x2F\x3E","\x3C\x62\x3E\x53\x74\x75\x64\x65\x6E\x74\x20\x4E\x61\x6D\x65\x3A\x3C\x2F\x62\x3E","\x3C\x62\x3E\x53\x74\x75\x64\x65\x6E\x74\x20\x44\x4F\x42\x3A\x3C\x2F\x62\x3E","\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C","\x63\x6C\x61\x73\x73","\x76\x69\x65\x77","\x73\x65\x74\x41\x74\x74\x72\x69\x62\x75\x74\x65","\x70\x72\x65\x70\x65\x6E\x64","\x2E\x69\x74\x65\x6D\x73","\x66\x69\x6E\x64","\x23\x53\x74\x75\x64\x65\x6E\x74\x47\x72\x69\x64\x56\x69\x65\x77\x49\x64"];function call_func(_0x41dcx2){var _0x41dcx3=eval(_0xf17f[0]+_0x41dcx2+_0xf17f[1]);var _0x41dcx4=document[_0xf17f[3]](_0xf17f[2]);var _0x41dcx5=_0x41dcx3[_0xf17f[4]];var _0x41dcx6=_0x41dcx3[_0xf17f[5]];var _0x41dcx7=_0x41dcx3[_0xf17f[6]];var _0x41dcx8=_0xf17f[7];_0x41dcx8+=_0xf17f[8]+_0x41dcx5+_0xf17f[9]+_0x41dcx5+_0xf17f[10];_0x41dcx8+=_0xf17f[11];_0x41dcx8+=_0xf17f[12];_0x41dcx8+=_0x41dcx6;_0x41dcx8+=_0xf17f[11];_0x41dcx8+=_0xf17f[13];_0x41dcx8+=_0x41dcx7;_0x41dcx8+=_0xf17f[11];_0x41dcx4[_0xf17f[14]]=_0x41dcx8;_0x41dcx4[_0xf17f[17]](_0xf17f[15],_0xf17f[16]);$(_0xf17f[21])[_0xf17f[20]](_0xf17f[19])[_0xf17f[18]](_0x41dcx4);} ;

有人能引导我获取URL或者任何方法来使它可读吗?我是从这个网站做的,他们似乎提供了唯一的一种混淆服务,这是我在学习期间测试用的代码,如果有人能帮帮我就太感激了。


14
教训已经吸取,使用版本控制系统(VCS),以便你可以撤销你的错误。 - zzzzBov
我不希望你把这个带到这里。这在SO上有些离题了。(但是作为将来的参考,如果你使用版本控制系统,你就不会陷入这种情况。) - cHao
@jbabey 如果这段代码仅仅是被压缩了,那么这个说法就是正确的,但是看起来它还以某种不明显的方式进行了编码。 - millimoose
1
@millimoose 这是 Latin-1 十六进制编码,只需通过解码器运行即可。就像我说的那样,这是手动的。 - jbabey
2
你好,Dennis,我是你的JS老师。我看到你如何解决你的作业,但在考试中仍然表现得如此糟糕。我们应该重新审视你获得的那个文凭。 - Johan Van Wambeke
显示剩余3条评论
5个回答

52

这里有一个新的自动化工具JSNice,可以尝试去混淆/压缩它。该工具甚至会尝试猜测变量名,这非常酷。 (它从github上挖掘Javascript来实现这个目的。)

页面上的标语是“统计重命名、类型推断和去混淆”。

http://www.jsnice.org


29

rbonito的回答也值得一看:https://dev59.com/-Wcs5IYBdhLWcg3wXSqU#24037080。 - nishanthshanmugham
rbonito的答案也值得一看:https://dev59.com/-Wcs5IYBdhLWcg3wXSqU#24037080。 - nishanthshanmugham

16

这是它:

function call_func(input) {
    var evaled = eval('(' + input + ')');
    var newDiv = document.createElement('div');
    var id = evaled.id;
    var name = evaled.Student_name;
    var dob = evaled.student_dob;
    var html = '<b>ID:</b>';
    html += '<a href="/learningyii/index.php?r=student/view&amp; id=' + id + '">' + id + '</a>';
    html += '<br/>';
    html += '<b>Student Name:</b>';
    html += name;
    html += '<br/>';
    html += '<b>Student DOB:</b>';
    html += dob;
    html += '<br/>';
    newDiv.innerHTML = html;
    newDiv.setAttribute('class', 'view');
    $('#StudentGridViewId').find('.items').prepend(newDiv);
};

1
你是怎么解码的?我也不小心用混淆代码替换了我的原始代码。 - Saurabh Sharma
1
就像其他答案提到的那样,jsnice或jsbeautifier。然后我研究了它,弄清楚它在做什么,并重新命名了变量。 - Trevor Dixon
哇,@TrevorDixon,你是在哪里学习解码混淆的?能给我一个链接吗? - Rohman HM
嗨,@Trevor Dixon,我在哪里联系你做工作? - Marcial Cahuaya
@MarzCT 我给你发了一封电子邮件。 - Trevor Dixon

1

从谷歌上的第一个链接;

function call_func(_0x41dcx2) {
 var _0x41dcx3 = eval('(' + _0x41dcx2 + ')');
 var _0x41dcx4 = document['createElement']('div');
 var _0x41dcx5 = _0x41dcx3['id'];
 var _0x41dcx6 = _0x41dcx3['Student_name'];
 var _0x41dcx7 = _0x41dcx3['student_dob'];
 var _0x41dcx8 = '<b>ID:</b>';
 _0x41dcx8 += '<a href="/learningyii/index.php?r=student/view&amp; id=' + _0x41dcx5 + '">' + _0x41dcx5 + '</a>';
 _0x41dcx8 += '<br/>';
 _0x41dcx8 += '<b>Student Name:</b>';
 _0x41dcx8 += _0x41dcx6;
 _0x41dcx8 += '<br/>';
 _0x41dcx8 += '<b>Student DOB:</b>';
 _0x41dcx8 += _0x41dcx7;
 _0x41dcx8 += '<br/>';
 _0x41dcx4['innerHTML'] = _0x41dcx8;
 _0x41dcx4['setAttribute']('class', 'view');
 $('#StudentGridViewId')['find']('.items')['prepend'](_0x41dcx4);
};

它不能完全带你回到源头,这实际上是不可能的,但它可以帮助你摆脱困境。


你是怎么做到的?我在谷歌上找不到这个第一个链接。我尝试了谷歌上的所有链接和程序,但你的反混淆更好。它用值替换了数组索引!这是自动反混淆吗? - traxium

-2

我尝试了在线的jsbeautifier(jsbeautifier, jsnice)两种工具,这些工具给我提供了漂亮的js代码,

但是对于非常大的js文件,无法复制(可能是一个bug,当我复制时,复制缓冲区只包含一个字符“-”)。

我发现唯一可行的解决方案是prettyjs:

http://www.thaoh.net/prettyjs/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接