packer和base62分析

转自:http://51hired.com/questions/14003/packer%E4%B9%8Bbase62%E5%88%86%E6%9E%90

http://blog.mtian.net/tag/base62/

 


 

混淆前:

var db = openDatabase('baby','1.0','Baby Project',2*1024*1024);
$
('#pick_cover').click(function(){
    start_camera
({height:70, width:70, mode:'uri'}, onSucUri);
});
$
('#cancel, #back').click(function(){
    goBack
();
});
$
('#save').click(function(){
   
if(!($('#title').val().length && $('#cover').val().length))
   
{
        alert
("Please input title and pick a cover!");
       
returnfalse;
   
}
    db
.transaction(function(tx){
        tx
.executeSql('CREATE TABLE IF NOT EXISTS diary_book (id INTEGER PRIMARY KEY, title varchar(255), cover varchar(255));');
        tx
.executeSql('INSERT INTO diary_book(title, cover) values(?, ?);',[$('#title').val(), $('#cover').val()],function(transaction, results){
           
if(!results.rowsAffected)
           
{
                alert
("save failed!");
               
returnfalse;
           
}
            alert
("添加成功!");
            goBack
();
       
});
   
},function(err){alert("failed"+ err);});
});

混淆后(可以在这里测试):

eval(function(p, a, c, k, e, r){
    e
=function(c){
       
return(c < a ?'': e(parseInt(c / a)))+((c = c % a)>35?String.fromCharCode(c +29): c.toString(36))
   
};
   
if(!''.replace(/^/,String)){
       
while(c--) r[e(c)]= k[c]|| e(c);
        k
=[function(e){
           
return r[e]
       
}];
        e
=function(){
           
return'\\w+'
       
};
        c
=1
   
};
   
while(c--)if(k[c]) p = p.replace(newRegExp('\\b'+ e(c)+'\\b','g'), k[c]);
   
return p
}('s b=t(\'u\',\'1.0\',\'v w\',2*c*c);$(\'#x\').8(3(){y({z:d,A:d,B:\'C\'},D)});$(\'#E, #F\').8(3(){e()});$(\'#f\').8(3(){g(!($(\'#4\').6().h&&$(\'#5\').6().h)){7("G H 4 I J a 5!");i j}b.k(3(9){9.l(\'K L M N O m (P Q R S, 4 n(o), 5 n(o));\');9.l(\'T U m(4, 5) V(?, ?);\',[$(\'#4\').6(),$(\'#5\').6()],3(k,p){g(!p.W){7("f q!");i j}7("添加成功!");e()})},3(r){7("q"+r)})});',59,59,'|||function|title|cover|val|alert|click|tx||db|1024|70|goBack|save|if|length|return|false|transaction|executeSql|diary_book|varchar|255|results|failed|err|var|openDatabase|baby|Baby|Project|pick_cover|start_camera|height|width|mode|uri|onSucUri|cancel|back|Please|input|and|pick|CREATE|TABLE|IF|NOT|EXISTS|id|INTEGER|PRIMARY|KEY|INSERT|INTO|values|rowsAffected'.split('|'),0,{}))

原理:

类似图形编码的调色板,将程序中的变量首先替换成索引(Positional notation),到运行时再反向替换回去

这里主要分析下eval6个参数:

p是索引化之后的程序,即所有的函数以及变量名都被替换成索引之后的字符串

a是索引的基,这里是62base62因此而来)

c是程序的关键词(/\b\w\b/g再去重可得)总数,这里等于k.length

k是程序的关键词列表

e被当作局部变量使用,在函数内部会被重新赋值

r是索引到原值的哈希表,具体键值对也是在函数内部生成

最后介绍下里面的1个函数:

function(c){
   
return(c < a ?'': e(parseInt(c / a)))+((c = c % a)>35?String.fromCharCode(c +29): c.toString(36))
};

该函数将10进制的c转换为62进制,即[0-9a-zA-Z]

 

--------------------------------------------------------

 

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>

 

posted @ 2012-06-27 10:17  简单-陈勇  阅读(421)  评论(0编辑  收藏  举报