-
-
[原创]某团外卖H5版本爬虫开发和JS逆向过程
-
发表于:
2019-9-18 22:21
3865
-
对于一般的H5爬虫,大致需要的技术可参见下图。
今天主要以某团外卖为例介绍一下相关技术。
请拿好小本本。Let's Go.
首先,我们用chrome打开网站:fafK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3R3#2i4K6u0W2N6$3q4A6L8h3q4A6i4K6u0W2L8h3g2A6N6s2g2S2L8W2)9J5k6h3y4G2L8g2)9J5c8W2!0q4x3#2)9^5x3q4)9^5x3V1j5I4x3W2!0q4y4W2)9^5z5g2)9&6x3#2!0q4y4g2!0n7b7#2)9^5x3q4!0q4y4g2!0n7b7#2)9^5x3q4!0q4y4g2)9^5c8W2)9&6x3g2!0q4z5q4)9^5x3q4)9^5y4g2!0q4y4g2!0n7y4#2!0m8y4g2!0q4y4g2)9^5y4g2!0n7y4#2!0q4c8W2!0n7b7#2)9^5b7#2!0q4z5q4!0n7c8W2)9&6z5g2!0q4y4W2)9&6y4#2!0n7y4W2!0q4y4g2)9&6b7#2!0m8z5p5&6W2N6s2N6G2M7X3E0Q4c8e0g2Q4b7U0m8Q4b7U0q4Q4c8e0S2Q4z5o6y4Q4b7V1c8Q4c8e0N6Q4z5f1y4Q4z5p5u0Q4c8e0g2Q4z5o6S2Q4b7U0m8Q4c8e0N6Q4z5f1u0Q4b7U0S2Q4c8e0g2Q4z5o6g2Q4b7U0y4Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0S2Q4b7f1k6Q4b7U0N6Q4c8e0k6Q4b7U0q4Q4z5o6u0Q4c8e0k6Q4z5p5g2Q4b7e0g2Q4c8e0g2Q4z5p5k6Q4b7e0y4Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8e0y4Q4z5o6m8Q4z5o6t1`.
83aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6A6i4K6u0W2N6$3q4A6L8h3q4A6i4K6u0W2L8h3g2A6N6s2g2S2L8W2)9J5k6h3y4G2L8g2)9J5c8X3!0H3k6h3&6Z5y4g2)9J5c8X3S2G2L8h3g2H3j5h3N6W2i4K6u0r3M7r3!0A6L8r3W2K6N6q4)9K6c8W2)9#2k6W2)9K6c8o6p5#2y4U0M7%4y4o6R3^5y4U0x3^5x3U0k6Q4x3U0k6S2L8i4m8Q4x3@1u0j5i4K6u0V1c8V1!0d9i4K6u0V1g2@1W2f1d9q4)9K6c8s2N6v1c8K6g2#2y4p5H3H3i4K6t1#2x3V1k6%4h3s2y4K9f1h3H3$3P5i4W2%4L8i4m8d9y4$3#2f1j5e0u0e0d9f1g2i4e0V1x3&6y4h3g2j5c8p5E0k6b7#2)9J5y4e0u0r3P5q4)9J5y4e0u0r3c8g2f1&6L8o6W2I4e0W2y4k6d9g2p5H3b7f1g2a6c8p5u0g2K9h3!0U0N6e0u0S2y4W2N6S2g2r3u0d9f1h3@1#2i4K6t1#2x3V1u0V1h3e0c8F1f1q4u0J5c8p5&6V1i4K6t1#2x3V1u0$3L8o6c8V1e0$3k6I4e0K6W2v1k6f1A6t1y4K6y4S2k6V1A6W2j5$3c8p5z5q4x3K6b7$3N6Y4z5i4t1%4b7%4u0c8d9f1E0&6c8e0u0m8g2h3f1@1f1r3E0U0d9Y4y4t1e0#2c8*7g2W2b7%4N6h3A6e0c8r3g2m8i4K6t1#2x3@1c8Q4x3U0f1K6c8l9`.`.
其中URL中相关参数就俩:

然后看Body中的参数:

这是我们发现,需要逆向的参数有三个,分别是:UUID、X-FOR-WITH、_token。
先看_token,这个参数一眼望过去就是个base64加密的参数,但是我们尝试base64解密一下,不可见字符。那现在我们来逆一下吧。
首先,看到这个请求的关键字。

然后,设置URL断点。

右边就是调用堆栈,可以从上到下分析一下代码的调用逻辑,我们会找到,在函数default里面,看到了疑似的生成参数的地方。

我们重新在上面打上断点,重新出发请求,程序将停止在我们的断点位置。然后我们跟进上面的_token生成的i函数。

我们看到,reload返回的结果由iI函数生成。

而查看,iI函数可以看到,deflate,这是一个压缩算法!那压缩完应该干什么呢,肯定是base64啊!
所以原始数据肯定是经过压缩再base64加密得到的。
我们再“回到最初的起点~”,我们对那串base64解密以后,看到的不可见字符。

这个78 9C的头太标志了。好了我要把我珍藏多年的秘籍告诉你们一下。
如果之前我先看一下hex我就不用逆向JS了。这用zlib就能解开了啊。我们试一下。![]()
最终看到,的确解开了。其中的sign参数也是一样的办法就能解开。所以对于这种情况我们应该长个记性,看一眼HEX。
再看参数x-for-with。
按照刚才一样的办法,我找了半天也没找到这个参数的生成过程,在所有调用过程中,看到的都是不带这个参数的,可是发出去的时候,就加上了。好奇怪啊。

看看上面的hookAjax,恍然大悟啊。怪不得之前没找到,他是修改了原生的收发函数添加的部分参数,我们看到open函数里有添加URL参数的代码,这个w()函数就是参数的名字,我们看一眼。

哎唷,写得这么隐秘,把数字转字符,之前还加个1。事出反常必有妖!
好了那这个w()函数所对应的值就是我们要的了,再看刚才那张图。

这下很明显了,加密算法,key,iv,模式,填充都有了。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课