Bootstrap

js逆向入门网站分析(某空气质量监测平台)


前言

又要到放假的时间啦,学习了好一段时间的js逆向,想起之前远哥提到的一个js逆向入门的网站,就准备实践一下啦。如果有什么问题呢,欢迎大佬们指出。

一、瞧一瞧网站是啥样呢

网址:aHR0cHM6Ly93d3cuYXFpc3R1ZHkuY24v

进入网址哈,还挺可以的哎。
在这里插入图片描述
但是,很奇怪的事情就突然发生了哎,它变了。
在这里插入图片描述
当我们准备打开控制台准备看看呢,就直接进入了一个VM下的断点呢。
在这里插入图片描述
好吧,那就需要过掉这个检测呢。通过对堆栈的查看,我们点击最开始那个,随便下个断点,然后刷新一下,就可以看到下面的样子呢。
在这里插入图片描述
那下面就是很经典的操作了,在确定txsdefwsw函数并没有很大用的情况下呢,在运行这个函数前随便下个断点,然后直接函数置空
txsdefwsw = function(){}

置空之后呢,直接一键运行到底,啊哈,居然又出现了最开始那样又被检测了。好吧,不过这次注意到了,好像那个字,和上一幅图中 endebug函数一样哎,那好说呢,那就在 endebug函数里面下个断点,看看是哪个调用的呢。
在这里插入图片描述
好家伙呢,居然是个eval执行的呢,既然是eval来执行,那我们就搜一搜嘛,看一看嘛。
有点小惊喜了,发现了有debug detect,那我们就可以猜测是从这两个eval运行中出了问题呢,那怎么办呢,下断点嘛()。看看每个eval出来是什么的结果呢。
在这里插入图片描述
好家伙呢,这两个函数不就是我们上面那幅图的函数嘛,而且既然是你是单独出来的一个函数,那直接上家伙,本地替换,干掉。
在这里插入图片描述
正当我开心的时候,准备一把哈梭的时候又出现问题了…

话不多说,先上图。
在这里插入图片描述
最开始的栈
在这里插入图片描述
又是两个eval,不过呢,有一个很奇妙的地方呢,我们看这个js文件的url地址 : aHR0cHM6Ly93d3cuYXFpc3R1ZHkuY24vaHRtbC9jaXR5X3JlYWx0aW1lLnBocD92PTIuMw==
然后,一打开,好家伙,直接新的开始了啊!!!!
在这里插入图片描述
至于为什么我会关注到这个链接呢,因为你看这个js写得就像一个页面,所以就打开看看喏(这只是个人感觉哈。)

二、新的开始,新的挑战

呀哈,一进来,居然禁止了右键和F12。。。。。。呃,那就多动点几下吧,从工具进入控制台。

进入控制台后,重新刷新一下呢,话不多说上图。
在这里插入图片描述

呃,又发现有两个eval,那就下断点呢。(好像听别人讲eval断不了,但是实践下来又能断,但是好像要看运气,刷几次就能断住呢。不过在刷新前,要清空本地的储存)。如下图:
在这里插入图片描述
因为在加密数据保存在本地存储里面,而这个加密数据是在第二个eval里面的有关函数请求服务器返回的数据。呃,扯远了,先回归正题,然后继续分析这两个eval。
下断成功后,看下第一个解密后的内容吧。
在这里插入图片描述
很神奇呢,一看就是一个检测的js文件。好嘛,那这不简单嘛,就像上面那个对于eval处理的方法嘛,删除大法嘛。嘿嘿,这我就不得不说,小伙子想少了吧,这个js文件是动态变化的,而且更离谱的就是你后面要用的js文件全都是动态的。但目前我只遇到三种情况,再出现其他的情况也没太大关系,在添加一种解决方案就行了噻,问题不大。呃,好像又走远了,下面看看第二个eval是啥,反正就是很重要的东西。后面分析的时候在具体聊聊。

2.1通过第一个 eval

因为这个eval运行的结果,是一个检测的js文件嘛,所以不过掉这个对于我们后面的调试并不太友好呢。我这边用的方法就是置空。如下图:

在这里插入图片描述
这样就过掉啦,如果各位大佬还有其他方法,dddd啊。

2.2分析第二个eval

在这里插入图片描述
分析第二个eval揭秘出来的,那一排绿色的字,真的好亮眼呀,真喜欢这样的注释呢。所以下面的都是重点,怎么办呢,下断点呀,为了稳妥能下几个就下几个,我就不相信他不会断下来呢。
一键哈梭!!!
发现关键点在
在这里插入图片描述
这个函数呢,进去一看
在这里插入图片描述
看这几个关键点,这我就不得不说了,我之前一直在想被加密的数据为什么没有在浏览器抓包中看到,知道我用了fiddle,才在fiddle上看到。然后就想到,可能是XMLHttpRequest从后台请求数据的,不太懂的可以看这篇文章呢。看这里看这里XMLHttpRequest

从上面那个图,我们还是可以看到很多东西,比如请求的url,请求的形式是post,还有请求时的data参数是什么,如何对加密数据解密的。只要我们得到这些就可以模拟请求得到加密数据啦。这不是离目标又进了一步呢。

