对我的 javascript 代码进行反混淆是困难还是容易?

逆向工程 混淆 去混淆 javascript
2021-06-19 11:46:47

我正在努力保护我的应用程序代码免遭盗窃。由于大部分内容是用 javascript 编写的,因此我不得不使用许多混淆技术使其难以理解。

我写了一小段代码用于演示目的(不到 20 行),已经被混淆了。我想知道逆向工程有多么容易,还是很难让生活变得一团糟?

这是一个带有代码的演示:

http://jsfiddle.net/0s84pxvc/1/

目标:当您在窗口上触发点击事件时,您能找出警报中的字符串是如何生成的吗?

1个回答

解决。

  1. 通常js中没有什么是不可能逆转的
  2. 在这种情况下,纯文本中的 'alert' 字符串给了我很大的帮助,因为我只是开始退一步解析函数值。
  3. setInterval 同样的事情,它是纯文本
  4. 这与混淆 PDF 病毒的模式几乎相同,这是一种在内部对广告轮播器进行大量点击的 JS;我以前从未见过这样的另一个样本……这简直太奇怪了,我希望
  5. 要杀死反调试陷阱,只需覆盖调试器功能或在第一次调试器暂停时,只需单击“禁用断点”。请注意,这会导致内存泄漏,大内存泄漏,Chrome 会通过停止递归来保护自己。为了避免这种情况,在暂停时查看堆栈调用列表,获取调用匿名函数时的位置并覆盖它以简单地什么都不做

解码数组

解码 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] };

然后我替换_0x1b0estring_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;
            }
        }