Obfuscation

Code Obfuscation

混淆是一种使脚本更难被人类阅读的技术,但从技术角度来看,它仍然能够正常工作,尽管性能可能会降低。这通常是通过使用混淆工具自动实现的,该工具将代码作为输入,并尝试根据代码的设计,以一种更难阅读的方式重写代码。

例如,代码混淆器通常会将代码转换成一个包含代码中使用的所有单词和符号的字典,然后在执行过程中尝试通过引用字典中的每个单词和符号来重建原始代码。以下是一个简单的 JavaScript 代码被混淆的示例:

image.png

Basic Obfuscation

Minifying JavaScript code

压缩 JavaScript 代码片段的可读性同时保持其全部功能的常用方法是 JavaScript 压缩。Code minification 意味着将整个代码放在一行(通常很长)中。

很多工具可以帮助我们压缩 JavaScript 代码,比如javascript-minifier。我们只需复制代码,然后点击Minify,即可在右侧看到压缩后的输出:

image.png

Packing JavaScript code

混淆工具 packer 通常会尝试将代码中的所有单词和符号转换为列表或字典,然后在执行过程中使用 (p,a,c,k,e,d) 函数引用它们来重建原始代码。不同打包程序的 (p,a,c,k,e,d) 可能有所不同。但是,它通常包含原始代码中单词和符号打包时的特定顺序,以便确定在执行过程中如何对它们进行排序。

对这行代码进行混淆,使其更加晦涩难懂。首先,我们尝试使用BeautifyTools来混淆代码:

image.png

Advanced Obfuscation

Obfuscator

工具 https://obfuscator.io,在点击 obfuscate 之前, String Array Encoding 选择 Base64, 如下图所示:

image.png

输入如下代码:

1
console.log('HTB JavaScript Deobfuscation Module');

点击 obfuscate,得到如下代码:

1
function _0x1ea5(_0x342a02,_0x437cdc){var _0x468e45=_0x468e();return _0x1ea5=function(_0x1ea503,_0x19f93b){_0x1ea503=_0x1ea503-0x82;var _0x1eb7f1=_0x468e45[_0x1ea503];if(_0x1ea5['PDpUPj']===undefined){var _0x4e39de=function(_0x1b9fc0){var _0x1e6757='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x1b055f='',_0x11249b='';for(var _0x553243=0x0,_0x20533e,_0x3014eb,_0x4eae94=0x0;_0x3014eb=_0x1b9fc0['charAt'](_0x4eae94++);~_0x3014eb&&(_0x20533e=_0x553243%0x4?_0x20533e*0x40+_0x3014eb:_0x3014eb,_0x553243++%0x4)?_0x1b055f+=String['fromCharCode'](0xff&_0x20533e>>(-0x2*_0x553243&0x6)):0x0){_0x3014eb=_0x1e6757['indexOf'](_0x3014eb);}for(var _0x2e3b1e=0x0,_0x1a0b41=_0x1b055f['length'];_0x2e3b1e<_0x1a0b41;_0x2e3b1e++){_0x11249b+='%'+('00'+_0x1b055f['charCodeAt'](_0x2e3b1e)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x11249b);};_0x1ea5['EFfvlg']=_0x4e39de,_0x342a02=arguments,_0x1ea5['PDpUPj']=!![];}var _0x45414f=_0x468e45[0x0],_0x35dbe2=_0x1ea503+_0x45414f,_0x34124d=_0x342a02[_0x35dbe2];return!_0x34124d?(_0x1eb7f1=_0x1ea5['EFfvlg'](_0x1eb7f1),_0x342a02[_0x35dbe2]=_0x1eb7f1):_0x1eb7f1=_0x34124d,_0x1eb7f1;},_0x1ea5(_0x342a02,_0x437cdc);}var _0x57b9de=_0x1ea5;function _0x468e(){var _0x39b15a=['nJbNzNzQzxy','mtG0odi5nNPiruLwyG','Bg9N','otm3otm4zwrHy1Pi','ntiYotq4tvfrs2jg','mtbVAw1WvgS','mwn6uKrSsW','ntm1ndfrBwToBfu','otq1nJzZAu10v2m','mtGWrwzwEezR','mZy0ntzdC1zWt3e','mZu3yKPkELrb','mJmYmJK0n1fSvuzlsa'];_0x468e=function(){return _0x39b15a;};return _0x468e();}(function(_0x5a6ca7,_0x3cd39a){var _0x3b3990=_0x1ea5,_0x63dc26=_0x5a6ca7();while(!![]){try{var _0x5336c5=-parseInt(_0x3b3990(0x89))/0x1*(parseInt(_0x3b3990(0x87))/0x2)+-parseInt(_0x3b3990(0x86))/0x3+-parseInt(_0x3b3990(0x84))/0x4+parseInt(_0x3b3990(0x8c))/0x5*(parseInt(_0x3b3990(0x8b))/0x6)+-parseInt(_0x3b3990(0x8e))/0x7*(parseInt(_0x3b3990(0x8d))/0x8)+-parseInt(_0x3b3990(0x8a))/0x9*(-parseInt(_0x3b3990(0x88))/0xa)+parseInt(_0x3b3990(0x82))/0xb*(parseInt(_0x3b3990(0x83))/0xc);if(_0x5336c5===_0x3cd39a)break;else _0x63dc26['push'](_0x63dc26['shift']());}catch(_0x1e8c0c){_0x63dc26['push'](_0x63dc26['shift']());}}}(_0x468e,0x580b5),console[_0x57b9de(0x85)]('HTB\x20JavaScript\x20Deobfuscation\x20Module'));

image.png

More Obfuscation

以下混淆器通常会使代码执行/编译非常缓慢。

JSFuck

JSFuck 是一种基于 JavaScript 原子部分的深奥且具有教育意义的编程风格。它仅使用六个不同的字符来编写和执行代码。

image.png

JJ Encode

JJ Encode

image.png

AA Encode

AA Encode

image.png

Deobfuscation

unPacker

unPacker JS 反混淆工具

Screenshot 2025-04-16 at 17.58.26.png

⬆︎TOP