首页 > 其他分享 >私募数据中心(数据解密,解密代码和教程)

私募数据中心(数据解密,解密代码和教程)

时间:2024-12-27 18:59:29浏览次数:6  
标签:教程 code 数据中心 解密 0xc11e length slice key var

==请帮忙点点赞,点个关注,谢谢!!==


官网地址:私募数据中心

本文发布的技术与代码仅供技术交流和学习使用,严禁用于数据采集等任何违法活动。请确保合法使用,并独立承担不当使用带来的法律责任。

一、逆向教程

1.我们先来看看返回的数据

点下一页,有个请求返回了数据,data应该是我们想要的数据是密文,其他的暂不知道有啥用就先不管了。那先开始找解密函数。

2.解密函数的定位

hook一段神秘代码。(有没有很熟悉,没错就是上期的那个神秘代码)

(function() {
    var parse_ = JSON.parse;
	JSON.parse = function(arg) {
        console.log("断点----->", arg);
        debugger;
        return parse_(arg);
    }})();

注入完,再点一下翻页。

有了,这hook到的是response返回的内容,没关系继续往下走等看到明文再说。

一不小心跟到明文了,没关系往回跟栈

ok了,传入明文,输出的密文。首尾打上断点,刷新网页(把hook刷没)

3.深入分析

这是个混淆过了的js代码,所以可读性很差,但是没关系,不影响分析。

3.1 参数key分析

发现之前打的首尾断点内的函数调用了key,所以补了一个key的断点,先来分析分析key

这个data[__Ox11208b[15]]值是不是很熟悉,响应中['data']['id']的值。

那么混淆前的代码应该是 "key = eval('window.' + data[id])"

3.1.1 eval()方法分析

再看看eval,找了半天没看到,再仔细回想一下响应里面有个参数是js代码

 把他格式化出来看看,长下面这个样子。

var _0xc11e = ["", "split", "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/", "slice", "indexOf", "", "", ".", "pow", "reduce", "reverse", "0"];

function _0xe85c(d, e, f) {
    var g = _0xc11e[2][_0xc11e[1]](_0xc11e[0]);
    var h = g[_0xc11e[3]](0, e);
    var i = g[_0xc11e[3]](0, f);
    var j = d[_0xc11e[1]](_0xc11e[0])[_0xc11e[10]]()[_0xc11e[9]](function(a, b, c) {
        if (h[_0xc11e[4]](b) !== -1) return a += h[_0xc11e[4]](b) * (Math[_0xc11e[8]](e, c))
    }, 0);
    var k = _0xc11e[0];
    while (j > 0) {
        k = i[j % f] + k;
        j = (j - (j % f)) / f
    }
    return k || _0xc11e[11]
}
eval(function(h, u, n, t, e, r) {
    r = "";
    for (var i = 0, len = h.length; i < len; i++) {
        var s = "";
        while (h[i] !== n[e]) {
            s += h[i];
            i++
        }
        for (var j = 0; j < n.length; j++) s = s.replace(new RegExp(n[j], "g"), j);
        r += String.fromCharCode(_0xe85c(s, e, 10) - t)
    }
    return decodeURIComponent(escape(r))
}("jllDwgCgwgDgwgjgwgglwjllDwCjlwggjwCjDwCCgwCClwCCCwCjgwCjCwCDjwCCDwCDlwCDlwCjDwCCCwCCjwCClwCjgwCCDwCDlwCCjwCjDwCDjwCCjwCglwjDDwCCgwCCCwgCjwgClwgCjwjDDw",31,"ljCDgwzrY",9,5,24))

嗯....,eval()藏这里面了。那不管了先把代码拿下来运行一下看看。(报错:ReferenceError: window is not defined,  补一个window上去:global.window = global)

ok,对上了。

3.1.2 key的再赋值

那再往下走。有一个code判断和key的再赋值,太长了,不管了,直接给他拿下来。

code值是响应数据的endode值。弄完混淆前长这样。

key = code === 3 ? key['split']('')['reverse']()['join']('') : code === 4 ? key = key['slice'](2) : code === 5 ? key = key['slice'](0, key['length'] - 2) : code === 6 ? key = key['slice'](1, key['length'] - 1) : code === 7 ? key = key['slice'](2, key['length'] - 1) : code === 8 ? key = key['slice'](1, key['length'] - 2) : code === 9 ? key = key[0] + key['slice'](2, key['length']) : code === 10 && (key = key['slice'](0, key['length'] - 2) + key[key['length'] - 1])

