eval(function(p,a,c,k,e,d)系列解密javascript程序

“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"。

  1. 被main函数引用的一些变量和函数。

  2. 一个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)
    }
})();

再对上述代码进行逐步分析:

  1. 程序首先判断当前URL地址中是否包含数字字符 3,如果包含则执行以下代码。

  2. 建立一个空字符串变量 l。

  3. 通过一个 for 循环,依次处理通过 split(" ") 方法拆分后的 "utm_source utm_medium utm_campaign utm_term utm_content" ,根据charCodeAt操作获得每个字符的 Unicode 编码,然后减去这个数字除以10的余数,并将得到的新的 Unicode 编码解析为字符,并拼接进变量l中。

  4. 最后用 eval 将 l 中的内容作为 JS 代码执行。

综上,“eval(function(p,a,c,k,e,d)系列解密Javascript程序” 的攻略流程涉及到了对源代码,解密代码和相关函数等部分的解码处理,通过细致的分析和处理,可以得到加密后的代码的真实含义和处理逻辑,从而达到反混淆JavaScript代码的目的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:eval(function(p,a,c,k,e,d)系列解密javascript程序 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JavaScript时间与时间戳的转换操作实例分析

    JavaScript时间与时间戳的转换操作实例分析 JavaScript中有一种时间格式,称为Date对象,它可以进行各种时间计算和比较。同时,JavaScript也支持时间戳,即自1970年1月1日以来的秒数。当我们需要使用这两种时间格式时,需要进行时间与时间戳的相互转换。下面将介绍JavaScript时间与时间戳的转换操作实例,包括两条示例说明。 1. …

    JavaScript 2023年5月27日
    00
  • 网站统计中的数据收集原理及实现

    网站统计中的数据收集原理及实现 网站统计是指通过对网站用户数据的收集、整理、分析等方式来了解网站的运营情况,从而对网站进行优化和改进的一项工作。 原理 网站统计的原理是通过收集用户在网站中的行为数据,如访问时间、访问页面、停留时间、访问来源、设备信息等,来分析用户的行为模式和趋势,并以此为依据对网站进行优化和改进。 数据收集的方式主要包括以下几种: 1. C…

    JavaScript 2023年6月11日
    00
  • 使用js获取url中的参数并返回一个对象方式

    获取URL中的参数对于前端开发来说是一个很常见的需求,这里介绍两种使用JS获取URL参数并返回一个对象的方法。 方法一:使用URLSearchParams URLSearchParams是浏览器提供的一个内置对象,可以方便的获取URL参数。以下是具体的实现过程: function getSearchParams() { const params = new …

    JavaScript 2023年5月28日
    00
  • 基于JS实现Android,iOS一个手势动画效果

    要基于JS实现Android和iOS上的手势动画效果,可以按照以下步骤进行操作: 步骤1:编写HTML结构 首先,需要先创建一个HTML结构来容纳手势动画效果的元素。可以使用如下代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> …

    JavaScript 2023年6月10日
    00
  • Hutia 的 JS 代码集

    Hutia 的 JS 代码集 什么是 Hutia 的 JS 代码集? Hutia 的 JS 代码集是一个由 Hutia 响应式模板引擎作者编写的 JavaScript 代码集,可以让前端开发者更高效地完成常见的前端开发任务。它包括了一些经常需要用到的常用函数和工具,可以用于各种类型的网站开发,包括响应式网站、Web 应用程序以及自适应 UI 设计等。 如何使…

    JavaScript 2023年6月11日
    00
  • javascript 程序库的比较(一)之DOM功能

    下面是关于”JavaScript程序库比较之DOM功能”的完整攻略。 什么是DOM DOM(Document Object Model)是文档对象模型的缩写,指的是网页中所有HTML标签元素的树形结构。在JavaScript中,可以通过DOM来访问和操作页面中的元素,比如修改元素的样式、内容和属性等。 JavaScript程序库的介绍 DOM操作是一项常见的…

    JavaScript 2023年5月27日
    00
  • $()JS小技巧

    $()JS小技巧 在前端开发中,我们经常需要对DOM元素进行操作,而jQuery库可以帮助我们更方便地实现这些操作。其中一个最常用的方法是$(),它可以获取DOM元素并对其进行操作。 基本语法 $()是jQuery的一种基本语法,它可以通过选择器来选取HTML元素,并返回一个jQuery对象。基本语法如下: $(selector).action() 其中的s…

    JavaScript 2023年5月18日
    00
  • JavaScript Function函数类型介绍

    JavaScript Function函数类型介绍 在 JavaScript 中,函数是一等公民,是最为重要的组成部分之一。JavaScript 函数可以分为函数声明、函数表达式、箭头函数、构造函数等多种类型。本文将结合示例为大家介绍 JavaScript 中常见的函数类型及使用场景。 函数声明 函数声明是一种创建函数的常见方式,它以关键字 function…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部