文章目录

  • 加密方式
  • 混淆分析
  • python实现

加密方式

sojson V5方式的加密分为了3部分:

  • 密文array
  • 解密函数
  • 混淆后的原代码

在经过一些试验后,发现sojson几乎所有版本的混淆都包含这三部分,不同的只是无用代码和变量/函数名的混淆


sojson的核心加密方式总结为如下:

  • 将所有函数调用,对象属性访问改为数组+字符串索引的方式,如:a.b() ===> a['b']()
  • 在处理完所有函数调用,对象属性后,将源码中所有的字符串进行加密操作
  • 将剩余的变量名,函数名,对象名进行随机化操作 如__0x123456
  • 将if语句改为逻辑与运算 如if(a==1){b=2} ===> __0xAAA==1 && b=2
    • 逻辑与,即当前面判断为false时不进行后面的判断,和if很像
  • 将数字拆分运算,比如把1变为3-5-6+9
  • fuckjs操作:将false改为![] 将true改为!![] 将NaN改为+[![]] 将undefined改为[][[]]等

在知道加密方式后,我们可以知道 变量名 函数名 对象名无法进行还原, 但字符串在运行时必然要进行还原,因此我们只需要找到解密函数,然后进行手动调用就可以还原字符串。


混淆分析

js原文:

(function(w, d) { w.update = "2019年09月12日15:24:29更新"; d.info = "这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大";
})(window, document);

普通混淆之后的js:

