zoukankan      html  css  js  c++  java
  • 移动端爬虫工具与方法介绍

    本文来自网易云社区

    作者:王涛


    本文主要介绍了移动端爬虫的工具与方法,作为一个入门的大纲。没有详细介绍的也给出了本人学习过程中借鉴的资料的链接,适合对移动端爬虫感兴趣的同学入门。


    一、抓包模拟

    基本原理(中间人攻击)

    中间人攻击:在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信。攻击机以自己的证书替代服务器发给客户端的证书。通常,客户端不会验证该证书,直接接受该证书,从而建立起和攻击机的安全连接。这样,客户端发送的数据,都会被攻击机获取和解密。

    工具介绍


    Fiddlercharlesanyproxy
    手机安装证书需要需要需要
    支持抓取http/websocket/https(单向认证)http/websocket/https(单向认证)http/websocket/https(单向认证)
    支持平台win/mac/linux(受限)win/mac/linuxwin/mac/linux
    脚本开发Jscript.net未知js

    具体的报文走向如下

    image

    手机上的配置方法(以Fiddler为例,其它类似)

    1. 准备工作:手机与PC在同一个局域网内(可以连同一个WIFI,或者电脑插入移动WIFI)

    2. 配置步骤见下:

    imageimageimageimageimage

    参考链接: https://blog.csdn.net/gld824125233/article/details/52588275

    ==特别说明,抓不到报文可能的情况==

    1、单向双向 https

    https的抓包原理是基于中间人攻击的方式,但是这种方式只适用于单向认证的方式,也就是只是客户端去检验服务端的证书。而双向认证的Https,服务端还会校验客户端的证书。https握手过程如下:
    imageimage

    如何检测是双向认证还是单向认证,可以通过wireshark抓包看双方的协商过程,证书的交换是否是双向的。

    解决办法:暂时没有好的办法解决这个抓包的问题

    2、ssl pinning

    ssl pinning:证书锁定Certificate Pinning是SSL/TLS加密的额外保证手段。它会将服务器的证书公钥预先保存在客户端。在建立安全连接的过程中,客户端会将预置的公钥和接受的证书做比较。如果一致,就建立连接,否则就拒绝连接。Certificate Pinning在手机软件中应用较多。因为这些应用连接的服务器相对固定,可以预先将服务器的X509证书或者公钥保存在App中。例如,苹果应用商店Apple App Store就预置了这个功能。当使用中间人工具或者Fiddler之类的工具拦截数据,就会造成应用商店无法联网的情况。

    解决办法:手机安装xposed和Justtrustme 插件(https://github.com/Fuzion24/JustTrustMe)

    抓取实现

    抓到报文后,就可以模拟请求了。请求发送的几种方式:

    • 抓包工具里面提供了发送功能,Fiddler中的Composer 标签里提供了此功能。

    • Chrome的Postman扩展程序也可以用来发送报文。

    • Python中的requests包也可以方便地实现

    缺陷

    1. 如何构造更多的请求?(常见的分页请求、更换查询参数等)

    2. 如果抓不到包怎么办?(如果通信走socket怎么办?)

    3. http参数中包含加密、签名字段,如何找到参数的生成方法?


    二、模拟点击

    基本原理(基于UIautomator)

    通过程序模拟人的行为对APP的界面进行点击、滑动等操作,同时可以获取APP的Activity页面上的大部分控件上的文本信息(有一些可能获取不到,Uiautomator本身就获取不到)

    image

    Appium官网介绍:
    https://appium.io/docs/cn/about-appium/intro/,
    https://github.com/appium/appium

    Macaca:  https://macacajs.com/

    工具介绍


    AppiumMacaca
    支持平台需要需要
    脚本语言PC/ios/android/hybrid(h5、native混合)PC/ios/android/hybrid
    备注支持Android所有版本Android支持API>17
    底层框架UIAutoation(IOS)/UIAUtomator+Selendroid(Android)XCUITest(IOS)/UIAUTOMATOR(Android)
    稳定性一般更好
    开源JS基金项目,社区活跃阿里开源,未来未知

    ==特别说明==

    抓取实现

    1. 程序基本架构
      imageimage

    2. 框架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)

    样例代码(python)

    如果使用过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()

    缺陷

    1. 获取效率低

      • 定位元素需要时间

      • 为了保证稳定,需要在额外地增加等待时间

    2. 获取的数据有限

      • 只能获取到界面上可视控件的信息

      • H5页面信息,(需要切换driver到H5)

    3. Appium的不稳定,出现异常时有可能进程卡死,需要重新启动


    三、APK逆向

    基本原理

    方法一、二 对于没有android逆向经验的朋友是不错的选择,开发起来也比较简单,能满足一些对于应用数据的需求。但是如果想要更高效地获取更多的数据,就需要研究APP的代码。通过向APK中注入自己的代码,修改APP本身原来的逻辑,比如修改函数执行内容、增加新的逻辑等等来来实现自己的目标。一般的操作步骤如下:

    1. 逆向APK

    2. 分析smali代码

    3. 通过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使用这个指定表明方法中非参寄存器的总数,放在方法的第一行

    网址参考
    https://bbs.pediy.com/thread-151769.htm

    工具介绍

    1. 反编译工具

    APKToolbox 工具

    imageimage

    AndroidKiller(smali 代码IDE)

    imageimage

    常见问题及解决办法

    • 有一些包无法使用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
    2. 脱壳工具

    一些对安全性要求高的APP会采用加固工具为自己的APK加壳,表象就是你能反编译代码,反编译出来的smali代码很简单,只能看到壳的主程序代码,并没有真实的业务逻辑代码。 可以借助apktoolbox来进行检测是什么壳,而去寻找对应的脱壳工具。(由于加固这个比较专业,这里只推荐几款比较出名的脱壳工具,细的就讲不了了)

    3. 常用Hook 框架

    xposedCydia SubstrateFrida
    支持的系统androidandroid/IOSwin/mac/linux/IOS/Android
    版本要求android<=8.0android(<=4.4)/ios(<=9.1)android<=8.1
    开发语言JavaJavaPython+Js
    是否Root需要需要需要
    运行安装后重启安装模块后需要软重启基于脚本交互
    Java/NativeJava层Java/NativeJava/Native

    Xposed:
    API介绍:https://api.xposed.info/reference/packages.html
    开发者论坛:(https://forum.xda-developers.com/xposed)

    Cydia Substrate:
    官网:http://www.cydiasubstrate.com/
    文档:http://www.cydiasubstrate.com/id/264d6581-a762-4343-9605-729ef12ff0af/

    Frida:
    官网:https://www.frida.re/

    4. 动态调试smali代码

    需要安装smaliidea,具体教程
    http://blog.csdn.net/linchaolong/article/details/51146492

    5. 动态调试so

    使用IDA工具包,具体教程:
    http://blog.csdn.net/jiangwei0910410003/article/details/51500328

    ==特殊说明==

    随着开发者对于数据安全性的重视,一般的APK都会有各种保护策略,包括代码混淆、加壳,反调试,hook检查等等策略。我们非专业安全研究人员,只能见招拆招,只要能实现我们的目的就可以了,面对一些常规的策略有以下几种应对措施。

    反调试
    • 调用ptrace(PTRACE_TRACEME,0,0,0) (原理一个进程只能被一个进程Ptrace)

    • 检测TracerPid的值

    • 检测代码的执行间隔时间

    • 检测手机的硬件信息是否在调试器中

    • 检测android_server的端口号

    • 检测android_server 名称

    • 检测在调试状态下的软件断点

    • 通过使用Inotify对文件进行监控

    • 检测进程列表中是否存在常见的Hook/调试的进程名称

    反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协和实现并发访问


    五、参考


    网易云免费体验馆,0成本体验20+款云产品!


    更多网易研发、产品、运营经验分享请访问网易云社区


    相关文章:
    【推荐】 wireshark抓包分析——TCP/IP协议
    【推荐】 SpringBoot入门(二)——起步依赖
    【推荐】 代码混淆防止APP被反编译指南

  • 相关阅读:
    服务器状态码
    QuerySet中添加Extra进行SQL查询
    django配置一个网站建设
    MySQL数据库查询中的特殊命令
    125. Valid Palindrome
    121. Best Time to Buy and Sell Stock
    117. Populating Next Right Pointers in Each Node II
    98. Validate Binary Search Tree
    91. Decode Ways
    90. Subsets II
  • 原文地址:https://www.cnblogs.com/zyfd/p/9681080.html
Copyright © 2011-2022 走看看