三、模拟得到服务器传回的数据

现在呢,停下来理一理思路。我们当前的目标就是得到服务器返回的的数据,因为是post请求,那么就需要相关参数,那如何获得参数呢,首要目标就是需要当前的js文件,因为我们可以看到,无论是请求还是数据的解密,都涉及这个js文件,拿到这个文件就是我们首要的目标。

3.1如何得到关键js文件

前文提到,这个js文件是动态的,那么如何得到呢?慢慢找吧,而且看文件执行也是一个eval,那么是否我们可以猜测也想之前那种,eval运行解密后的字符串呢?(当然呢这是我搞完后写的嘛,难免有些作弊的感觉。),那现在找一找吧。
这个东西也是难搞哦。。。。。。反正一顿乱找,哎,就找到了。

在这里插入图片描述
看着文件就很怪,同时也是一个eval执行的,就很值得怀疑,加上它在很前面的位置,所以我们可以开启事件监听中的脚本拦截,一个一个js文件执行看一看。

在这里插入图片描述
突然,运行到这里,是不是值得留意一下呢,都很直白的告诉你了,这点又encrypt和decode,那就看一下这两个eval是什么样子呢
在这里插入图片描述
这个是一个base64这些嘛看下另外一个呢。
在这里插入图片描述
一个小小的函数呢。
这里就要停一停了,因为之前那些js文件都是动态的,我们是否也需要去思考和验证这个js文件是否也是动态的呢。不过好在,这两个不是动态的,耶耶,那代表如果后面需要用到,可以直接写死。
继续执行。。。。。

挺好的,下一个就是我们要去看的js文件,那就看看结果处理啊的结果是什么样子的呢?
在这里插入图片描述
这点就必须提一下了,看这个函数名字和我们上一步那个函数名字是不是一样的啊。那通了呀。先去请求这个url,然后用上面两个函数 (因为是固定的可以写死)直接解密出来,不就是我们需要的嘛,但不能这么肯定嘛,万一不是这个地方就很尬尴了呀,那就继续走几步走几步看看结果嘛
在这里插入图片描述
这是很妙吧。
那这个时候就又有问题了,它是eval运行出来的结果,我们得到呢?

3.2如何模拟运行eval

这里有个大佬使用selenium得到的结果,看这里啊
但是呢,我采用另一种方法,可以先看下这篇文章了解一下eval
既然它是一个eval,无法把结果导出来,那我是不是可以在函数里面加点料呢,我能不能把最后得到的结果变成全局变量呢?可以吧,就像这样
在这里插入图片描述
这是结果呢
在这里插入图片描述
但这个是运气好的情况下才能这样的结果,因为前文提到,js文件是动态变化的,这个呀也是动态变化的,但好在情况不多,我目前碰到四种,只是需要对不同结果进行不同的分析。
这是我收集到的三种情况以及处理的方式:
1.一种是直接出结果 结果不含换行
2.eval(dswejwehxt(dswejwehxt 这种 结果含换行
3.eval(dswejwehxt( 结果含换行 提取出参数后调用dswejwehxt 就直接出结果
4.eval(dswejwehxt( dswejwehxt 处理后是一个eval(function,然后需要再来一次get_decode 结果不含换行
这其中里面有些是含有换行的有些是不含有换行的,这些就有些烦,因为后面需要用正则来匹配参数,又要分不同的情况来写。这里有个小注意的的问题,含有换行的结果使用execjs来运行js,好像会报错,不知道你们会不会,反正我是有些问题,然后我就采用了VM2,就没有报错啦,如果你们也遇到了可以采用VM2来试一试。
而对于上面的四种情况,可以自己收集一下,因为我后面是用正则来匹配一些关键的东西,保存下来可以方便后面的调试。

3.3匹配参数

再得到了最最关键的js文件的明文后,后面的就是很简单的事了。(其实最关键的就是得到这个文件的明文,下面就是我自己去得到参数的方法,但不知这一种呢)
直接上正则匹配,再次回到最开始图呢
在这里插入图片描述
注意一下哈,这些都是变化的哈。
先分析var p9AZyDB = pvSQ9fn9Fva0v8zu(m6215FQX6, oqMQlv3Qpg);
其中里面的m6215FQX6, oqMQlv3Qpg,这俩都是固定的,我们只需要正则找到这个函数名,然后传入参数,接受返回值的就行了噻。
还有呢,因为上文提到,结果是含有换行和不换行之分,所以可能需要单独分情况匹配得到结果。

3.4发出请求

因为上一个图中展示了url,同时也经过上面的分析也得到了请求的参数,那就直接上请求。但这个请求有些意外。看这里吧
自己可以用fiddle去看一下这个是什么类型请求。

3.5解密数据

在这里插入图片描述
再次看这一副图,就是这点,也可以采取正则提取函数名,然后传入上一步中得到的数据,进行解密就行啦。
好啦就没啦,最后还得拿出结果,看一下是否成功嘛,没结果上面说的都是假的嘛
在这里插入图片描述

;