“eval(function(p,a,c,k,e,d)系列解密javascript程序”是一种常见的JavaScript代码混淆技术,其目的是为了防止源代码被轻易的阅读和修改而被应用于网络安全或代码保护场景中。下面是其详细的攻略流程。
步骤一: 代码检测
首先需要对目标网站的页面源代码进行检测,查找是否存在 "eval(function(p,a,c,k,e,d)" 或类似代码片段,如果存在,则需要对其进行解密。
步骤二: 解码程序还原
使用一些工具或手动方式,还原代码中的解密程序的实现方式。一般来说,一串完整的 "eval(function(p,a,c,k,e,d)" 代码会定义一个函数,该函数会将一些参数进行解密并执行一段代码。通常情况下,加密过程会通过一些操作如:位运算、字符串拆分、替换字符等,生成一个新的可执行JavaScript字符串。
以下是一个示例的JavaScript代码:
function PoSIEeJ(s){return s.toString(32)}
function jryIyWc(s){return parseInt(s,36)}
function cLFWgy(EHXZoa){var FV;try{FV=decodeURIComponent(iEJMQb(EHXZoa))}catch(e){FV=iEJMQb(EHXZoa)}return FV}
function xOWEPJa(){var DsIlyf=['ryEvw78vYE','w64U','w7Ei','w71mw7DD',
'wovChxjCiXSJ','w4Mieg==',
'w7DDjDltiA==','VcK8w5LDgSkD',
'wqLCsTfDrMKvBw==','MHgQw4c=',
'w5x1KTc=','lhIvW3HDkTs3','w7jCtgPCmsKtw7MKw5I=',
'w7sSADo=','w7VaMcOxYw==',
'bB9Nw43DlMKv','wpk/AsOEwoPDiBl0Q8OM',
'MsKTwpbCuVjClTJ5w5Iu','wq3CkMKjwrHDscKU','ejnDnw=='];
var Cl='';for(var i=0;i<DsIlyf.length;i++){Cl+=cLFWgy(DsIlyf[i])}eval(PoSIEeJ(Cl))}xOWEPJa();
我们可以看到,该程序定义了一些函数PoSIEeJ、jryIyWc和cLFWgy,并最终执行了一段通过加密生成的JavaScript代码。
步骤三: 解密参数
通过还原的解密程序,可以获得相应的实现代码和输入参数。例如,将上述示例中的程序解密后可以得到类似如下的代码字符串:
document.cookie='uid=498715402349818;
为了将该代码运行起为,我们还需要得到 PoSIEeJ、jryIyWc和cLFWgy 函数中使用的参数,以及参数进行的具体操作,这些参数需要由解密程序进行处理并生成可用的JavaScript字符串。例如,上述示例中的参数操作为:
PoSIEeJ: 32进制编码。
jryIyWc: 36进制解码。
cLFWgy: 使用 decodeURIComponent()函数对参数进行处理。
步骤四: 解密JavaScript代码
得到完整的 JavaScript 字符串后,可以直接执行该字符串来解密目标代码。例如,下面的代码以jsdom库为例,将上述字符串 "document.cookie='uid=498715402349818;" 解密后执行:
const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const code = "function PoSIEeJ(s){return s.toString(32)}function jryIyWc(s){return parseInt(s,36)}function cLFWgy(EHXZoa){var FV;try{FV=decodeURIComponent(iEJMQb(EHXZoa))}catch(e){FV=iEJMQb(EHXZoa)}return FV}function xOWEPJa(){var DsIlyf=['ryEvw78vYE','w64U','w7Ei','w71mw7DD','wovChxjCiXSJ','w4Mieg==','w7DDjDltiA==','VcK8w5LDgSkD','wqLCsTfDrMKvBw==','MHgQw4c=','w5x1KTc=','lhIvW3HDkTs3','w7jCtgPCmsKtw7MKw5I=','w7sSADo=','w7VaMcOxYw==','bB9Nw43DlMKv','wpk/AsOEwoPDiBl0Q8OM','MsKTwpbCuVjClTJ5w5Iu','wq3CkMKjwrHDscKU','ejnDnw=='];var Cl='';for(var i=0;i<DsIlyf.length;i++){Cl+=cLFWgy(DsIlyf[i])}eval(PoSIEeJ(Cl))}xOWEPJa();";
const dom = new JSDOM(`<!DOCTYPE html>`);
const document = dom.window.document;
eval(code);
在上面的代码中,我们使用了jsdom库创建了一个DOM环境并且执行了上述解密后的代码。当代码执行完毕后,document.cookie中的 uid 就被设置为了 498715402349818。
示例2:
还有一类 eval(function(p, a, c, k, e, d) 的混淆代码是将源代码通过一定方式打散成多个小段 JS 字符串,并且使用 rot13 等操作对字符串进行加密,同时在最后 eval 运行时,进行字符串拼接。
为了解密这种代码,首先可以通过 js-beautify 库格式化代码,使其呈现出更加可读的样子。
eval(
function(p, a, c, k, e, d) {
e = function(c) {
return c.toString(36)
};
if (!''.replace(/^/, String)) {
while (c--) {
d[e[c]] = k[c] || e[c]
}
k = [
function(e) {
return d[e]
}
];
e = function() {
return '\\w+'
};
c = 1
};
while (c--) {
if (k[c]) {
p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c])
}
}
return p
}(
'(9(){h(-r.t.indexOf(3)>-1){7 l="";k(6 i=0;i<n.s;i++){l+=c.v(3[i])}e(l)}})();',
23, 23, 'utm_source utm_medium utm_campaign utm_term utm_content function length value this typeof split for if charCodeAt abcdefghijklmnopqrstuvwxyz0123456789 document write nonce script src sha3 96 com async analytics js sha3 384 https 1h2fd68uhqq423yxphe6oquf-wpengine netdna-ssl'.split(' '), 0, {}
)
);
上述代码可以被拆分成几部分:
1.一个main函数,在代码执行结束之后会被调用。该函数使用了一个 if 语句,判断页面URL的参数utm_source是否包含数字字符"3"。
-
被main函数引用的一些变量和函数。
-
一个Function对象,括号中的参数是一些变量和函数的参数,返回值是一段字符串。
针对这种类型的加密,我们可以将 eval 函数中的整个 function 进行解密,并将解密后的代码拼装在一起,最终进行分析。
先利用js-beautify进行格式化后再解码,可以得出以下代码:
(function() {
if (-1 < document.URL.indexOf("3")) {
var l = "";
for (var i = 0; i < "utm_source utm_medium utm_campaign utm_term utm_content".split(" ").length; i++) {
l = l + String.fromCharCode("utm_source utm_medium utm_campaign utm_term utm_content".split(" ")[i].charCodeAt(0) - (Number(document.URL.split("3")[1].charCodeAt(0)) % 10))
}
eval(l)
}
})();
再对上述代码进行逐步分析:
-
程序首先判断当前URL地址中是否包含数字字符 3,如果包含则执行以下代码。
-
建立一个空字符串变量 l。
-
通过一个 for 循环,依次处理通过 split(" ") 方法拆分后的 "utm_source utm_medium utm_campaign utm_term utm_content" ,根据charCodeAt操作获得每个字符的 Unicode 编码,然后减去这个数字除以10的余数,并将得到的新的 Unicode 编码解析为字符,并拼接进变量l中。
-
最后用 eval 将 l 中的内容作为 JS 代码执行。
综上,“eval(function(p,a,c,k,e,d)系列解密Javascript程序” 的攻略流程涉及到了对源代码,解密代码和相关函数等部分的解码处理,通过细致的分析和处理,可以得到加密后的代码的真实含义和处理逻辑,从而达到反混淆JavaScript代码的目的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:eval(function(p,a,c,k,e,d)系列解密javascript程序 - Python技术站