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开发中,常常需要对数组进行去重操作。本文将详细介绍JavaScript常用的数组去重方法,并对它们进行比较和详细解释。 一、方法1:双重循环去重法 方法描述 通过双重循环遍历数组,把数组中的每个元素依次与之后的每个元素相比较,如果发现重复的元素,则把后面的元素从数组中删除。 示例代码 f…

    JavaScript 2023年5月27日
    00
  • 详解js中class的多种函数封装方法

    下面是“详解js中class的多种函数封装方法”的完整攻略。 什么是类(class)? 类是JavaScript中的一种面向对象的编程范式,是ES6中增加的新特性,能够更好地封装数据和行为。它是复杂对象的一种抽象描述,用于描述具有相同特征(属性)和行为的对象的集合。 类的多种函数封装方法 1. 构造函数封装 通过构造函数实现类的定义和方法的调用。构造函数不需…

    JavaScript 2023年5月27日
    00
  • JavaScript实现页面滚动图片加载(仿lazyload效果)

    JavaScript实现页面滚动图片加载(仿lazyload效果) 概述 在网站中,经常会有长页式的页面,滚动页面时会不断加载图片,但是如果在页面的初次加载时一次性加载所有的图片,会给用户带来不必要的流量浪费,同时也会影响页面加载速度。因此,我们可以通过JavaScript实现页面滚动图片加载,去实现对用户体验的优化。 本攻略将介绍一种基于lazyload思…

    JavaScript 2023年6月11日
    00
  • 基于Cookie常用操作以及属性介绍

    下面我将详细讲解基于Cookie常用操作以及属性介绍的攻略。 1. 什么是Cookie 定义:Cookie 是一种存储在客户端的小文本文件,由浏览器自动管理,包含网站相关信息。 特点: 借助 HTTP 协议,在客户端和服务端之间传输; 客户端可通过 JavaScript 操作,实现与服务端的数据交互; Cookie 是一次性的(默认情况下)。它只存在一个时间…

    JavaScript 2023年6月11日
    00
  • js最实用string(字符串)类型的使用及截取与拼接详解

    Js最实用String(字符串)类型的使用及截取与拼接详解 在 JavaScript 开发中,字符串(string)类型是非常重要的数据类型之一,也是我们日常开发中经常遇到的数据类型之一。在本篇攻略中,我们将对 JavaScript 中 String 类型的基本操作进行详细讲解,主要包括字符串的创建、截取和拼接等操作。 一、字符串的创建 1、使用单引号或双引…

    JavaScript 2023年5月19日
    00
  • 使用JavaScript计算前一天和后一天的思路详解

    十分感谢您的提问,我将为您提供如下对“使用JavaScript计算前一天和后一天的思路详解”的详细讲解攻略。 简介 首先,我们需要了解一下时间相关的标准,JavaScript中常见的有三种时间格式:时间戳、日期时间字符串、Date对象。其中,时间戳(Unix Timestamp / Epoch Time)一般指的是从1970年1月1日00:00:00至现在的…

    JavaScript 2023年5月27日
    00
  • 解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法

    针对“解决js页面滚动效果scrollTop在Firefox与Chrome浏览器间的兼容问题”的问题,以下是完整的攻略: 问题描述 在开发网站过程中,经常会遇到使用JavaScript实现页面滚动效果时,在不同浏览器下滚动条的scrollTop属性值不同的兼容性问题,尤其是在Chrome与Firefox浏览器上。 解决方法 使用jQuery的.scrollT…

    JavaScript 2023年6月11日
    00
  • javascript 异常处理使用总结

    JavaScript 异常处理使用总结 什么是 JavaScript 异常处理? JavaScript 异常处理是指,在 JavaScript 代码运行过程中发生错误时,能够通过编写特定的代码来处理这些错误,以保证代码的正常运行。 为什么需要 JavaScript 异常处理? 在 JavaScript 代码中,错误的出现是不可避免的。如果我们不处理这些错误,…

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