ok,又对上了。那key值的还原就结束了。

3.2 data的解密

这标标准准的AES解密,就不用多说了吧,用CryptoJS库把混淆一个一个还原就行。

还原后长下面这样:

const CryptoJS = require("crypto-js")

e = CryptoJS.MD5(key).toString()
t = CryptoJS.enc.Utf8.parse(e)
r = CryptoJS.enc.Utf8.parse(e.slice(16,32))

s = window.atob(datas)
o = (CryptoJS.AES.decrypt(s, t, {
    iv: r,
    padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8))

运行一下出值了。

二、完整JS解密代码和python调用代码

1. 完整JS解密代码如下

global.window = global
const CryptoJS = require("crypto-js")

function main(h, u, n, t, e, r, code, id,data){
    var _0xc6e = ["", "split", "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/", "slice", "indexOf", "", "", ".", "pow", "reduce", "reverse", "0"];
    function _0xe85c(d, e, f) {
    var g = _0xc6e[2][_0xc6e[1]](_0xc6e[0]);
    var h = g[_0xc6e[3]](0, e);
    var i = g[_0xc6e[3]](0, f);
    var j = d[_0xc6e[1]](_0xc6e[0])[_0xc6e[10]]()[_0xc6e[9]](function(a, b, c) {
        if (h[_0xc6e[4]](b) !== -1) return a += h[_0xc6e[4]](b) * (Math[_0xc6e[8]](e, c))
    }, 0);
    var k = _0xc6e[0];
    while (j > 0) {
        k = i[j % f] + k;
        j = (j - (j % f)) / f
    }
    return k || _0xc6e[11]
    }
    eval(function(h, u, n, t, e, r) {
    r = "";
    for (var i = 0, len = h.length; i < len; i++) {
        var s = "";
        while (h[i] !== n[e]) {
            s += h[i];
            i++
        }
        for (var j = 0; j < n.length; j++) s = s.replace(new RegExp(n[j], "g"), j);
        r += String.fromCharCode(_0xe85c(s, e, 10) - t)
    }
    return decodeURIComponent(escape(r))
    }(h, u, n, t, e, r))

    key = eval("window." + id)
    key = code === 3 ? key['split']('')['reverse']()['join']('') : code === 4 ? key = key['slice'](2) : code === 5 ? key = key['slice'](0, key['length'] - 2) : code === 6 ? key = key['slice'](1, key['length'] - 1) : code === 7 ? key = key['slice'](2, key['length'] - 1) : code === 8 ? key = key['slice'](1, key['length'] - 2) : code === 9 ? key = key[0] + key['slice'](2, key['length']) : code === 10 && (key = key['slice'](0, key['length'] - 2) + key[key['length'] - 1])
    s = window.atob(data)
    e = CryptoJS.MD5(key).toString()
    t = CryptoJS.enc.Utf8.parse(e)
    r = CryptoJS.enc.Utf8.parse(e.slice(16,32))
    o = (CryptoJS.AES.decrypt(s, t, {
        iv: r,
        padding: CryptoJS.pad.Pkcs7
    }).toString(CryptoJS.enc.Utf8))
    return o
}


 2. python调用代码如下

import json
import re
import execjs
import requests


def decodeData(h, u, n, t, e, r, code, id, data):
    file = open('decode_data.js', mode='r', encoding='utf-8')
    js = file.read()
    file.close()
    decData = execjs.compile(js)
    dataJson = decUrlJs.call('main', h, u, n, t, e, r, code, id, data)
    return json.loads(dataJson)


response = requests.get('请求自己写吧')
dataJson = response.json()
params_str = re.search(r'}\((.*?)\)\)', dataJson["data"]["key"], re.S).group(1)
h, u, n, t, e, r = params_str.replace("\"", '').split(",")
code = dataJson["data"]["encode"]
id = dataJson["data"]["id"]
encData = dataJson["data"]["data"]

print(decodeData(h, u, n, t, e, r, code, id, encData))

python运行结果如下:

 

三、声明

本文发布的技术与代码仅供技术交流和学习使用,严禁用于数据采集等任何违法活动。请确保合法使用,并独立承担不当使用带来的法律责任。

未经允许禁止转载

标签:教程,code,数据中心,解密,0xc11e,length,slice,key,var
From: https://blog.csdn.net/m0_60082046/article/details/144750297

相关文章

  • 财联社加密参数(解密教程、纯算代码)
    ==请帮忙点点赞,点个关注,谢谢!!==官网地址:财联社本文发布的技术与代码仅供技术交流和学习使用,严禁用于数据采集等任何违法活动。请确保合法使用,并独立承担不当使用带来的法律责任。一、逆向教程1.我们先来看看请求参数有个加密参数“sign”,多个翻页结果来对比,似乎是通过last......
  • 24. 解密犯罪时间
    题目描述警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如“HH:MM”表示的时刻。根据警察和线人的约定,为了隐蔽,该时间是修改过的,解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。每个出现数字都可以被无限次使用。输入描......
  • Navicat Premium 16 破解版下载及安装教程
    今天带着 NavicatPremium16注册机 给各位大佬演示下。坐好发车了!官网下载地址默认下载的都是最新版本,本教程使用的就是最新的 NavicatPremium16V16.0.11中文版64位 安装包,download:NavicatPremium16  一、安装WindowsNavicatPremium16常规步骤,一直下一步就......
  • nmap命令详细教程
    Nmap(NetworkMapper)是一款开源的网络扫描和安全审计工具,广泛用于网络安全领域。它能够帮助用户快速发现网络上的主机和服务、识别操作系统类型以及进行漏洞扫描等任务。以下是Linux系统中Nmap的详细使用教程:一、Nmap的安装Nmap的安装相对简单,可以从Nmap的官方网站(https://......
  • 想成为顶尖黑客吗?先学会这五大“绝学”吧!黑客技术零基础入门到精通教程
    有很多小伙伴都梦想着成为一名顶尖黑客,成为顶尖黑客首先技术一定要过关,下面的五大技术就是作为一名顶尖黑客所需要掌握的。我们一起来看看。1、APT攻击令人防不胜防APT,全称是AdvancedPersistentThreat,是高级持续性威胁的意思。APT是黑客以窃取核心资料为目的的网络攻击,......
  • TCP-UDP调试工具推荐:Socket通信测试教程(附详细图解)
    前言在网络编程与应用开发中,调试始终是一项不可忽视的重要环节。尤其是在涉及TCP/IP、UDP等底层网络通信协议时,如何确保数据能够准确无误地在不同节点间传输,是许多开发者关注的核心问题。调试的难点不仅在于定位连接建立、数据流控制及错误处理等问题,还在于快速、高效地解决这些......
  • Redis可视化工具推荐:Another Redis Desktop Manager使用教程与下载
    Redis是一种高性能的Key-Value数据库,被广泛应用于缓存、消息队列等场景。尽管Redis的命令行工具功能强大,但对于许多开发者而言,使用一款可视化工具可以大大提高操作效率和用户体验。今天为大家推荐一款功能强大的Redis可视化工具——AnotherRedisDesktopManager,并提供资源......
  • python部署教程
    Python程序的部署涉及多个步骤,包括准备环境、打包程序、配置服务器等。以下是一个详细的Python部署教程:一、准备环境选择服务器:根据项目需求选择合适的服务器,可以是物理服务器或云服务器(如阿里云、腾讯云等)。确保服务器具有足够的硬件配置和性能,以应对工作负载和请求量......
  • 鸿蒙NEXT开发实战教程—文字识别
    今天跟大家分享一个ocr文字识别的小项目:鸿蒙系统提供了文字识别的能力,支持简体中文、英文、日文、韩文、繁体中文五种语言。实现步骤为初始化文字识别服务、将图片转换为PixelMap、文字识别、释放OCR服务。首先从相册或者拍照获取图片,这一部分在之前的文章里有介绍,有疑问的同学......
  • 鸿蒙NEXT开发实战教程—小红书app
    幽蓝君最近发现小红书是个好东西,一定要多逛今天就浅浅模仿一下小红书app,主要是底部tab栏和主页部分。首先看一下tabbar,由于中间有一个红色按钮的存在,所以这里我使用自定义导航栏来实现,自定义的实现逻辑是在本来app的上层叠加一层自定义tabbar,使用监听index的变化来改变tababr......