什么是 jad
jad 是一款基于 JavaScript 的反混淆技术实现工具。它可以将经过混淆处理的 JavaScript 代码还原成易于阅读和理解的形式,从而方便开发者快速定位和修复问题。
jad 的安装
使用 npm 包管理器可以方便地安装 jad,打开终端输入以下命令:
npm install -g jad
这里的 -g
参数表示将 jad 安装为全局可用的工具。
jad 的使用
命令行方式
用户可以通过终端命令行的方式使用 jad 工具。首先进入到需要还原的 JavaScript 代码所在目录,使用以下命令还原代码:
jad <filename>
其中 <filename>
是要还原的 JavaScript 文件名。
Node.js 模块方式
用户也可以在 Node.js 环境中使用 jad 工具。通过以下代码将 jad 引入项目:
const jad = require('jad');
然后可以使用 jad 的 API,对目标 JavaScript 代码进行反混淆操作。
const sourceCode = 'var E=null;function S(Z,Y){E=this;E[Z]=Y;return E;}\n'; jad(sourceCode).then((deobfuscatedCode) => { console.log(deobfuscatedCode); })
反混淆效果
下面是一个反混淆前后对比的示例代码:
混淆前:
!function(a){function b(b){for(var c,d,e=b[0],f=b[1],g=b[2],i=0,j=[];i<e.length;i++)d=e[i],Object.prototype.hasOwnProperty.call(h,d)&&h[d]&&j.push(h[d][0]),h[d]=0;for(c in f)Object.prototype.hasOwnProperty.call(f,c)&&(a[c]=f[c]);for(l&&l(b);j.length;)j.shift()();return k.push.apply(k,g||[]),m()}function m(){for(var a,b=0;b<k.length;b++){for(var c=k[b],d=!0,e=1;e<c.length;e++){var f=c[e];0!==h[f]&&(d=!1)}d&&(k.splice(b--,1),a=i(i.s=c[0]))}return a}var c={},d={1:0},h={1:0},k=[];function i(b){if(c[b])return c[b].exports;var d=c[b]={i:b,l:!1,exports:{}};return a[b].call(d.exports,d,d.exports,i),d.l=!0,d.exports}i.m=a,i.c=c,i.d=function(a,b,c){i.o(a,b)||Object.defineProperty(a,b,{enumerable:!0,get:c})},i.r=function(a){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(a,"__esModule",{value:!0})},i.t=function(a,b){if(1&b&&(a=i(a)),8&b)return a;if(4&b&&"object"===typeof a&&a&&a.__esModule)return a;var c=Object.create(null);if(i.r(c),Object.defineProperty(c,"default",{enumerable:!0,value:a}),2&b&&"string"!=typeof a)for(var d in a)i.d(c,d,function(b){return a[b]}.bind(null,d));return c},i.n=function(a){var b=a&&a.__esModule?function(){return a["default"]}:function(){return a};return i.d(b,"a",b),b},i.o=function(a,b){return Object.prototype.hasOwnProperty.call(a,b)},i.p="",i.oe=function(a){throw console.error(a),a};var j=window["webpackJsonp"]=window["webpackJsonp"]||[],l=j.push.bind(j);j.push=b,j=j.slice();for(var n=0;n<j.length;n++)b(j[n]);var p=k;m()}([]);
混淆后:
!function(m){var C={};function O(O,i,o){C[O]||(C[O]={});var a=C[O],n={exports:{}},q=n.exports;return i(q,a,n,o),q}var i="function"!==typeof Object.setPrototypeOf||"object"!==typeof Object.getOwnPropertySymbols?[].concat(Object.getOwnPropertyNames,Object.getOwnPropertySymbols):function(O){return[].concat(Object.getOwnPropertyNames(O),Object.getOwnPropertySymbols(O))},j=Object.freeze?Object.freeze(function(O){return O}):function(O){return O},u=O(47,function(O,i){"use strict";Object.defineProperty(i,"__esModule",{value:!0}),i.default=null,Object.defineProperty(i,"baz",{get:function(){return C.baz},set:function(O){return C.baz=O,!0}})});Object.defineProperty(u,"__esModule",{value:!0});var s=j({zippy:42});O(84,function(O,i){"use strict";Object.defineProperty(i,"__esModule",{value:!0});var N=O(47);i.default=N.baz})})()
反混淆后:
-- -------------------- ---- ------- ------------------- - --- --------- - --- -------- ----------------------------- - -- --------------------- - ------ ---------------------------- - --- ---------- - ------------------- - - -- --------- -- ------ -------- -- -- ------------------------------------------- ----------- ------------------- --------------------- ------------ - ----- ------ ------------------- - --- ------------------ - ---------- --- ------ ---------------------------- - ------------------------------------- ----------------------------- - ---------------- - ------ --------------------------------------------- -------------------------------------- -- --- ------ - ------------- - ----------------- - --- --- ------------ - --------------------- - ---------------- ---- ------ - ----------------------------- ---- - ----------- ------ --------- ----- ------------- ----- ------ ----- --- - - ---------------- ---- ------ - ----------- - ------ -- --------------------------------- ------------- - ------ ---- --- --- ------------- - ------------------------ --------------------------- ---------- ------ --------------------------- ------ - ---- ---------- - ------ -------------- -- ---- --------------- - ------ ------------- - ------ ----- - --- --------------------------- ------------- - ------ ---- --- -------------------- -------- ---- --- ------------ - ------------------------ -------------------------- ---------- ------------------- -------------------------- ------------- - ------ ---- --- ----
jad 的指导意义
JavaScript 代码混淆的作用在于增加代码的可读性和防止代码抄袭。但是混淆的过程也容易导致代码的易读性和可调试性降低,以及开发者难以维护和修改。使用 jad 工具对经过混淆处理的 JavaScript 代码进行反混淆可以方便地解决这些问题,提高开发者调试和维护代码的效率。
总结
jad 是一款基于 JavaScript 的反混淆技术实现工具。使用 npm 包管理器可以方便地安装 jad,通过命令行或者 Node.js 模块的方式使用 jad 工具。jad 工具可以方便地将混淆处理的 JavaScript 代码还原成易于阅读和理解的形式,提高代码的可读性和方便开发者快速定位和修复问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005671c81e8991b448e3793