当你写爬虫遇到APP的请求有加密参数时该怎么办?【初级篇-秒杀模式】
文章转载自公众号小周码字
看完了初级篇的常规模式之后,你是不是发现了一个很严重的问题:如果每个APP都需要这么反编译看代码仿写的话,那么当想要大批量爬不同的APP的时候,光是找加密参数的生成部分就已经很花时间了,有没有更快捷的办法呢?
答案是有的,而且对于初级篇水平的APP来说,这个操作可以让你在一分钟内直接秒掉它的加密参数部分,可以说是一种降维打击了!
那么这个效果是怎么做到的呢?其实很简单,就是直接将Java标准库中常见的被用于生成加密参数的方法给Hook了,监听它们的输入参数和返回值,这样就能直接得到加密、Hash前的原文、密钥、IV等内容了,怎么样?是不是很简单?
小提示:之所以不提Kotlin,是因为在Kotlin下写加密、Hash操作的代码时如果不使用第三方库的话,就只能调用Java的标准库了,而第三方库的类名、方法名可能性太多了,不像标准库那样可以直接秒杀一大片,所以不属于本系列初级篇内容。(已询问多位Android开发同学验证此结论)
所以…要怎么操作呢?其实目前已经有一个非常方便的、基于Xposed框架编写的、能实现这种效果的工具了,它就是——Inspeckage。这个工具其实我在前面的《写APP爬虫会需要用到哪些工具呢?》文章中有提到过,它已经将标准库中常用的加密、Hash方法都给Hook了:
Inspeckage Hook 加密类操作标准库的代码
Inspeckage Hook Hash类操作标准库的代码
而在你需要的时候,只需要打开Inspeckage -> 选择需要Hook的APP -> 打开Inspeckage的Web端或者在日志中搜索你所需要找的加密参数就可以得到原文和使用的加密、Hash类型,直接秒杀!
接下来我将继续使用前面常规模式中的Demo APP来进行演示,如果你迫不及待地想要尝试了的话,可以发送消息【app秒杀】到我的公众号获得Demo APP的下载地址
话不多说,我们开始实战,首先我们需要准备一台已经安装好Xposed框架的Android手机,然后在Inspeckage的GitHub仓库中下载最新编译好的Inspeckage安装包或直接在Xposed管理器中安装它。
装好后记得在Xposed管理器中将它启用,启用后需要重启生效。
准备好了环境之后,我们就可以开始破解这个Demo APP了,打开Inspeckage,点击“choose target”选中想要Hook的APP(这里选择“APP加密参数DEMO-初级篇”)。
选中后点击“LAUNCH APP”按钮就可以了。
小提示:如果在这之前你打开过指定的APP的话,需要将其强制停止后再点击“LAUNCH APP”按钮,否则可能会出现Hook失败的情况。
在启动之后我们就可以在Inspeckage的Web端或日志中搜索sign的加密后参数了,这里说一下怎么操作:
- Web端
Web端的话,如果你的手机和电脑是在同一个网络环境下,且手机和电脑能互通,那么你可以在电脑上直接用浏览器访问手机上显示的内网IP地址(如
http://192.168.137.64:8008
);如果你的网络环境使你不能这么操作的话,你还可以用adb命令adb forward tcp:8008 tcp:8008
将手机上的8008端口映射到电脑上,然后就可以直接访问http://127.0.0.1:8008
了(需要8008端口未被占用)。
在打开了Web端之后,将页面上方那个扳手按钮右边的自动刷新选项打开,就可以看到被Hook出来的东西了。
- 日志
可以使用adb命令
adb logcat
来导出日志然后查看,或者是用像Android Studio中的logcat工具这种流式、带搜索功能的工具来查看。另外如果在Web端找到对应的加密参数时,原文过长导致出现被截断的情况,也可以在日志中找到对应的内容进行查看,打到日志中的会是完全体。
之后依然是常规流程,先抓个包看看。(再次提醒,如果你抓不到包的话,先看看我之前的抓包系列文章,这是基本操作!)
这里我们抓包后得到了一个sign:188c338423f3af3c2c0277946de958f8
,直接将它复制出来,然后在Inspeckage的Web端中的Hash栏内搜索(日志内搜索直接搜sign的内容即可)。
看到了吗?直接就得到了它的原文:brand=Xiaomi&device=capricorn&model=MI 5s&ts=1560859682&version=8.1.0
了,轻轻松松地就破解了这个APP的sign参数,全程只用一分钟!
发送消息【app秒杀】到我的公众号即可获得demo代码和APP的下载地址~
END
- Go 语言实现的网络连接池:Pool
- go语言操作redis连接池的方法
- WebVR如此近 - three.js的WebVR示例程序解析
- 【Dev Club分享】基于RxJava的一种MVP实现
- Android 动态链接库加载原理及 HotFix 方案介绍
- 如果裸写一个goroutine pool
- 【Dev Club 分享】微信 iOS SQLite 源码优化实践
- 移动客户端中高效使用 SQLite
- 【Dev Club 分享】微信热补丁 Tinker 的实践演进之路
- Android 进程保活招式大全
- 【Dev Club 分享】H5 视频直播那些事
- Android Patch 方案与持续交付
- Linux系统下MongoDB的简单安装与基本操作
- Go语言同步(Synchronization)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [897]使用Maxwell实时同步mysql数据
- Magicodes.IE之导入导出筛选器
- 一文搞懂Flink生成StreamGraph
- 知识全聚集 .Net Core 技术突破 | 如何实现一个模块化方案一
- ESP8266和ROS调试一些问题汇总
- tianbot_mini机器人上手ROS/SLAM/Navigation究竟有多简单???
- 如何知道我们的E2E测试覆盖率?
- tf.add_n函数的用法
- tensorflow 生成指定大小的赋值0的张量 np.zeros 在TF中对应的语句 生成全0张量
- Qt音视频开发25-ffmpeg音量设置
- 从HelloWorld开始了解Android
- 探究活动Activity
- 探究活动Activity(2)界面跳转及生命周期
- Android-MediaPlayer
- 如何友好的把Python和Bash结合在一起