18

JS逆向- 豆瓣读书搜索加密逻辑分析

 3 years ago
source link: http://xianyucoder.cn/2020/07/16/%E6%AF%8F%E6%97%A5JS-%E8%B1%86%E7%93%A3%E8%AF%BB%E4%B9%A6/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

aHR0cHM6Ly9zZWFyY2guZG91YmFuLmN

vbS9ib29rL3N1YmplY3Rfc2VhcmNoP3NlYX

JjaF90ZXh0PSVFNCVCOCU5QyVFOSU4NyU4

RSVFNSU5QyVBRCVFNSU5MCVCRSZjYXQ9M

TAwMQ==

抓包与定位加密位置

上面就是这次需要分析的网站了,先简单看看抓包的结果。【图1-1】

抓包很清楚,这次分析的网站加密的地方是他的搜索结果。

通过查看网页源码可以看到加密的地方。【图1-2】

这里的 window.__DATA 的值就是搜索的结果。

我们直接搜索这个值就可以找到解密的地方。【图1-3】

这个网站的加密算法不同于之前我们分析的固定算法,我们先打上断点看看。

通过调试我们可以看到解密的核心算法的位置。【图2-1】

先看看他解密后的值是什么样,确认下没有找错位置。【图2-2】

解密后的明文通过比对就是我们需要的内容。

接下来就是分析解密算法的部分了。

咸鱼自己动手扣了一下,加密在前半段的地方不难,不过有许多部分需要重新改写,所以建议大家自学Javascript部分语法,特别是实例化和原型对象的内容以及运算符中的三元表达式。

三元表达式

// 表达式1 ? 表达式2 : 表达式3
var b = 1, c = 1;
var a = b == c ? 3:6
console.log(a)
function xianyu(){
this.name = 'xianyu',
this.age = '18'
}

xianyu.prototype.hair = function(){
return '茂密'
}

var xianyu1 = new xianyu()
var xianyu2 = new xianyu()
console.log(xianyu1.hair)
console.log(xianyu2.hair)
console.log(xianyu1.hair == xianyu2.hair)

同时需要注意的是这里的加密代码都是用n、a、c、S、s这类无语义的代码替换而成的。且因为许多部分需要重新改写所以在改写的时候方法命名一定要用使用规范,不要直接复制。

我们先看下核心解密的部分代码

var a = e.from(r, "base64"), s = Math.max(Math.floor((a.length - 2 * i) / 3), 0), u = a.slice(s, s + i);
a = e.concat([a.slice(0, s), a.slice(s + i)]);
var c = Object(o.hash)(e.concat([u, e.from(t)]));
return n((l = {},l[c] = a,l));
var l

前三行的方法没有什么难度,到关于c的定义部分的时候,o.hash这个方法里面有很多三元表达式以及原型对象的使用,需要逐步打断点的,逐个补齐。(适合新手)

或者直接将原型对象xxx.prototype这种整体抠出来再改写也是可以的(适合老手)

能够弄清楚上面的两块内容,特别是原型的内容,这个加密就很简单了。

接下来就是抠出代码的时候,使用 Python 运行出现编码报错的坑。

这个在前人的文章中有提到,咸鱼这里就直接指出修改的地方,就不赘述了。

subprocess.py 这个 python 文件中 类的初始化位置改下编码类型为 utf-8 即可

接下来 po 下运行截图:


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK