目录

js逆向分析思路

js逆向破解思路: 模拟重现


在学习js逆向思路之前,我们先来了解参数的几种常见的加密方式

加密: 就是通过某种算法将原本的数据内容加密为特殊位数的参数

加密方式:

(1)Md5加密: 通过md5加密会生成一个16位或者32位的加密参数. 特征位数: 16. 32

(2)对称加密DES/AES两个: 就是加密和解密用的是同一把钥匙.     特征: 秘钥唯一

(3)非对称加密RSA: 就是有加密公钥和解密私钥.      特征: 加密解密钥匙不唯一

(4)base64伪加密: 其实是将数据以另外一种编码方式呈现.  特征: 表示真正的加密算法

了解完之后,在js逆向破解的加密的时候,首先的任务是判断他是什么方式加密,

申明一下,加密方式不止上面四种.只是这四个常见.

在我们爬虫js逆向是非常重要的技能.往往在我们请求网页的时候需要的参数就是加密后的参数.每次还不一样.无法固定参数请求.所有我们需要找到绑定 js 事件.

js逆向分析思路

一般步骤为:

(1)复制加密参数的键名

(2)Ctrl + Shift + F 键快捷通过search搜索该键名定位js加密文件,一般会出现几个,选择第一个就OK, 会自动跳转到对应的 js 文件

(3)然后Ctrl + F 键快捷通过元素(该键名)绑定事件的监听函数

(4)在几个监听函数后打上断点, 然后点击执行或者刷新网页,通过断点停止和参数信息判断如何加密的,如果在里面看到关键加密方式,就说明这很大几率是加密过程.

(5)通过一步一步断点,分析加密参数是如何产生的.

现在以有道翻译在线为例:

search搜索定位js文件

开始断点分析

知道如何生成的就是好办了

js逆向如何破解参数加密,从而得到我们需要的参数,正确请求数据包.是爬虫请求哦

js逆向破解思路: 模拟重现

需求: 获得加密后的密文作为sign的参数

(1) 利用python代码还原 js执行过程获取结果

(2) 利用 复制 js文加密事件js代码到你的 js 文件中, 执行 该js文件模拟生成加密参数获取结果.

!!!  这两种方法都将逐个讲解

(1)在爬虫代码中创建一个方法函数,获取我们需要的参数


def get_data(self, word):
"""
代码构造我们需要的参数.   word 为我们传入的输入要翻译的原文字符串
这里获取时间戳,用time模块实现,时间戳*1000. 因为时间戳以毫秒为单位,
md5加密这里需要导包, from hashlib import md5
加密用的两个字符串在js文件中复制下来
"""# 时间戳 tslts = str(int(time.time() * 1000))# 时间戳 + 随机数(0,9)salt = lts + str(random.randint(0, 9))# sign md5加密s = md5()  # 实例化对象string = "fanyideskweb" + word + salt + "Y2FYu%TNSbMCxc3t2u^XT"  # 待加密数据s.update(string.encode())  # 传入待加密数据sign = s.hexdigest()  # 加密数据改为16进制.# bv 参数不变,可以从js断点模式下复制下来写死.bv = n.md5(navigator.appVersion)  # 我这里构造了bv的产生过程,其实和js里面一样 data02 = self.get_data_02(word)

(2)创建一个js文件,然后我们去js加密文件中复制md5事件加密js代码到我们的js文件中

上面的md5也在下面这个方法里面

创建的js文件如下,内容已经粘贴,部分修改,方便执行

//这里将复制的一个方法分成两个方法
var n = function (e, t) {return e << t | e >>> 32 - t
}, r = function (e, t) {var n, r, i, o, a;return i = 2147483648 & e,o = 2147483648 & t,n = 1073741824 & e,r = 1073741824 & t,a = (1073741823 & e) + (1073741823 & t),n & r ? 2147483648 ^ a ^ i ^ o : n | r ? 1073741824 & a ? 3221225472 ^ a ^ i ^ o : 1073741824 ^ a ^ i ^ o : a ^ i ^ o
}, i = function (e, t, n) {return e & t | ~e & n
}, o = function (e, t, n) {return e & n | t & ~n
}, a = function (e, t, n) {return e ^ t ^ n
}, s = function (e, t, n) {return t ^ (e | ~n)
}, l = function (e, t, o, a, s, l, c) {return e = r(e, r(r(i(t, o, a), s), c)),r(n(e, l), t)
}, c = function (e, t, i, a, s, l, c) {return e = r(e, r(r(o(t, i, a), s), c)),r(n(e, l), t)
}, u = function (e, t, i, o, s, l, c) {return e = r(e, r(r(a(t, i, o), s), c)),r(n(e, l), t)
}, d = function (e, t, i, o, a, l, c) {return e = r(e, r(r(s(t, i, o), a), c)),r(n(e, l), t)
}, f = function (e) {for (var t, n = e.length, r = n + 8, i = 16 * ((r - r % 64) / 64 + 1), o = Array(i - 1), a = 0, s = 0; s < n;)a = s % 4 * 8,o[t = (s - s % 4) / 4] = o[t] | e.charCodeAt(s) << a,s++;return t = (s - s % 4) / 4,a = s % 4 * 8,o[t] = o[t] | 128 << a,o[i - 2] = n << 3,o[i - 1] = n >>> 29,o
}, p = function (e) {var t, n = "", r = "";for (t = 0; t <= 3; t++)n += (r = "0" + (e >>> 8 * t & 255).toString(16)).substr(r.length - 2, 2);return n
}, h = function (e) {e = e.replace(/\x0d\x0a/g, "\n");for (var t = "", n = 0; n < e.length; n++) {var r = e.charCodeAt(n);if (r < 128)t += String.fromCharCode(r);else if (r > 127 && r < 2048)t += String.fromCharCode(r >> 6 | 192),t += String.fromCharCode(63 & r | 128);else if (r >= 55296 && r <= 56319) {if (n + 1 < e.length) {var i = e.charCodeAt(n + 1);if (i >= 56320 && i <= 57343) {var o = 1024 * (r - 55296) + (i - 56320) + 65536;t += String.fromCharCode(240 | o >> 18 & 7),t += String.fromCharCode(128 | o >> 12 & 63),t += String.fromCharCode(128 | o >> 6 & 63),t += String.fromCharCode(128 | 63 & o),n++}}} elset += String.fromCharCode(r >> 12 | 224),t += String.fromCharCode(r >> 6 & 63 | 128),t += String.fromCharCode(63 & r | 128)}return t
};function md5(e) {var t, n, i, o, a, s, m, g, v, y = Array();for (e = h(e),y = f(e),s = 1732584193,m = 4023233417,g = 2562383102,v = 271733878,t = 0; t < y.length; t += 16)n = s,i = m,o = g,a = v,s = l(s, m, g, v, y[t + 0], 7, 3614090360),v = l(v, s, m, g, y[t + 1], 12, 3905402710),g = l(g, v, s, m, y[t + 2], 17, 606105819),m = l(m, g, v, s, y[t + 3], 22, 3250441966),s = l(s, m, g, v, y[t + 4], 7, 4118548399),v = l(v, s, m, g, y[t + 5], 12, 1200080426),g = l(g, v, s, m, y[t + 6], 17, 2821735955),m = l(m, g, v, s, y[t + 7], 22, 4249261313),s = l(s, m, g, v, y[t + 8], 7, 1770035416),v = l(v, s, m, g, y[t + 9], 12, 2336552879),g = l(g, v, s, m, y[t + 10], 17, 4294925233),m = l(m, g, v, s, y[t + 11], 22, 2304563134),s = l(s, m, g, v, y[t + 12], 7, 1804603682),v = l(v, s, m, g, y[t + 13], 12, 4254626195),g = l(g, v, s, m, y[t + 14], 17, 2792965006),m = l(m, g, v, s, y[t + 15], 22, 1236535329),s = c(s, m, g, v, y[t + 1], 5, 4129170786),v = c(v, s, m, g, y[t + 6], 9, 3225465664),g = c(g, v, s, m, y[t + 11], 14, 643717713),m = c(m, g, v, s, y[t + 0], 20, 3921069994),s = c(s, m, g, v, y[t + 5], 5, 3593408605),v = c(v, s, m, g, y[t + 10], 9, 38016083),g = c(g, v, s, m, y[t + 15], 14, 3634488961),m = c(m, g, v, s, y[t + 4], 20, 3889429448),s = c(s, m, g, v, y[t + 9], 5, 568446438),v = c(v, s, m, g, y[t + 14], 9, 3275163606),g = c(g, v, s, m, y[t + 3], 14, 4107603335),m = c(m, g, v, s, y[t + 8], 20, 1163531501),s = c(s, m, g, v, y[t + 13], 5, 2850285829),v = c(v, s, m, g, y[t + 2], 9, 4243563512),g = c(g, v, s, m, y[t + 7], 14, 1735328473),m = c(m, g, v, s, y[t + 12], 20, 2368359562),s = u(s, m, g, v, y[t + 5], 4, 4294588738),v = u(v, s, m, g, y[t + 8], 11, 2272392833),g = u(g, v, s, m, y[t + 11], 16, 1839030562),m = u(m, g, v, s, y[t + 14], 23, 4259657740),s = u(s, m, g, v, y[t + 1], 4, 2763975236),v = u(v, s, m, g, y[t + 4], 11, 1272893353),g = u(g, v, s, m, y[t + 7], 16, 4139469664),m = u(m, g, v, s, y[t + 10], 23, 3200236656),s = u(s, m, g, v, y[t + 13], 4, 681279174),v = u(v, s, m, g, y[t + 0], 11, 3936430074),g = u(g, v, s, m, y[t + 3], 16, 3572445317),m = u(m, g, v, s, y[t + 6], 23, 76029189),s = u(s, m, g, v, y[t + 9], 4, 3654602809),v = u(v, s, m, g, y[t + 12], 11, 3873151461),g = u(g, v, s, m, y[t + 15], 16, 530742520),m = u(m, g, v, s, y[t + 2], 23, 3299628645),s = d(s, m, g, v, y[t + 0], 6, 4096336452),v = d(v, s, m, g, y[t + 7], 10, 1126891415),g = d(g, v, s, m, y[t + 14], 15, 2878612391),m = d(m, g, v, s, y[t + 5], 21, 4237533241),s = d(s, m, g, v, y[t + 12], 6, 1700485571),v = d(v, s, m, g, y[t + 3], 10, 2399980690),g = d(g, v, s, m, y[t + 10], 15, 4293915773),m = d(m, g, v, s, y[t + 1], 21, 2240044497),s = d(s, m, g, v, y[t + 8], 6, 1873313359),v = d(v, s, m, g, y[t + 15], 10, 4264355552),g = d(g, v, s, m, y[t + 6], 15, 2734768916),m = d(m, g, v, s, y[t + 13], 21, 1309151649),s = d(s, m, g, v, y[t + 4], 6, 4149444226),v = d(v, s, m, g, y[t + 11], 10, 3174756917),g = d(g, v, s, m, y[t + 2], 15, 718787259),m = d(m, g, v, s, y[t + 9], 21, 3951481745),s = r(s, n),m = r(m, i),g = r(g, o),v = r(v, a);return (p(s) + p(m) + p(g) + p(v)).toLowerCase()
}
/*在复制粘贴元素定位生成参数那块方法一个方法, 原来的e就是输入的需要翻译的原字符串,这里用word代替,然后方法内返回我们需要的参数大字典*/
function model(word) {var t = "42be87a1ed7e55bfce1896cea0343d6b", r = "" + (new Date).getTime(), i = r + parseInt(10 * Math.random(), 10);return {lts: r,bv: t,salt: i,sign: md5("fanyideskweb" + word + i + "Y2FYu%TNSbMCxc3t2u^XT")}
};

作完这些我们还没有真正获取参数.还需要执行该js文件

import execjs"""
在execjs模块中可以用compile()阅读js代码, call('调用的函数名', 传入的参数)执行js代码的某个函数
最后这里的r, 接收返回来的参数大字典
"""def get_data_02(self, word):f = open('js逆向.js', 'r')js = execjs.compile(f.read())r = js.call('model', word)return r

我们已经成功获取加密参数.可以开始有道翻译的爬虫了.

这样就可以自己借用有道作一个翻译工具

今天就学习到这里.明天继续加强 js 逆向的思维

&励志语录

        努力,是为了跳出你厌恶的圈子。读书,是为了远离渣货垃圾人。健身,是为了让讨厌的人心平气和的跟你说话。唯有成为了更好的自己,世界才是你的 !!

学习笔记--爬虫(11)---js逆向思路和解密思路(初级)相关推荐

  1. python3爬虫进阶JS逆向学习(十一)

    目的 目的:JS逆向的学习与交流 目标:分析咪咕音乐参数 目标网址:https://music.migu.cn/v3 // 若有侵权,请联系作者删除,谢谢! 思路分析 一.内容概览 二.请求参数分析 ...

  2. Python爬虫之Js逆向案例(2)-某乎搜索

    Python爬虫之Js逆向案例(2)-知乎搜索 声明:某乎加密逆向分析仅用于研究和学习 大家好,今天继续分享关于某乎关键词搜索接口为案例的Js逆向实战.如果你是一名新手,而且还没有来得及看上一篇< ...

  3. Python爬虫之Js逆向案例(6)-某道翻译

    Python爬虫之Js逆向案例(6)-有道翻译 声明:某道翻译加密逆向分析仅用于研究和学习,如有侵权,可联系删除 大家好,距离上次分享js逆向案例已经有一个月了,在这期间每次在快要揭秘出来时.整理文章 ...

  4. Python爬虫:利用JS逆向抓取携程网景点评论区图片的下载链接

    Python爬虫:利用JS逆向抓取携程网景点评论区图片的下载链接 1. 前言 2. 实现过程 3. 运行结果 1. 前言 文章内容可能存在版权问题,为此,小编不提供相关实现代码,只是从js逆向说一说到 ...

  5. Python爬虫之Js逆向案例(8)-某乎x-zst-81之webpack

    声明:某乎加密逆向分析仅用于研究和学习,如有侵权,可联系删除 大家好,相信各位童鞋通过上期<Python爬虫之Js逆向案例(7)-知hu最新x-zse-96之rpc方案>这篇文章了解了什么 ...

  6. Linux第二周学习笔记(11)

    Linux第二周学习笔记(11) 2.17 隐藏权限lsattr_chattr chattr命令:是设置吟唱隐藏权限的命令,更改Linux文件系统上的文件属性. 参数说明: A:表示文件或目录的ati ...

  7. FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析

    FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...

  8. C# 学习笔记(11)蓝屏小工具

    C# 学习笔记(11)蓝屏小工具 加载界面参考 C# Winform 现代化扁平化启动界面设计https://www.bilibili.com/video/BV17E41147wM PS做一张图 70 ...

  9. 深度学习笔记(11) 超参数调试

    深度学习笔记(11) 超参数调试 1. 选择合适的范围 2. 超参数调试实践 1. 选择合适的范围 关于训练深度最难的事情之一是要处理的参数的数量 学习速率 a 到 Momentum(动量梯度下降法) ...

  10. Java编程思想学习笔记-第11章

    <?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...

最新文章

  1. 2019 数据竞赛年鉴联合发布!250页竞赛方案合集
  2. 全球气候变迁 物联网技术为农业保驾护航
  3. linux shell grep 搜索数据 赋值变量 没有换行符
  4. matlab中fminunc函数使用方法,[分享]无约束非线性规划函数\fminunc函数使用方法(MATLAB)...
  5. 上学路线 (Standard IO)
  6. C语言数组中找到第一个重复元素的算法(附完整源码)
  7. 链表排序c++代码_[链表面试算法](一) 链表的删除-相关题型总结(6题)
  8. rbac 权限分配, 基于formset实现,批量增加
  9. 将excel数据导入到SQL server数据库的详细过程
  10. PCWORLD评出的十大杀毒软件
  11. Xcode8 10大新特性
  12. ubuntu 截图工具flameshot(火焰截图)
  13. 深度学习在情感分类中的应用
  14. Java函数式编程学习——Stream流
  15. LABVIEW_课堂笔记 随机(十二)变量
  16. 将时间戳转换为日期格式:moment、new Date()
  17. Golang配合QQ机器人获取Pixiv ea7e6c5a5f673669f0d56d8f39056eae每日列表并发送涩图(未完)
  18. 医咖会免费STATA教程学习笔记—如何安装新命令
  19. minio:安装部署并安装成windows服务
  20. c语言复制粘贴快捷键_windows复制粘贴快捷键,windows系统复制粘贴快捷键

热门文章

  1. TSO、UFO、GSO、LRO、GRO和RSS介绍(ethtool命令)
  2. 一点浩然气,千里快哉风(修炼孟子浩然之气)
  3. php上位机,OV7670摄像头上位机软件源码
  4. 去哪儿网2018春招软件开发工程师、前端开发工程师编程题 - 题解
  5. php保存pdf旋转90度,如何将PDF图片旋转90度,盘点这个小方法
  6. 判断常用贴片元器件正负极简述(嵌入式硬件篇)
  7. 做一行就要把一行的本质研究透
  8. 张磊:什么才是企业真正的护城河
  9. word2019每页设置不同页眉
  10. “踢群第一案”上热搜的背后