//密文array
/*1.基本数据开始*/
var a = ['jsjiami.com.v6', 'ZjsgjilBUDamOPlriw.EVcomBp.lv6==', '5p+76Zev6aOL6K2W6ICh57Czw59KXsO7woIUw6fCgMKLw5TCqg==', 'KFXCvcKCJFM=', 'IWQXKgw=', 'Gks8Kg==', 'w4h1w7oOag=='];
//有的版本中, 这里会有一段是为了重新排序array的匿名自执行函数, 此时只要将整个基本数据直接执行可以得到最终的密文array
/*1.基本数据结束*///解密函数
/*2.解密基本数据的函数*/
(function (c, d, e) {var f = function (g, h, i, j) {h = h >> 0x8;if (h < g) {while (--g) {j = c['shift']();if (h === g) {h = j;i = c['shift']();} else if (i['replace'](/[ZglBUDOPlrwEVBpl=]/g, '') === h) {c['push'](j);}}c['push'](c['shift']());}return 0x242ed;};return f(++d, e) >> d ^ e;
}(a, 0x1eb, 0x1eb00));
var b = function (c, d) {c = ~~'0x' ['concat'](c);var e = a[c];if (b['gPvZlv'] === undefined) {(function () {var f = typeof window !== 'undefined' ? window : typeof process === 'object' && typeof require === 'function' && typeof global === 'object' ? global : this;var g = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';f['atob'] || (f['atob'] = function (h) {var i = String(h)['replace'](/=+$/, '');for (var j = 0x0, k, l, m = 0x0, n = ''; l = i['charAt'](m++); ~l && (k = j % 0x4 ? k * 0x40 + l : l, j++ % 0x4) ? n += String['fromCharCode'](0xff & k >> (-0x2 * j & 0x6)) : 0x0) {l = g['indexOf'](l);}return n;});}());var o = function (p, d) {var r = [],s = 0x0,t, u = '',v = '';p = atob(p);for (var w = 0x0, x = p['length']; w < x; w++) {v += '%' + ('00' + p['charCodeAt'](w)['toString'](0x10))['slice'](-0x2);}p = decodeURIComponent(v);for (var y = 0x0; y < 0x100; y++) {r[y] = y;}for (y = 0x0; y < 0x100; y++) {s = (s + r[y] + d['charCodeAt'](y % d['length'])) % 0x100;t = r[y];r[y] = r[s];r[s] = t;}y = 0x0;s = 0x0;for (var z = 0x0; z < p['length']; z++) {y = (y + 0x1) % 0x100;s = (s + r[y]) % 0x100;t = r[y];r[y] = r[s];r[s] = t;u += String['fromCharCode'](p['charCodeAt'](z) ^ r[(r[y] + r[s]) % 0x100]);}return u;};b['fuFDUP'] = o;b['uzmgkx'] = {};b['gPvZlv'] = !![];}var A = b['uzmgkx'][c];if (A === undefined) {if (b['GkZZBA'] === undefined) {b['GkZZBA'] = !![];}e = b['fuFDUP'](e, d);b['uzmgkx'][c] = e;} else {e = A;}return e;
};
/*2.解密基本数据的函数结束*/// -------------------(以上作为decode.js文件)-------------------//混淆后的原代码(作为en.js文件)
/*3.加密的数据主体*/
(function (c, d) {var e = {'RAMoq': '2019年09月12日15:24:29更新','EaZaN': '这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大'};c[b('0', 'ZdTU')] = e[b('1', 'FnxY')];d[b('2', 'FnxY')] = e[b('3', 'jPNw')];
}(window, document));
/*3.加密的数据主体结束*/// -------------------(以上作为en.js文件)-------------------

python实现

前提是js代码能在脱离浏览器环境下运行,可以先在fiddler中试运行一下。

思路:调用函数b完成解密以上数据,还原过程是将b函数返回的数据替换还原即可

import execjs
import redef js_from_file(file_name):with open(file_name, 'r', encoding='UTF-8') as file:result = file.read()return result# 解密函数
decode_func = "b"
# 解密前的js
origin_js = js_from_file('./en.js')
# 解码函数
context1 = execjs.compile(js_from_file('./decode.js'))# 使用正则将所有函数解密, 并替换
s = re.compile(r'b\("(.*?)", "(.*?)"\)', re.S)
any_decode_func = s.finditer(origin_js)
for i in any_decode_func:x1 = i.group(1)x2 = i.group(2)# print(f"--{x1}--, --{x2}--")result1 = context1.call(decode_func, x1, x2)# print(result1)origin_js = origin_js.replace(i.group(), f"\"{result1}\"")print(origin_js)

最终结果:

(function (c, d) {var e = {RAMoq:"2019年09月12日15:24:29更新",EaZaN:"这个是一个本站对JavaScript 脚本的一个最牛加密,兼容性适中,解密难度极大"};c["update"] = e["RAMoq"];d["info"] = e["EaZaN"];
})(window, document);
//这是破解混淆后的(依然像js原文那样调用即可)

python实现sojson V5反混淆相关推荐

  1. python js反混淆 eval(function(p,a,c,k,e,d){

    前言 在Python爬取资源的时候需要分析网站,有时候关键部分的JS会被混淆,所以不得不去解密这段JS去获取数据,这里推荐两个JS在线解密工具. https://www.sojson.com/jsji ...

  2. 导出txt文件宏_XLM宏反混淆工具:提取和反混淆XLM宏

    XLM宏反混淆器 XLMMacroDeobfuscator可用于解码模糊的XLM宏(也称为Excel 4.0宏).它利用内部XLM仿真器来解释宏,而无需完全执行代码. 它同时支持xls,xlsm和xl ...

  3. c/c++反混淆方法

    deobfuscation 记需要反混淆的函数为output=obf-function(input). 反混淆的思路,首先标记输入的变量记为input-symbol,通过Taint跟踪改变量的流向,并 ...

  4. 【JS 逆向百例】W店UA,OB反混淆,抓包替换CORS跨域错误分析

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 逆向目标 OB 混淆简介 抓包分析 混淆还原与替换 CORS 跨域错误 逆向分析 本地联调 完整代码 JavaS ...

  5. JS逆向、破解、反混淆、反浏览器指纹——JS补环境框架

    JS逆向的主要思路一般有这几种 1,利用AST反混淆,因为用的就是AST混淆的,所以理论上应该都能用AST再返回去.但是实际操作好像不容易. 2,跟值,一步一步找到加密方法和密钥.现在很多混淆方法,把 ...

  6. 极验验证码(6.0.9)破解(二) 之 反混淆

    回顾 上篇文章主要分析了极验的请求过程,以及出现的各种参数和配置信息 我们认识到了gt和challenge,极验相关的各种js路径,极验的各种详细配置,以及滑动时生成的参数w 我们的目标是弄明白w参数 ...

  7. 记录一次反混淆的过程

    目标:http://laji.shadiao.co/ 这次的事情还是很有意思的,首先团队内部讨论到垃圾分类智能识别,然后说道,这东西已经有轮子了.结果就看到网上很多api,阿里云的api市场就有.于是 ...

  8. 技术分享:几种常见的JavaScript混淆和反混淆工具分析实战【转】

    信息安全常被描述成一场军备竞赛,白帽与黑帽,渗透测试者与黑客,善与恶,本文将聚焦这场永无止境决斗中的一个小点. HTML5 & JS 应用中充满着对输入进行验证/注入的问题,需要开发人员始终保 ...

  9. c#反混淆工具de4dot 一般混淆都可以解决

    c#反混淆工具de4dot 一般混淆都可以解决 使用方法: 1.CMD 打开 De4Dot 所在文件夹 最好是以管理员身份运行CMD 2.输入 De4Dot  C:\Users\muzigaiyu\D ...

最新文章

  1. 十个 Linux 新手管理员易犯错误
  2. [笔记]在ubuntu下使用conky
  3. Java 定时任务调度工具 Quartz(Part 2)
  4. 对账模块和赊购退款、还款流程
  5. java如何显示当天世界_Java学习笔记——显示当前日期的三种方式
  6. go 切片取最后一个元素_深挖 Go 之 forrange 排坑指南
  7. 第三届“空间信息网络”学术论坛诚邀您的参加
  8. 【总结】大规模数据(300万条)测试时,需要注意的问题。
  9. 10个有关RESTful API良好设计的最佳实践
  10. 框架设计知识点纵览(笔记)
  11. 服务器状态码502什么意思,Http状态码502问题复盘
  12. 浅述SATA接口Raid、AHCI、IDE三种模式
  13. 2019高考数学必考知识点,高考数学知识板块
  14. 安装pywifi的坑
  15. vue 实现打字机效果
  16. 域名检测工具-免费老域名扫描软件下载
  17. FreeBSD常用命令 110 条
  18. matlab 如何使用mex
  19. python调用java之Jpype实现java接口
  20. Character n is neither a decimal digit number, decimal point, nor “e“ notation exponential mark.

热门文章

  1. 47、W25Q128 存储器实验
  2. 华为S5700交换机初始化和配置SSH和TELNET远程登录方法
  3. ECharts 学习
  4. java 自定义 jpanel_JAVA GUI自定义JPanel画板背景
  5. unbound域名解析
  6. ingress?另一种
  7. 我希望 明天的自己 像一道彩虹 还是刚淋过雨
  8. 求一份电子电气工程师必知必会第三版的pdf 谢谢了!!!只是自己学习不做商用
  9. 2021年资料员-通用基础(资料员)考试及资料员-通用基础(资料员)考试APP
  10. 一些HTML常用标签【码住!】