文章目录
- 1. 写在前面
- 1. 接口分析
- 2. 断点分析
- 3. 算法还原
【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章
作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!
1. 写在前面
近期在做野生小应用市场APP下载的时候,发现有几个小市场的APK下载链接是做了一点点反爬虫措施的。链接加了一个动态的参数Key,使用的MD5加密加了一串自定义的盐,然后整个JS的代码又都是经过混淆的(有点多此一举)。难度算是入门级别的,适合学习爬虫技术或者刚刚入门JS逆向的小伙伴当作一个学习的案例来实践
案例站点:
d3d3LjIyNjUuY29t
1. 接口分析
打开APP应用的详情页面,点击下载地址进行下载触发!可以到看到完整的下载链接是第三方的,这种在小市场中很常见。一般自己不会存储太多的资源有的直接跳转到其他的主站去进行下载或者拿其他三放站点的下载链接丢给你
主要分析的就是key,初看就知道是一个MD5的加密,所以我们需要去找到参与MD5的数据是什么!逆向分析中分析的就是加密值在未完成加密的中间过程跟使用算法然后进行还原以此来达到逆向的目的
2. 断点分析
这里我们可以先全局搜索一下,可以看到有混淆的JS的,而且到的特征很明显,如下所示:
点击跳转到具体的JS文件中,先不急着去下断点。可以先静态分析一下代码,有时候下断的技巧是很重要的,往下可以看到疑似key的调用生成位置,如下所示:
_0x12282d大概率是time参数的时间戳获取,_0x34bab9大概率则是key参数的值,我们可以在这个位置下断刷新来验证一下这个猜测,如下所示:
证明猜测是对的,那么接下来就只需要跟进去看看参与MD5加密的内容是什么,这样我们就可以直接对算法进行还原。这里我们看下面的这一行代码,如下:
javascript">_m0s8a2d5(_0x1c8150 + atob(_0x22def0()) + _0x12282d);
其中_m0s8a2d5是加密方法,然后里面三个拼接的就是加密的内容,这里我们可以直接在控制台中输出看看是什么,如下所示:
_0x1c8150: 下载链接中的Path
atob(_0x22def0()): 这里使用了atob进行了一个解码操作到了最终的盐值abc…
_0x12282d: 这个的话就是时间戳
盐值也是在JS中的数组中固定的,这里也是看到了通过下标获取到一串b64编码的字符串
3. 算法还原
经过上述的分析,我们知道了最终的加密逻辑。 这里我们只需要使用几行代码就可以解决这个key参数的加密,代码如下所示:
python"># -*- coding: utf-8 -*-
import hashlibdownloader_link = response.xpath("substring-before(substring-after(//script[contains(.,'Address')]/text(),'Address:\"'),'\",TypeID')").get()
times = int(time.time())
encrypt_info = downloader_link + f'abcxyzopq{times}'
md5 = hashlib.md5()
md5.update(encrypt_info.encode('utf-8'))
data["file_download_url"] = "http://a1.xzfile.com" + downloader_link + f'?time={times}&key={md5.hexdigest()}'
最终我们运行一下完整的Scrapy爬虫项目,可以看到数据的抓取情况以及完整的APK下载链接,我们可以使用下载工具进行下载来验证链接是否可用,如下所示: