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日

相关文章

  • C#设置或验证PDF文本域格式的方法详解

    C#设置或验证PDF文本域格式的方法详解 介绍 PDF文本域是指在PDF文档中提供的一种可编辑的文本框,用户可以输入文本或选择选项。如果需要对PDF文本域的格式进行设置或验证,那么就需要使用C#编写代码来实现。 本文将详细讲解如何使用C#设置或验证PDF文本域格式,包括以下内容: 创建PDF文本域 设置PDF文本域格式 验证PDF文本域格式 创建PDF文本域…

    JavaScript 2023年5月19日
    00
  • javascript实现一个网页加载进度loading

    下面是关于Javascript实现一个网页加载进度loading的完整攻略。 步骤一:添加HTML结构 首先,在网页的HTML结构中添加loading元素,用于显示进度条和加载状态。可以采用下面代码模板: <div id="loading"> <div id="progress"></di…

    JavaScript 2023年6月11日
    00
  • JavaScript实现AOP详解(面向切面编程,装饰者模式)

    JavaScript实现AOP详解 什么是AOP AOP(Aspect Oriented Programming),中文译为面向切面编程,是一种编程方法论。它通过预编译方式和运行期动态代理实现程序功能的统一维护的方法。 AOP 解决的问题主要是将那些与业务无关,却为业务模块所共同调用的逻辑或责任进行封装,并分离出来,例如在不修改源代码的情况下统一添加日志记录…

    JavaScript 2023年5月27日
    00
  • vue+element实现表单校验功能

    下面是“vue+element实现表单校验功能”的完整攻略。 一、需求 在前端开发中,表单校验是一项常见的需求。我们需要实现以下功能: 用户填写表单时,对表单数据进行即时校验,及时提示用户。 当用户提交表单数据时,对数据再次校验,确保数据填写正确后才提交。 为了实现上述两个功能,我们可以选择使用Vue框架和Element组件库提供的表单组件及表单校验功能。下…

    JavaScript 2023年6月10日
    00
  • Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码

    下面是关于Js判断H5上下滑动方向及滑动到顶部和底部判断的完整攻略: 一、背景 在H5页面中,经常需要判断用户向上滑动或向下滑动,并且需要知道用户是否已经滑动到了页面的顶部或底部。为了实现这个功能,需要借助Js的一些特性和事件,下面将会详细介绍。 二、滑动事件 当页面出现滚动条时,可以侦测滚动条的滑动事件,常用的有scroll、touchmove等事件。其中…

    JavaScript 2023年6月11日
    00
  • Ajax的内部实现机制、原理与实践小结

    Ajax的内部实现机制、原理与实践小结 Ajax的概念 Ajax(也就是 Asynchronous JavaScript and XML的缩写)是一种用于创建快速动态网页应用的技术,能够实现页面无刷新更新。它通过后台的异步数据传输技术,可以让 Web 应用的部分内容得到异步的刷新。 Ajax的实现机制 Ajax的实现机制主要由XMLHttpRequest对象…

    JavaScript 2023年6月11日
    00
  • 通过正则表达式使用ajax检验注册信息功能

    下面我将为您详细讲解如何使用正则表达式通过 AJAX 来验证注册信息的完整攻略。 什么是 AJAX? 首先,我们需要了解一下什么是 AJAX。AJAX 是利用 JavaScript 与服务器进行异步通信的技术,可以在不刷新页面的情况下,向服务器发送请求并获取返回的数据。 为什么要使用 AJAX 验证注册信息? 在传统的网站中,通常需要在用户提交表单后,将表单…

    JavaScript 2023年6月10日
    00
  • JavaScript利用正则表达式替换字符串中的内容

    针对这个问题,我将从以下几个方面进行详细的讲解: 什么是正则表达式替换? JavaScript中的正则表达式 JavaScript利用正则表达式替换字符串的方法 示例说明 1. 什么是正则表达式替换? 正则表达式替换是指通过指定的正则表达式规则,在一个字符串中查找符合条件的内容并进行替换的操作。 2. JavaScript中的正则表达式 在JavaScrip…

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