【JS 逆向百例】你没见过的社会主义核心价值观加密

关注微信公众号:K哥爬虫,持续分享爬虫进阶、JS/安卓逆向等技术干货!
声明
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
逆向目标
- 目标:社会主义核心价值观加密原理分析
- 主页:
aHR0cHM6Ly93d3cuYXBwbWl1LmNvbS9rZXkv
逆向分析
K哥的同事今天发来一个比较有趣的加密,不管你输入什么字符串,加密后的结果都是由 24 个字的社会主义核心价值观随机组合而成,如下图所示:

首先我们尝试抓包,看看是否有网络上的发包操作,实际上是没有的,这说明加密解密的逻辑都在已加载完毕的 JavaScript 代码里,这里介绍三种方法去定位加密入口:
1、我们注意到加密结果始终由社会主义核心价值观组成,肯定是在原 24 字的基础上做了一些操作,也就是说在某个地方肯定定义了这 24 个字,我们任意全局搜索其中一个词即可,如下图所示:

2、加密解密的结果都是点击了按钮才生成的,那么这个按钮肯定绑定了某些事件,比如鼠标点击事件,我们可以通过 DOM 事件断点的方式定位加密入口,如下图所示:

3、我们注意到加密解密的 button 都有一个 id,那么有可能 JavaScript 里会获取到这个 id 后,使用 addEventListener() 方法向这个元素添加鼠标点击事件句柄,所以也可以全局搜索其 id,即 encode-btn 和 decode-btn,也可以搜索 getElementById("encode-btn") 或者 getElementById("decode-btn"),当然也可以搜索方法关键字 addEventListener。如下图所示:

定位到加密位置后,埋下断点进行调试,我们来看看加密的逻辑:

