本文来自网易云社区html
做者:王涛java
本文主要介绍了移动端爬虫的工具与方法,做为一个入门的大纲。没有详细介绍的也给出了本人学习过程当中借鉴的资料的连接,适合对移动端爬虫感兴趣的同窗入门。python
中间人攻击:在中间人攻击中,攻击主机一般截断客户端和服务器的加密通讯。攻击机以本身的证书替代服务器发给客户端的证书。一般,客户端不会验证该证书,直接接受该证书,从而创建起和攻击机的安全链接。这样,客户端发送的数据,都会被攻击机获取和解密。linux
Fiddler | charles | anyproxy | |
---|---|---|---|
手机安装证书 | 须要 | 须要 | 须要 |
支持抓取 | http/websocket/https(单向认证) | http/websocket/https(单向认证) | http/websocket/https(单向认证) |
支持平台 | win/mac/linux(受限) | win/mac/linux | win/mac/linux |
脚本开发 | Jscript.net | 未知 | js |
准备工做:手机与PC在同一个局域网内(能够连同一个WIFI,或者电脑插入移动WIFI)android
配置步骤见下:ios
https的抓包原理是基于中间人攻击的方式,可是这种方式只适用于单向认证的方式,也就是只是客户端去检验服务端的证书。而双向认证的Https,服务端还会校验客户端的证书。https握手过程以下:git
如何检测是双向认证仍是单向认证,能够经过wireshark抓包看双方的协商过程,证书的交换是不是双向的。github
解决办法:暂时没有好的办法解决这个抓包的问题golang
ssl pinning:证书锁定Certificate Pinning是SSL/TLS加密的额外保证手段。它会将服务器的证书公钥预先保存在客户端。在创建安全链接的过程当中,客户端会将预置的公钥和接受的证书作比较。若是一致,就创建链接,不然就拒绝链接。Certificate Pinning在手机软件中应用较多。由于这些应用链接的服务器相对固定,能够预先将服务器的X509证书或者公钥保存在App中。例如,苹果应用商店Apple App Store就预置了这个功能。当使用中间人工具或者Fiddler之类的工具拦截数据,就会形成应用商店没法联网的状况。web
解决办法:手机安装xposed和Justtrustme 插件(github.com/Fuzion24/Ju…)
抓到报文后,就能够模拟请求了。请求发送的几种方式:
抓包工具里面提供了发送功能,Fiddler中的Composer 标签里提供了此功能。
Chrome的Postman扩展程序也能够用来发送报文。
Python中的requests包也能够方便地实现
如何构造更多的请求?(常见的分页请求、更换查询参数等)
若是抓不到包怎么办?(若是通讯走socket怎么办?)
http参数中包含加密、签名字段,如何找到参数的生成方法?
经过程序模拟人的行为对APP的界面进行点击、滑动等操做,同时能够获取APP的Activity页面上的大部分控件上的文本信息(有一些可能获取不到,Uiautomator自己就获取不到)
Appium官网介绍:
appium.io/docs/cn/abo…
github.com/appium/appi…
Macaca: macacajs.com/
Appium | Macaca | |
---|---|---|
支持平台 | 须要 | 须要 |
脚本语言 | PC/ios/android/hybrid(h五、native混合) | PC/ios/android/hybrid |
备注 | 支持Android全部版本 | Android支持API>17 |
底层框架 | UIAutoation(IOS)/UIAUtomator+Selendroid(Android) | XCUITest(IOS)/UIAUTOMATOR(Android) |
稳定性 | 通常 | 更好 |
开源 | JS基金项目,社区活跃 | 阿里开源,将来未知 |
无
程序基本架构
框架API说明
以Appium为例,Appium 支持的API 介绍以下:
定位支持
经过accessibility id查找元素
经过元素id
经过元素文本内容
经过元素可见连接文本定位
经过元素标签名称定位元素
经过元素class name属性定位元素
支持单个、批量获取
操做支持
从某个元素滑动到另外一个元素
把某元素拖到目标元素
模拟手指点击(最多五个手指),可设置按住时间长度(毫秒)
从A点滑动到B点,滑动时间可配
快速滑动
模拟双指捏(缩小操做)
在元素上执行放大操做
单击
还能摇一摇(IOS支持)
执行JS脚本
获取H5页面的page source
输入框输入(回车的支持,建议选用sogou输入法,keycode: 66 ,==这样不须要去定位键盘上回车的输入==)
控制APP
安装、删除、运行、关闭APP
指定运行某APP的某activity
获取控件信息
文本
元素tag名称
内容描述(content-desc)
若是使用过selenium作爬虫或测试,对这个接口应该很熟悉。
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'desired_caps['platformVersion'] = '6.0'desired_caps['deviceName'] = '192.168.174.101:5555'desired_caps['appPackage'] = 'com.android.calculator2'desired_caps['appActivity'] = '.Calculator'driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.find_element_by_id("digit_1").click()
driver.find_element_by_id("op_add").click()
driver.find_element_by_id("digit_2").click()
driver.find_element_by_id("eq").click()
driver.quit()复制代码
获取效率低
定位元素须要时间
为了保证稳定,须要在额外地增长等待时间
获取的数据有限
只能获取到界面上可视控件的信息
H5页面信息,(须要切换driver到H5)
Appium的不稳定,出现异常时有可能进程卡死,须要从新启动
方法1、二 对于没有android逆向经验的朋友是不错的选择,开发起来也比较简单,能知足一些对于应用数据的需求。可是若是想要更高效地获取更多的数据,就须要研究APP的代码。经过向APK中注入本身的代码,修改APP自己原来的逻辑,好比修改函数执行内容、增长新的逻辑等等来来实现本身的目标。通常的操做步骤以下:
逆向APK
分析smali代码
经过hook框架向APK中注入代码,修改逻辑
smali语法
APK反编译
静态、动态调试
经常使用HOOK框架
反调试、反HOOK应对策略
下面知识能够快速入门smali语法,最基本的数据类型,函数定义关键字,寄存器做用说明
关键字
field private isFlag:z --- 定义变量.method --- 方法.parameter --- 方法参数.prologue --- 方法开始.line 12 --- 此方法位于第12行invoke-super --- 调用父函数const/high16 v0, 0x7fo3 --- 把0x7fo3赋值给v0invoke-direct --- 调用函数return-void --- 函数返回void.end method --- 函数结束new-instance --- 建立实例iput-object --- 对象赋值iget-object --- 调用对象invoke-static --- 调用静态函数复制代码
数据类型
B --- byteC --- charD --- double (64 bits)F --- floatI --- intJ --- long (64 bits)S --- shortV --- void 只能用于返回值类型Z --- BooleanLxxx/yyy/zzz; --- 类
[XXX --- 数组复制代码
寄存器类型
寄存器采用v和p来命名,
v表示本地寄存器,p表示参数寄存器,
共16个寄存器,v0~v15, 关系以下
v0第一个本地寄存器
v1第二个本地寄存器v2 p0(this)v3 p1第一个参数
v4 p2第二个参数
v5 p3第三个参数
固然,若是是静态方法的话就只有5个寄存器了,不须要存this了。
.registers使用这个指令指定方法中寄存器的总数
.locals使用这个指定代表方法中非参寄存器的总数,放在方法的第一行复制代码
网址参考
bbs.pediy.com/thread-1517…
APKToolbox 工具
AndroidKiller(smali 代码IDE)
常见问题及解决办法
有一些包没法使用Apktool进行反编译,经常使用解决办法:
须要先下载smali.jar,baksmali.jar signapk.jar,
先把APK包解压缩,而后直接使用 smali.jar baksmali.jar 来进行解压缩1:将dex 输出为 smali文件
java -jar baksmali-2.0.3.jar classes.dex # 把dex 文件反编译2:将修改的smali 文件 从新打包成dex 文件# 把 out 文件夹下的smali文件从新打包成classes.dex文件java -jar smali-2.0.3.jar out #给APK包签名java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk复制代码
一些对安全性要求高的APP会采用加固工具为本身的APK加壳,表象就是你能反编译代码,反编译出来的smali代码很简单,只能看到壳的主程序代码,并无真实的业务逻辑代码。 能够借助apktoolbox来进行检测是什么壳,而去寻找对应的脱壳工具。(因为加固这个比较专业,这里只推荐几款比较出名的脱壳工具,细的就讲不了了)
github.com/DrizzleRisk… 某数字公司壳
github.com/DrizzleRisk 其它几个脱壳工具
github.com/zyq8709/Dex… 好久没更新了
github.com/F8LEFT/FUPK… 须要修改android源码
xposed | Cydia Substrate | Frida | |
---|---|---|---|
支持的系统 | android | android/IOS | win/mac/linux/IOS/Android |
版本要求 | android<=8.0 | android(<=4.4)/ios(<=9.1) | android<=8.1 |
开发语言 | Java | Java | Python+Js |
是否Root | 须要 | 须要 | 须要 |
运行 | 安装后重启 | 安装模块后须要软重启 | 基于脚本交互 |
Java/Native | Java层 | Java/Native | Java/Native |
Xposed:
API介绍:api.xposed.info/reference/p…
开发者论坛:(forum.xda-developers.com/xposed)
Cydia Substrate:
官网:www.cydiasubstrate.com/
文档:www.cydiasubstrate.com/id/264d6581…
Frida:
官网:www.frida.re/
须要安装smaliidea,具体教程
blog.csdn.net/linchaolong…
使用IDA工具包,具体教程:
blog.csdn.net/jiangwei091…
随着开发者对于数据安全性的重视,通常的APK都会有各类保护策略,包括代码混淆、加壳,反调试,hook检查等等策略。咱们非专业安全研究人员,只能见招拆招,只要能实现咱们的目的就能够了,面对一些常规的策略有如下几种应对措施。
调用ptrace(PTRACE_TRACEME,0,0,0) (原理一个进程只能被一个进程Ptrace)
检测TracerPid的值
检测代码的执行间隔时间
检测手机的硬件信息是否在调试器中
检测android_server的端口号
检测android_server 名称
检测在调试状态下的软件断点
经过使用Inotify对文件进行监控
检测进程列表中是否存在常见的Hook/调试的进程名称
检测已经安装的应用里是否包含xposed/Cydia Substrate
hook PackageManager的getInstalledApplications,把Xposed或者Substrate的包名去掉
关键函数检查调用栈里的可疑方法
hook Exception的getStackTrace,把本身的方法去掉
检测并不该该Native的native方法
hook getModifiers,把flag改为看起来不是native
经过/proc/[pid]/maps检测可疑的共享对象或者JAR
hook 打开的文件的操做,返回/dev/null或者修改的map文件
基于框架,开发hook代码
hook的方式对APK的代码有侵入,须要对APK中的各类反调试、反hook检测手段作规避
若是遇到加壳的,分析时间会很长。若是没法脱壳,那么将没法实现抓取
Requests库
开源框架包括
Pyspider
Scrapy
Tornado协和实现并发访问
Smali语法:www.jianshu.com/p/ba9b37434…
IDA使用介绍:blog.csdn.net/jiangwei091…
反反hook: gnaixx.cc/2016/09/03/…
Fiddler小白入门: blog.csdn.net/gld82412523…
浅析HTTPS中间人攻击与证书校验:blog.csdn.net/zhangmiaopi…
网易云免费体验馆,0成本体验20+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。
相关文章:
【推荐】 网易郑栋:数据采集与分析的那些事——从数据埋点到AB测试
【推荐】 浅谈容器监控和网易云计算基础服务实践
【推荐】 从golang的垃圾回收提及(上篇)