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

yizhihongxing

“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日

相关文章

  • Three.Js实现颜色自定义变换效果实例

    下面我将为大家详细讲解实现“Three.Js实现颜色自定义变换效果实例”的完整攻略。 概述 在 Three.js 中,可以通过修改物体的颜色属性来实现颜色的变换效果。本文将以Three.JS库为基础,介绍如何利用其实现一个简单的颜色自定义变换效果。 步骤 步骤一:引入Three.js库文件 我们需要在HTML文件中引入Three.JS库文件,如下所示: &l…

    JavaScript 2023年6月11日
    00
  • 深入理解JavaScript系列(31):设计模式之代理模式详解

    深入理解JavaScript系列(31):设计模式之代理模式详解 概述 代理模式是一种结构型模式,其中一个对象充当另一个对象的接口,以控制对该对象的访问。 这种类型的设计模式属于结构模式,它对对象进行组合,以提供新的功能,同时使代码更易于维护。 在 JavaScript 中,代理模式允许我们在运行时动态地创建对象并控制其行为。 代理可以隔离对实际对象的访问,…

    JavaScript 2023年6月11日
    00
  • JavaScript 实现拖拽效果组件功能(兼容移动端)

    下面是详细讲解“JavaScript 实现拖拽效果组件功能(兼容移动端)”的完整攻略: 一、需求分析 首先分析一下需求,要实现的功能是实现一个拖拽效果组件,用户可以通过拖拽元素来改变元素的位置。由于需要兼容移动端,所以要考虑触摸事件的处理。 二、实现思路 实现拖拽效果组件可以使用鼠标事件或触摸事件,以下是相关的事件: 鼠标事件:mousedown、mouse…

    JavaScript 2023年6月10日
    00
  • 5天学会asp

    5天学会ASP完整攻略 ASP是一种基于服务器端脚本语言的Web开发技术,使用ASP可以轻松构建动态网站和Web应用程序。如果你想在5天时间内掌握ASP技术,下面是具体的学习攻略: Day 1:入门 先了解ASP的基础知识,可以查看一些相关的文章或者教程,例如MDN web文档等 安装IIS(Internet Information Services)Web…

    JavaScript 2023年6月10日
    00
  • Javascript Global unescape() 函数

    JavaScript Global对象中的unescape()函数用于将经过编码的字符串解码为原始字符串。该函数将所有的十六进制转义序列替换为相应的字符。以下是关于unescape()函数的完整攻略,包括两个示例。 JavaScript Global对象中的unescape()函数 JavaScript Global对象中的unescape()函数用于将经过…

    JavaScript 2023年5月11日
    00
  • JS Map 和 List 的简单实现代码

    当我们在使用JavaScript的时候,有时候需要使用一些数据类型来进行操作和处理。在这些数据类型中,Map和List就是两个常用的数据类型之一。 什么是Map和List 在JavaScript中,Map是一种用于存储键值对的集合。Map中的键可以是任意类型的值,如字符串、数字甚至是对象,同样的值可以对应于不同的键。而List则是一种由一列元素组成的有序集合…

    JavaScript 2023年6月10日
    00
  • JavaScript通过HTML的class来获取HTML元素的方法总结

    当我们想要在JavaScript中获取HTML元素时,可以通过元素的类名(class)来获取。以下是通过HTML元素的类名来获取HTML元素的方法总结: 1. 通过document.getElementsByClassName()方法获取HTML元素 我们可以使用 document.getElementsByClassName() 方法通过元素的类名来获取H…

    JavaScript 2023年6月11日
    00
  • 详解JS深拷贝与浅拷贝

    详解JS深拷贝与浅拷贝 一、什么是拷贝 在JavaScript中,我们经常需要对一个数据进行拷贝,这里的拷贝指的是将一个数据重新复制一份,从而在新的数据上进行操作,而原始数据不会受到影响。拷贝手段分为两种:浅拷贝和深拷贝。 1.1 浅拷贝 浅拷贝就是将原始数据的引用复制一份给新的数据,这样新数据和原始数据指向同一块内存区域,因此对新数据进行操作,也会影响原始…

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