加密过程:变量 v 通过元素 id(decoded-area)拿到明文文本区域(textarea),点击加密按钮(encode-btn)会触发事件,进入后面的函数,v.value 就是明文值,经过 l() 函数加密后赋值给 n,然后再把 n 赋值给 p.value,也就是显示在密文的文本区域(encoded-area)。
解密过程:变量 p 通过元素 id(encoded-area)拿到密文文本区域(textarea),点击解密按钮(decode-btn)会触发事件,进入后面的函数,p.value 就是密文值,经过 s() 函数解密后赋值给 n,然后再把 n 赋值给 v.value,也就是显示在明文的文本区域(decoded-area)。
整个代码逻辑比较简单,用到的这些函数也都在一起,直接全部 copy 下来即可。
完整代码
GitHub 关注 K 哥爬虫,持续分享爬虫相关代码!欢迎 star !https://github.com/kgepachong/
JavaScript 加密解密代码
var e = function () {
for (var t = arguments.length, n = Array(t), r = 0; r < t; r++)
n[r] = arguments[r];
var e = n.length
, i = "string" == typeof n[e - 1] ? n[e - 1] : "Assert Error"
, o = !0
, u = !1
, c = void 0;
try {
for (var f, a = n[Symbol.iterator](); !(o = (f = a.next()).done); o = !0) {
if (!f.value)
throw new Error(i)
}
} catch (t) {
u = !0,
c = t
} finally {
try {
!o && a.return && a.return()
} finally {
if (u)
throw c
}
}
}
, i = function () {
return Math.random() >= .5
}
, o = function (t) {
var n = /[A-Za-z0-9\-\_\.\!\~\*\'\(\)]/g
, r = t.replace(n, function (t) {
return t.codePointAt(0).toString(16)
});
return encodeURIComponent(r).replace(/%/g, "").toUpperCase()
}
, u = function (t) {
e("string" == typeof t, "utfs Error");
var n = t.length;
e(0 == (1 & n));
for (var r = [], i = 0; i < n; i++)
0 == (1 & i) && r.push("%"),
r.push(t[i]);
return decodeURIComponent(r.join(""))
}
, c = function (t) {
e("string" == typeof t);
var n = []
, r = !0
, o = !1
, u = void 0;
try {
for (var c, f = t[Symbol.iterator](); !(r = (c = f.next()).done); r = !0) {
var a = c.value
, s = Number.parseInt(a, 16);
s < 10 ? n.push(s) : i() ? (n.push(10),
n.push(s - 10)) : (n.push(11),
n.push(s - 6))
}
} catch (t) {
o = !0,
u = t
} finally {
try {
!r && f.return && f.return()
} finally {
if (o)
throw u
}
}
return n
}
, f = function (t) {
e(t instanceof Array);
for (var n = [], r = t.length, i = 0; i < r;)
t[i] < 10 ? n.push(t[i]) : 10 === t[i] ? (i++,
n.push(t[i] + 10)) : (i++,
n.push(t[i] + 6)),
i++;
return n.map(function (t) {
return t.toString(16).toUpperCase()
}).join("")
}
, a = function (t) {
return t.map(function (t) {
return h[2 * t] + h[2 * t + 1]
}).join("")
}
, s = function (t) {
var n = []
, r = !0
, i = !1
, o = void 0;
try {
for (var c, a = t[Symbol.iterator](); !(r = (c = a.next()).done); r = !0) {
var s = c.value
, l = h.indexOf(s);
-1 !== l && (1 & l || n.push(l >> 1))
}
} catch (t) {
i = !0,
o = t
} finally {
try {
!r && a.return && a.return()
} finally {
if (i)
throw o
}
}
var v = f(n);
e(0 == (1 & v.length));
var p = void 0;
try {
p = u(v)
} catch (t) {
throw t
}
return p
}
, h = "富强民主文明和谐自由平等公正法治爱国敬业诚信友善"
function encrypt(t) {
return a(c(o(t)))
}
function decrypt(t) {
return s(t)
}
// 测试样例
// console.log(encrypt("1234"))
// console.log(decrypt("和谐民主和谐文明和谐和谐和谐自由"))

【JS 逆向百例】你没见过的社会主义核心价值观加密的更多相关文章
- 社会主义核心价值观js代码
效果如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 通过JS逆向ProtoBuf 反反爬思路分享
前言 本文意在记录,在爬虫过程中,我首次遇到Protobuf时的一系列问题和解决问题的思路. 文章编写遵循当时工作的思路,优点:非常详细,缺点:文字冗长,描述不准确 protobuf用在前后端传输,在 ...
- 【算法】C语言趣味程序设计编程百例精解
C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1) https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...
- 网络爬虫之记一次js逆向解密经历
1 引言 数月前写过某网站(请原谅我的掩耳盗铃)的爬虫,这两天需要重新采集一次,用的是scrapy-redis框架,本以为二次爬取可以轻松完成的,可没想到爬虫启动没几秒,出现了大堆的重试提示,心里顿时 ...
- 兄弟,你爬虫基础这么好,需要研究js逆向了,一起吧(有完整JS代码)
这几天的确有空了,看更新多快,专门研究了一下几个网站登录中密码加密方法,比起滑块验证码来说都相对简单,适合新手js逆向入门,大家可以自己试一下,试不出来了再参考我的js代码.篇幅有限,完整的js代码在 ...
- JS逆向-抠代码的第二天【手把手学会抠代码】
今天的学习项目:沃支付:https://epay.10010.com/auth/login 清空浏览器缓存后,打开网页,输入手机号,密码222222,按照网站要求填入验证码(sorry,我没有账号密码 ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
- JS逆向之补环境过瑞数详解
JS逆向之补环境过瑞数详解 "瑞数" 是逆向路上的一座大山,是许多JS逆向者绕不开的一堵围墙,也是跳槽简历上的一个亮点,我们必须得在下次跳槽前攻克它!! 好在现在网上有很多讲解瑞数 ...
- 漫谈Python魔术方法,见过的没见过的都在这里了
漫谈Python魔术方法,见过的没见过的都在这里了 就说一下,不深入 假的一览 提到魔术方法,学过python都应该知道一些.至少你得会__init__吧. 在我之前写的博文中有很多都涉及魔术方法.比 ...
- 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...
随机推荐
- target.closest妙用:UI(click/mousemove/drag/drop)事件元素查找捷径
首先看下MDN:https://developer.mozilla.org/en-US/docs/Web/API/Element/closest 在jQuery时代,这个非常常见 $( documen ...
- vue2升级vue3:单文件组件概述 及 defineExpos/expose
像我这种react门徒被迫迁移到vue的,用管了TSX,地vue 单文件组件也不太感冒,但是vue3 单文件组件,造了蛮多api ,还不得去了解下 https://v3.cn.vuejs.org/ap ...
- 总结MySQL 的一些知识点:MySQL 插入数据
MySQL 插入数据 MySQL 表中使用INSERT INTOSQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向 ...
- Jmeter软件测试
1.1. 性能测试是什么 基于协议模拟用户发出请求,对服务器形成一定负载,来测试服务器的性能指标是否满足要求 性能指标关注点:时间性能.空间性能 性能测试与页面无关 性能测试定义:指通过自动化的测试工 ...
- 关于ABAP索引
1.什么是索引 如果把数据库表看做一本书,索引就可以看做书的检索目录.目录中包含书中的大小标题(部分字段数据),并且有对应的数据表条目的页码(指针),可以快速的访问数据库表中对应行的所有字段内容 一个 ...
- 汇编 | 数据段寄存器DS和[address]
Description CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和偏移地址组成.8086CPU中有一个DS寄存器,通常用来存放要访问 数据的段地 ...
- 2018年第九届 蓝桥杯A组 C/C++决赛题解
蓝桥杯历年国赛真题汇总:Here 1.三角形面积 已知三角形三个顶点在直角坐标系下的坐标分别为: (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) 求该三角形的面积. 注意,要提交的是 ...
- 嵌入式软件工程师笔试面试指南-ARM体系与架构
哈喽,大家好.我终于回来了!19号刚提交完大论文,就被抓去出差了,折腾了整整一周,26号晚上,才回到学校.鸽了好久都没更新干货了.今天更新一篇关于Arm的笔试面试题目,文章内容已同步更新在github ...
- 何时使用Kafka而不是RabbitMQ
Kafka 和 RabbitMQ 都是流行的开源消息系统,它们可以在分布式系统中实现数据的可靠传输和处理.Kafka 和 RabbitMQ 有各自的优势和特点,它们适用于不同的场景和需求.本文将比较 ...
- C#树的实现
ddd /// <summary> /// 遍历,线索化等操作的接口 /// </summary> interface ITravelBinTree { void PreOrd ...