以下文章来源于咸鱼学Python ,作者煌金的咸鱼
aHR0cHM6Ly9mZW5iaS5jb20vcGFnZS9ob21l
先抓包看看这次分析的参数【图1-1】
这个参数的值看着像Base64
,我们不急着下结论,先搜索参数名看看。
有读者朋友纠结于搜索password = or password:
这样需要搜索两遍是不是浪费时间了,不如直接搜索password
来的方便快捷。
咸鱼之所以这样搜索是出于自己的习惯,定位加密位置的方法有很多大家有兴趣可以多尝试不要局限于搜索参数,例如:Js Hook,XHR 断点等等,怎么舒服怎么来就好。
经过搜索参数名password:
在一个文件中定位到 3 处疑似加密的位置。【图1-2】
图1-2
这里有两种方法判断加密位置:
我们用第一种试试,打上断点重新发起请求,可以看到成功断上了。【图1-3】
这里的this.password
是测试的密码,我们需要分析的就是这个this.encrypt
的逻辑是什么样的。
图1-3
我们进入到this.encrypt
这个函数中,发现有熟悉的 RSA 加密标志this.publicKey
【图1-4】
图1-4
在文件中再搜索一次publicKey
,能够看到文件中已经声明了这个变量【图1-5】
图1-5
继续进入到函数内部查看逻辑,发现进入的就是加密逻辑的文件了。【图1-6】
图1-6
这一整个流程分析下来,可以发现前面的传参部分,在Python
调用中我们完全可以跳过,只要给【图1-6】中的Js加密逻辑传入publicKey
与明文密码
就可以实现这个网站的密码加密逻辑了,既然这么简单,我们就动手试试。
接上面的分析,我们直接复制了【图1-6】截图所示的全部代码。
接着在编辑器中加上一些我们自己的逻辑类似这样【图2-1】。
图2-1
注:前939行都是复制的 Js 文件代码
试着运行一下,看看报错。
运行的报错提示,window is undefine
【图2-2】,遇到这种情况我们可以试试在代码上加上window
的声明。
图2-2
var window = {}
再次运行看看,这里再次提示{} is not a function
,【图2-3】到这里新手朋友有点慌了,不知道怎么处理。
图2-3
比较方便的处理方式是直接在(function(av) {
前加上!
,就是这么简单。
具体用法,这里套用一下百度:
使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数。也就是说,任何能将函数变成一个函数表达式的作法,都可以使解析器正确的调用定义函数。而 ! 就是其中一个,而 + - || 都有这样的功能。
继续调试,这次提示变成了navigator is not defined
【图2-4】
图2-4
有了上次的经验,我们在代码里加入声明navigator
。
var navigator = {}
再次运行就得到加密后的结果咯~【图2-5】
图2-5
这次的加密是比较简单的 RSA 加密,使用文件中包含的公钥对密码的值进行加密,且Js代码没有进过混淆,适合新手练手增加手感。