当你写爬虫遇到APP的请求有加密参数时该怎么办?【初级篇-常规模式】

嗯,在看完了《当你写爬虫抓不到APP请求包的时候该怎么办?》系列以后,同窗们对抓APP的请求包应该已是轻车熟路了吧。在对想爬的APP抓个包以后你可能会发现,只是抓到包彷佛没有什么卵用啊,凡有用的接口基本都有一个或多个加密的参数,并且它还每次请求都变,而本身去请求对应的接口时,若是没带或者随便输入一串值给这种参数,还会出现不返回数据的状况,这可怎么办才好?安全

别担忧,据我观察,目前至少80%左右的常见APP(BAT这类大厂的除外)在安全方面作的并很差,在看完这篇文章以后,你将知道如何轻松地拿下它们。网络


咱们直接开始实战演练吧,这里我写了一个演示用的APP给你玩,它会像我前面所说的同样,发出一个请求并带有一个加密参数——sign,且每次请求时sign都会变化。工具

APP启动界面

安装以后打开它,并准备好你的抓包工具,而后点击“点击发送请求”按钮。测试

请求完毕

不出意外的话会出现一个“sign校验经过”的提示,而后咱们看看抓到的包吧。ui

抓包结果

从抓包工具中咱们能够很明显地看出来,会变更的参数有两个,一个是ts,一个是sign。(为了看到变化建议多发两个请求对比)加密

先分析一下参数的含义吧,ts从名字上能够看出来,应该是个时间戳,实际将ts的值格式化一下也能够肯定这就是个请求时的时间戳;而后是sign,一眼看上去大概32位左右,而外观长这样的通常是hash,猜想一下最有可能性的是md5之类的,但不知道实际是如何生成的,只能逆向看看了。3d


该正式开始破解这个加密参数了,因为Android APP是静态编译的,不像JS,直接能够看到源码,因此...咱们须要对APP进行反编译,这里我使用的工具名为Jadx,前面的《写APP爬虫会须要用到哪些工具呢?》和《当你写爬虫抓不到APP请求包的时候该怎么办?【高级篇-混淆致使通用Hook工具失效】》文章中也有提到,这里就再也不赘述了。cdn

使用jadx反编译APK

反编译以后能够看到这么一堆乱七八糟的的东西,那么咱们要怎么找到生成sign参数的地方呢?blog

看到那个像魔法棒同样的按钮了吗?点一下它。排序

jadx搜索文本

而后它会弹出一个“搜索文本”的窗口,接着咱们有两种方式快速定位到生成的位置:

  1. 搜索URL的路径部分

    路径部分指的是/learning/hash_sign这一段,固然有些APP为了复用可能会将路径拆分红多段的,若是直接搜索完整路径搜索不到的话能够尝试以反斜杠为分隔符,将路径拆分红多个来搜(记得从右往左搜,别问为何),这里的话咱们直接搜索hash_sign便可,由于这个名字很独特,通常应该不会出现有其余不相关的东西也叫这个名字的状况。

    一搜就能定位到请求的位置了~

    经过搜索路径方式定位

  2. 搜索你要找的参数

    好比这里咱们须要找的是sign这个参数,能够直接搜索"sign"(注意带上双引号),但若是结果不少,并且还都很像生成/设置sign的地方的话,能够搜一些别的比较独特的参数,好比这里出现的model、brand之类的在代码中通常不会常常出现的词。

    因为这个DEMO APP比较简单,因此直接搜索"sign"就能定位到设置值的位置了~

    经过搜索参数名方式定位

定位到了代码位置以后咱们就能够开始看代码了,从搜到的结果中咱们能够看到生成sign、设置sign、设置路径的代码都在这个l方法下,而后咱们来从设置sign的位置开始从下往上分析,这样代码的逻辑会更容易看懂一些。

定位到的代码

这里我将代码中的关键点都作了标记,你能够按着旁边标注的序号跟着我一块儿来看这个代码。

首先这个aVar4.a有两个地方出现了,可是传入的第二个参数都是stringBuilder2,而下面那里是直接设置了一个空值进去,显然不是咱们想要找的,因此咱们能够忽略掉下面的那一行带有sign关键词的代码,直接看标注了1的那一行。

选中stringBuilder2这个变量,能够看到它的值是从上面那个stringBuilder3.toString()获得的,接着看看stringBuilder3的生成,for循环这里作了什么操做看不懂,可是能够看到上面有个很显眼的字符串"MD5"。那么咱们能够大胆地猜想一下,这个stringBuilder3实际上就是作了个MD5操做而已,与咱们最开始抓包时的猜想相同,直接往上看看Hash前的字符串长啥样,而后测试一下吧,不行的话再回来看。

从前面MD5操做的位置能够看到digest方法里用到的参数又是一个叫作stringBuilder2的变量,继续往上看就能看到其实是从stringBuilder.toString()那获得的,那么这个stringBuilder又是怎么来的呢?从代码中咱们能够看出彷佛是for一个TreeMap而后把每个key和value组成key=value的格式写入stringBuilder中,若是stringBuilder里已经有值的话还会添加&符号,那么这最终出来的东西能够联想到的是什么?对!就是queryString那部分,只不过它的参数是被排过序的(由于TreeMap会自动进行排序)。

而后咱们再往上面看,验证一下想法正不正确,能够看到最源头的地方是个HashMap,被put进去的都是咱们抓包时看到的参数。


如今咱们就把这个sign的生成逻辑给理清楚了,其实它就是个按照参数名排过序的queryString进行了一次MD5操做后的产物,接下来咱们只须要在代码中实现这个生成逻辑就好了,在Python中,你可使用它自带的官方库hashlib来对一个字符串作MD5操做。

那么咱们写一段代码模拟请求一下试试,sign确实能够经过校验,说明咱们生成的sign是可使用的,至此,加密参数破解完成。

提示:建议实际操做中不要这么测试,容易触发反爬。能够先拿抓包获得的参数生成一遍对比一下,若是同样则说明生成的sign没有问题。


这个时代各类东西变化太快,而网络上的垃圾信息又不少,你须要有一个良好的知识获取渠道,不少时候早就是一种优点,因此还不赶忙关注个人公众号并置顶/星标一波。

发送消息“APP加密参数破解初级篇代码”到个人公众号【小周码字】便可得到demo代码和APP的下载地址~

相关文章
相关标签/搜索