作者 | Loco

来源 |小周码字

在对想爬的APP抓个包之后你可能会发现,只是抓到包似乎没有什么卵用啊,凡是有用的接口基本都有一个或多个加密的参数,而且它还每次请求都变,而自己去请求对应的接口时,如果没带或者随便输入一串值给这种参数,还会出现不返回数据的情况,这可怎么办才好?

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


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

APP启动界面

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

请求完毕

不出意外的话会出现一个“sign校验通过”的提示,然后我们看看抓到的包吧。


抓包结果

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

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


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

使用jadx反编译APK

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

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

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没有问题。

公众号后台回复【常规模式】即可获得demo代码和APP的下载地址~

—————————————

往期精彩:

  • 美国“实体清单”再度升级,我国超级计算机今日起或面临“断供”!

  • 我造的假我自己打,Adobe推出“反PS”

  • 中国诚信全球垫底?讲讲《Science》现在的论文有多不靠谱

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

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

    文章转载自公众号小周码字 看完了初级篇的常规模式之后,你是不是发现了一个很严重的问题:如果每个APP都需要这么反编译看代码仿写的话,那么当想要大批量爬不同的APP的时候,光是找加密参数的生成部分就已经 ...

  2. jmeter 请求发送加密参数(其中包含Json嵌套)

    jmeter 请求发送加密参数(其中包含Json嵌套) 某个接口的请求参数非常多,并且接口请求要求有MD5签名校验:签名的方式为在Headers或是请求中包含一个sign参数,该参数值通过对URL.M ...

  3. 【Python3爬虫】破解同程旅游加密参数 antitoken-爬虫深度技术

    [Python3爬虫]2020年最新破解同程旅游加密参数 antitoken 一.前言简介 在现在各个网站使用的反爬措施中,使用 JavaScript 加密算是很常用的了,通常会使用 JavaScri ...

  4. 网络爬虫的秘密:百度翻译加密参数破解

    一.小试牛刀 在上课的时候,百度翻译之前的那个简单的接口,需要你多次尝试之后才能出来,其实只要我们打开network中的XHR就可以查看到. 步骤1:浏览器打开:fanyi.baidu.com, 按键 ...

  5. android调用完自己写的app之后如何返回原来的android应用_App逆向篇 神器之 Frida...

    说到逆向APP,很多人首先想到的都是反编译,但是单看反编译出来的代码很难得知某个函数在被调用时所传入的参数和它返回的值,极大地增加了逆向时的复杂度,有没有什么办法可以方便地知道被传入的参数和返回值呢? ...

  6. python爬虫文字加密_Python爬虫进阶必备 | X薯中文网加密分析

    此次来分析某个小说网站. aHR0cHM6Ly9nLmhvbmdzaHUuY29tL2NvbnRlbnQvOTM0MTYvMTM4Nzc5MTIuaHRtbA==node 分析请求 先来看看页面的请求 ...

  7. python爬虫之逆向破解_js逆向爬虫实战(2)--新快之加密参数破解

    爬虫js逆向系列 我会把做爬虫过程中,遇到的所有js逆向的问题分类展示出来,以现象,解决思路,以及代码实现.我觉得做技术分享,不仅仅是要记录问题,解决办法,更重要的是要提供解决问题的思路.怎么突破的, ...

  8. 当你写爬虫抓不到APP请求包的时候该怎么办?【高级篇-混淆导致通用Hook工具失效】...

    提示:因为高级篇以后的APP将无法使用很通用的方式处理,每种类型甚至是每个APP的反抓包处理方式都会有差别,所以这个系列以后会以[高级篇-具体类型]的形式来写. 这篇文章的主要内容是解决在遇到APP没 ...

  9. 爬虫手机App——数据采集小攻略

    爬虫手机App数据采集小攻略 最近帮朋友研究爬虫软件,抓取手机App的资源,想总结一下爬虫手机App资源的小套路,翻到这哥们总结的不错,就不重复造轮子了!下面请看?↓ 手机App的采集其实跟web采集 ...

  10. 猫哥教你写爬虫 046--协程-实践-吃什么不会胖

    吃什么不会胖? 低热量食物 食物的数量有千千万,如果我们要爬取食物热量的话,这个数据量必然很大. 使用多协程来爬取大量的数据是非常合理且明智的选择 如果我们要爬取的话,那就得选定一个有存储食物热量信息 ...

最新文章

  1. Hibernate 缓存机制
  2. 推一波JAVA学习公众号
  3. python线程池操作_python线程池和进程池
  4. 【Hbase】HBase界面简介
  5. 树莓派(Arduino)仿真软件 —— Fritzing
  6. TreeSet—————我们认知的集合
  7. 面试题--------7、Files的常用方法
  8. 一个很好的makefile例子(经典)
  9. windbg学习23(!peb和PEB结构)
  10. Chrome 扩展程序 CrxMouse 优化版 v3.0.1
  11. 【推荐】到伊甸园玩体感游戏吧!
  12. 国标28181:实时视频播放
  13. linuxGame:文明5汉化
  14. [BZOJ4372][烁烁的游戏][动态树分治+线段树+LCA]
  15. Flutter 使用GridView模仿微信群聊UI
  16. JAVA学习_week3
  17. 股市非常态,CCI指标买卖点实例图解
  18. daemon.json配置参数详解
  19. 可以自由定制的游戏手柄,让操作更顺手,北通阿修罗3S上手
  20. Windows替换字体

热门文章

  1. Ubuntu 12.04 MTK环境配置说明
  2. 面试官:@Transactional 注解是如何实现的?面试必问!
  3. 我的IntelliJ IDEA一直都是这么设置的,效果很棒!
  4. 微盟数据已经全面找回 并公布商家赔付计划
  5. Python开发人员最喜欢的工具
  6. 20个令程序员泪流满面的瞬间
  7. 【习惯】是学习最好的坚持方式
  8. 你是如何抵制百度系列产品的?
  9. 最全Redis49个面试题目及答案:线程设计+哨兵+复制+事务+集群+持久化等
  10. 洛谷 - P1012 - 拼数 - 排序