2016-04-01 15 views
0

我需要使用十六進制編碼對JavaScript字符串進行調整(混淆)。如何使用十六進制轉義調整JavaScript字符串?

的源代碼:

var a = 'a'; 

受損代碼:

var a = '\x61'; 

這是很容易的字符串轉換爲十六進制值:

var map = { 
    '\b': '\\b', 
    '\f': '\\f', 
    '\n': '\\n', 
    '\r': '\\r', 
    '\t': '\\t', 
}; 

var hex = function (str) { 
    var result = ''; 
    for (var i = 0, l = str.length; i < l; i++) { 
     var char = str[i]; 
     if (map[char]) { 
      result += map[char]; 
     } else if ('\\' == char) { 
      result += '\\' + str[++i]; 
     } else { 
      result += '\\x' + str.charCodeAt(i).toString(16); 
     } 
    } 
    return result; 
}; 

但當我這個字符串添加到輸出文件我得到:

var a = '\\x61'; 

P.S.我使用esprima/escodegen/estraverse與AST一起工作。

+0

請參閱如何將字符串轉換在這裏:http://stackoverflow.com/questions/21647928/javascript-unicode-string-to -hex –

+0

注意'\ x ??'是一個單字節字符,而'\ u ????'是一個unicode字符。使用後者可能更安全。 –

+0

這個版本可能更接近你所需要的:https://gist.github.com/mathiasbynens/1243213 –

回答

1

下面是執行的基礎上Качалов Тимофей的解決方案的草案:

var esprima = require('esprima'); 
var estraverse = require('estraverse'); 
var escodegen = require('escodegen'); 

function stringToUnicode(string) { 
    return '"' + string.replace(/[\s\S]/g, function (escape) { 
     return '\\u' + ('0000' + escape.charCodeAt().toString(16)).slice(-4); 
    }) + '"'; 
} 

var tree = esprima.parse(code); 
//... 
estraverse.replace(tree, { 
    leave: function(node){ 
     if (node.type === 'Literal' && (node.raw[0] === '"' || node.raw[0] === '\'')){ 
      node['x-verbatim-property'] = { 
       content : stringToUnicode(node.value), 
       precedence: escodegen.Precedence.Primary 
      }; 
     } 
    } 
}); 
//... 
var result = escodegen.generate(tree, {verbatim: 'x-verbatim-property'});  
相關問題