我正在努力保护我的应用程序代码免遭盗窃。由于大部分内容是用 javascript 编写的,因此我不得不使用许多混淆技术使其难以理解。
我写了一小段代码用于演示目的(不到 20 行),已经被混淆了。我想知道逆向工程有多么容易,还是很难让生活变得一团糟?
这是一个带有代码的演示:
http://jsfiddle.net/0s84pxvc/1/
目标:当您在窗口上触发点击事件时,您能找出警报中的字符串是如何生成的吗?
我正在努力保护我的应用程序代码免遭盗窃。由于大部分内容是用 javascript 编写的,因此我不得不使用许多混淆技术使其难以理解。
我写了一小段代码用于演示目的(不到 20 行),已经被混淆了。我想知道逆向工程有多么容易,还是很难让生活变得一团糟?
这是一个带有代码的演示:
http://jsfiddle.net/0s84pxvc/1/
目标:当您在窗口上触发点击事件时,您能找出警报中的字符串是如何生成的吗?
解决。
解码数组
解码 unicode。使用这样的在线工具,您可以获得
var _0x1b0e=['RNBwL','ScKnC','BdjwA','gjKqY','NLCsj','3|2|1|5|0|4|6','iXTyC','constructor','call','Pvdko','ymXVL','uEdcI','I am obfuscated...','riWLD','click','addEventListener','Handler','bind','PwLbK','jYzDF','ndilm','AYDEt','stateObject','vIaGc','pZYix','yTHkP','NHTVJ','CRKBx','enNxX','I am still ','JEZNs',' hours a day obfuscated!','RBXnA','0|1|3|6|5|2|4','TlFHD','NIHXQ','bKETV','ZvwJA','jTRge','lwamn','xjQhJ','tZgNp','PEeVj','FwPPe','HyevS','ffbgA','uQzhD','hOThG','RDxue','zUlaT','qxKfp','7|0|6|4|8|1|5|2|3','kEOXz','hDbut','DEbtW','EWekr','string','uLpny','OKzxq','NUsPS','xQKWu','while (true) {}','YNeoc','counter','hlebj','vtlYy','FxZTK','pLTxF','GWIKo','MHAff','Vgchj','RVWUv','length','Yplhb','DhPfd','RYVOZ','IJelL','LEBxy','uopuc','JTcvT','emAWc','GNCRi','nnpzO','kFplL','UBabX','leugg','hgMkn','uwEeM','IsYwa','xvqSS','WBYyN','wYbEn','NVOhv','lrXaL','sCqTs','tlBST','QVIIo','RqrUk','oyxkA','UpIwZ','TADqK','KHgQl','lyfsc','LuNwu','xVbVv','OsXCq','ItQkC','uXiDn','QnQvl','GVxah','SofZe','VunRI','wnuof','fUBve','foyFv','DlhfN','7|4|1|0|2|5|8|3|6','lkihY','qOXDh','ErKPA','YtkOE','qwIQA','ywRts','CjQTl','WLHwy','apply','console','split','debug','warn','info','trace','log','error','exception','cBfic','FdtOi','xXeRs','oKaof','return (function() ','tbYvC','{}.constructor("return this")( )','IjtnV','JRoNn','mQiLi','OIhHz','function *\( *\)','Smwjb','\+\+ *(?:_0x(?:[a-f0-9]){4,6}|(?:\b|\d)[a-z0-9]{1,4}(?:\b|\d))','anVxw','init','PBXIl','DedOs','chain','oLLoP','input','PjnEZ','btVNP','zPhfG','WLdDf','Glpfp','IJdqv','WCdVE','gwVJU','IbJVG','ZHHTo','aNucS','cHacR','CEAKU','sSJyA','test','cgpWb','duVJu','zdtWo','PbmnJ','IQbBw','naiWO','QewNf','TpeaO','kDYZL','GJZry','YGCTR','ztBcC','lkDUw','RJjSU','LbegF','gxAQf','BToeI','LsOQW','HyNsS','hUvxa','FrcoK','xaYAI','dxdFC','glyis','fLiNQ','zgXtG','oLHYG','GOzNr','dJbqD','CyyGn','nAaFv','JTpMq','cyOzF','INWzx','wTsIO','EdBey','pfRVT','eOkUT','ophhQ','wuWdq','lPvac','rQIPK','vxJVR','rRYsV','qQKiS','debu','piAiF','gger','PnsCa','action','afbRz','HKuCd','eRGsq','BisqR','KdEkB','gMVsG','XEayW','LPtpl','ErVeQ','EEfQz','jKbtX','xCKWk','wfZEF','GgolG','sBRCc','yNhcf','jVPUr','jOCmP','DjMYX','6|4|7|5|2|0|3|8|1','bmgZk','UFuMD','vrpeE','MbsEY'];
在这里你可以找到“我仍然很困惑......”和另一个字符串,但这只是旗帜的颜色,而不是闪光本身,因为你问的是“你是如何展示它的”。
我可以指向代码底部附近的警报功能,但它太简单了......
工作的关键是2n函数
var _0x2bb4 = function(_0x5c85d8, _0xdd28ab) {
_0x5c85d8 = _0x5c85d8 - 0x0;
var _0xda35ee = _0x1b0e[_0x5c85d8];
return _0xda35ee;
};
可以简化为
var _0x2bb4 = function(index) { return _0x1b0e[index] };
然后我替换_0x1b0e为string_array,所以我得到了
var _0x2bb4 = function(index) {
console.log (index, string_array[index]);
return string_array[index];
};
并将对 _0x2bb4(something) 的每次调用替换为它们的结果。
..在故事的结尾..
第一次调用是在有这段代码的代码末尾完成的
if(
_0x28a0fa[_0x2bb4('0xd2')] (
_0x28a0fa[_0x2bb4('0xec')],
_0x28a0fa[_0x2bb4('0xec')]
)
){
_0x28a0fa[_0x2bb4('0xde')]
(alert,_0x28a0fa[_0x2bb4('0xdf')]);
window[_0x2bb4('0x97')](_0x28a0fa[_0x2bb4('0xe0')],this[_0x2bb4('0x98')][_0x2bb4('0x99')](this));}
if 是 if ( 1 ) 因为正在比较两个相同的字符串并且_0x28a0fa[_0x2bb4('0xde')]( arg1, arg2 ) 是一个简单的
args1(arg2)
正在做
alert (_0x28a0fa["uwEeM"]);
这里_0x28a0fa["uwEeM"]是 _0x2bb4('0x94')该回报率_0x1b0e[0x94],这正是字符串“我仍然obfsuscated”
虽然第二次显示警报是感谢这个
setInterval(function() {
var _0x3d8cab = {};
_0x3d8cab[_0x2bb4('0x91')] = function(_0x2383ea) {
return _0x2383ea();
};
_0x3d8cab[_0x2bb4('0x91')](_0x58c724);
}, 0xfa0);
setInterval(function() {
var _0x3d8cab = {};
_0x3d8cab["Pvdko"] = function(_0x2383ea) {
return _0x2383ea();
};
_0x3d8cab["Pvdko"](_0x58c724);
}, 0xfa0);
setInterval(function() {
what_to_call = function(_0x2383ea) {
return _0x2383ea();
};
what_to_call(_0x58c724);
}, 0xfa0);
setInterval(function() {
what_to_call = function(function_to_call) {
return function_to_call();
};
what_to_call(_0x58c724);
}, 0xfa0);
setInterval(function() {
_0x58c724();
}, 4000);
该函数 _0x58c724();在代码中定义,你可以简单的搜索vy它的名字。
它正在接受一个论点。它就在之前的警报代码前几行
if (_0x3f8146) {
if (_0x28a0fa[_0x2bb4('0xc8')](_0x28a0fa[_0x2bb4('0xe8')], _0x28a0fa[_0x2bb4('0xea')])) {
return ![];
} else {
return _0x3145db;
}
}