MDecoder
MDecoder 0.56
0.56更新:
1、优化体验,解决部分界面卡的问题
下载地址:
http://www.mtian.net/down/MDecoder.zip
http://log.mtian.net/MDecoder.zip
MDecoder 0.55
0.55更新:
1、增加对Dadong’s JSXX的解密。
2、右键增加插入菜单,用户可手动插入URL。
3、Log按钮点击后增加提示。
下载地址:
http://www.mtian.net/down/MDecoder.zip
http://log.mtian.net/MDecoder.zip
闲扯:
努力学习ing
MDecoder 0.54
0.54更新:
1、base62(eval(function(p,a,c,k,e 那种)改用算法解密。
2、解决去除CSS误报中一个小BUG。
3、界面上的链接改用默认浏览器打开。
0.53更新:
1、解决误报CSS为EXE的问题。
2、解决几个小问题。
0.52更新:
1、修正几个小BUG,优化用户体验。
2、提高对流行网页木马利用漏洞的识别率。
下载地址:
http://mtian.net/down/MDecoder.zip
http://log.mtian.net/MDecoder.zip
闲扯:
加牛加牛
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>
mdecoder中轻微的资源泄漏
MDecoder中为了能够方便的进行一些复杂加密方法的解密和hookeavl、hookdocument.write而嵌入了google的javascrip引擎v8。可是由于对于v8的垃圾收集机制理解的并不好,简单的Context::New()和Dispose(),并没有添加额外的资源控制代码,照成mdecoder有轻微的资源泄漏,虽然对于这么一个小工具来说,就算一直开着分析几十个网站来说不会有什么影响,可是如果把解密代码移植到其他需要大量解密的程序中来说就会有些影响了。最近几天查了下v8用户的邮件列表,并且简单的跟了下v8中对于context的代码。可是由于英语不咋地,邮件列表也就看了个半通不通,邮件列表中有个人说由于v8是针对chrome来写的,所以有些地方时让人很不方便,他个人为了控制资源的使用而添加了大量额外的代码,OMG,偶不过是一个小菜,哪里能添加控制的代码。跟了下Context::New()和Dispose()的代码,可是new的时候比较复杂,不是俺这种小菜一时半会能看懂的,dispose的倒是比较简单,可是不知道new里面的东东根本没用啊。
暂时就这么滴吧。等啃完《python源码剖析》这本书后再去学习v8吧。
近期评论
- mtian 发表在《JScript.Encode的解密》
- Demon 发表在《JScript.Encode的解密》
- mtian 发表在《base62的解码分析》
- Charles 发表在《base62的解码分析》
- 南瓜 发表在《迅雷客户端漏洞三个》