精华内容
参与话题
问答
  • 本文主要介绍了移动端爬虫的工具与方法,作为一个入门的大纲。没有详细介绍的也给出了本人学习过程中借鉴的资料的链接,适合对移动端爬虫感兴趣的同学入门。 一、抓包模拟 基本原理(中间人攻击) ...

     

    From:https://www.cnblogs.com/zyfd/p/9681080.html

     

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

     

     

     

    一、抓包模拟

     

     

    基本原理(中间人攻击)

     

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

     

    工具介绍

     

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

     

    具体的报文走向如下

     

     

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

     

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

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

     

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

     

    1、单向双向 https

     

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

    如何检测是双向认证还是单向认证,可以通过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本身就获取不到)

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

    Macaca:  https://macacajs.com/

     

     

    工具介绍

     

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

     

    市面上常见的UI自动化测试工具以及优缺点

    以上主流工具的优点跟缺点

     

     

    Airtest

    AirtestIDE官方文档AirtestIDE官方文档:https://airtest.netease.com/docs/cn/index.html

    关于Airtest的使用探索:https://www.jianshu.com/p/32d08455e86f

     

    Airtest 网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试工具。Airtest的框架是网易团队自己开发的一个图像识别框架,这个框架的祖宗就是一种新颖的图形脚本语言Sikuli。Sikuli这个框架的原理是这样的,计算机用户不需要一行行的去写代码,而是用屏幕截屏的方式,用截出来的图形摆列组合成神器的程序,这是Airtest的一部分。
      另外,Airtest也基于poco这个U控件搜索框架,这个框架也是网易自家的跨平台U测试框架,原理类似于appium,通过控件的名称,id之类的来定位目标控件,然后调用函数方法,例如click(),swip()之类的方法来对目标控件进行点击或者是操作。

     

    相较于以上工具来说,Airtest有以下优点和缺点:

     

     

    抓取实现

     

     

    1. 程序基本架构

     

     

     

    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, 0x7f03 --- 把 0x7f03赋值给v0
    invoke-direct           --- 调用函数
    return-void             --- 函数返回void
    .end method             --- 函数结束
    new-instance            --- 创建实例
    iput-object             --- 对象赋值
    iget-object             --- 调用对象
    invoke-static           --- 调用静态函数

    数据类型

    B  ---  byte
    C  ---  char
    D  ---  double (64 bits)
    F  ---  float
    I  ---  int
    J  ---  long (64 bits)
    S  ---  short
    V  ---  void   只能用于返回值类型
    Z  ---  Boolean
    Lxxx/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

     

     

    工具介绍

     

    26 款优秀的 Android 逆向工程工具( 注意看下面评论 ):https://www.freebuf.com/sectool/111532.html

     

    1. 反编译工具 

     

    APKToolbox 工具

     

    AndroidKiller(smali 代码IDE)

     

     

    常见问题及解决办法

    • 有一些包无法使用Apktool进行反编译,常用解决办法:

    需要先下载 smali.jar, baksmali.jar, signapk.jar,
    先把APK包解压缩,然后直接使用 smali.jar  baksmali.jar 来进行解压缩
    1:将dex 输出为 smali文件
        # 把dex 文件反编译
        java -jar baksmali-2.0.3.jar classes.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 框架

     

      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介绍: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 协程 实现并发访问

     

     

     

    五、参考

     

     

     

     

    展开全文
  • 本文来自网易云社区作者:王涛本文主要介绍了移动端爬虫的工具与方法,作为一个入门的大纲。没有详细介绍的也给出了本人学习过程中借鉴的资料的链接,适合对移动端爬虫感兴趣的同学入门。一、抓包模拟基本原理(中间...

    本文来自网易云社区

    作者:王涛


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


    一、抓包模拟

    基本原理(中间人攻击)

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

    工具介绍


    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. 获取效率低

    • 定位元素需要时间

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

    获取的数据有限

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

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

    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+款云产品!


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


    相关文章:
    【推荐】 数据分析思路的套路攻略
    【推荐】 年轻设计师如何做好商业设计
    【推荐】 大数据在政府中的应用案例

    展开全文
  • 有些时候你想在你的应用需要用到一些背景图片,但是没有图片啊,没有图片啊,没有图片啊。。。。。 当然你可以在应用内内置很多的精美图片,然后就造成了一些问题:你的apk变得贼大,其次想换一些新的图片只能...

    有些时候你想在你的应用需要用到一些背景图片,但是没有图片啊,没有图片啊,没有图片啊。。。。。

    当然你可以在应用内内置很多的精美图片,然后就造成了一些问题:你的apk变得贼大,其次想换一些新的图片只能在下一次应用更新。

    或者搞一个服务器,用网络请求去访问服务器的图片,那么问题来了:谁去搞服务器,服务器的图片哪里来的。相信很多android端盆友对搭建服务器还是比较陌生的(比如我)。

    于是我想了个可以投机取巧的办法,用别人家的图片,对,没有错,虽然这种方式有点不要脸,但是我只能这么干了。。。

    主体思路如下:

    应用http访问网页,获取网页界面,然后用正则将详情图匹配出来,获取到所有图片的url。。。

    不多说了,开干吧。

    找一个目标网页

    首先要确定想要从什么网站上面爬取图片数据,我在github中的一个项目里是爬取的google图片搜索网站的图片数据,这里我从爬取pixabay的图片吧,链接:https://pixabay.com/

    了解目标网页的url结构以及参数功能

    有的盆友可能说了我没做过前端啊,,,我知道我也没做过,但是没吃过猪肉还没么见过猪跑吗,一点一点摸出来就可以了

    比如我在pixabay搜索动物anim,结果如下:

    他是通过path的方式去访问的,行,了解,先写一个http请求去访问这个界面,看看拿到的是什么东西,因为本人比较懒,所以直接用okhttp去写网络请求了;

    public class PixabayUtils {
        public static void search() {
            OkHttpClient client = new OkHttpClient.Builder().build();
            final Request request = new Request.Builder()
                    .header("User-Agent"
                            , "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36")
                    .url("https://pixabay.com/images/search/anim/")
                    .build();
            client.newCall(request)
                    .enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            Log.e("GFZY", "onFailure: " + e.getMessage());
                        }
    
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
    //                        Log.i("GFZY", "onResponse: " + response.body().string());
                            Log.i("GFZY", "onResponse: ");
                            FileOutputStream fileOutputStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory()
                                    , "AAAG.html"));
                            fileOutputStream.write(response.body().string().getBytes());
    
                            fileOutputStream.close();
                        }
                    });
        }
    }

    这里简单说一下为什么要添加User-Agent,原因有两个:在进行网络请求时,有些‘错误’的请求头会被网站当做爬虫(也就是咱们),所以为了模仿一个正常的网页打开,我们要设置一个user-agent,俗称反爬。其次,有些用过okhttp的同学可能接触过okhttp会将你的user-agent替换为okhttp-xxx,这样你拿到的数据就会有问题,当时在访问google图片的时候就是因为没有设置user-agent,所以拿到的结果没有详情图的url。

    至于这个user-agent从哪里拿,网上有很多android获取默认user-agent的博客,大家自己找一下吧,再或者你可以打开你的网站的开发者模式,点开network,锁边找到一个网路请求,然后找到他的请求头,直接复制过来?


    至于将网页结果存到手机,是为了验证拿到的结果是不是正确的,不必太在意。

    行,这个事情就到这里,我们接着走。

    简单跑一下(如果你说程序跑的时候有什么问题,先检查一下读写权限和网络权限),然后把结果html用电脑打开:

    返回结果

    是正常的。看来现在为止没什么问题,看到图片地址了,是不是很高兴!

    别高兴太早了,这只是一个缩略图,分辨率低的可怜,除非你的显示区域很小,要是想弄全屏的,你可以看下效果,马赛克亮瞎你的眼。

    找详情图url

    网页上放置的大多数都是缩略图,而不同的网站详情图url放置的位置不一样,想google会把详情图url放在网页底部,等待动态调用,而大多数跳转式的网页应该会附带详情图的url,再点击后二次请求(个人猜测,)所以说这个工作还是要往出试。

    这样的话那先点击一下进入详情页看看url的变化:

    在我点击详情页之后path从anim变成了这个东西,如果说网页内可以找到这段path,那就什么都好说了,来我们看一下预览界面有没有这个字段哈哈:

    果真如此,也就是说预览网址在href字段中会保留详情页的跳转界面 (只是针对pixabay,其他网站还需要自己往出推)

    我们看看详情页中详情图的url存放在哪里:

    好了,我们总结一下:对于这种跳转式的网站,想要获取他的详情图,需要进行如下的几个步骤:

    1. 观察url参数,知道关键的字段功能
    2. 在预览网页中找到详情页的url
    3. 在详情页中找到详情图的图片url
    4. 在一次访问获取所有详情页url后,遍历访问所有详情页url,抓取详情图的url

    正则匹配url

    可能抓取url的方式有很多,个人感觉正则是比较方便的一个方法。

    首先获取预览网页中所有详情页的url:

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
    //                        Log.i("GFZY", "onResponse: " + response.body().string());
                            Log.i("GFZY", "onResponse: ");
    //                        FileOutputStream fileOutputStream = new FileOutputStream(new File(Environment.getExternalStorageDirectory()
    //                                , "AAAG.html"));
    //                        fileOutputStream.write(response.body().string().getBytes());
    //
    //                        fileOutputStream.close();
                            String resStr = response.body().string();
                            Pattern pattern = Pattern.compile("(?<=href=\").*?(?=\")");
                            Matcher matcher = pattern.matcher(resStr);
    
                            ArrayList<String> detailsUrlList = new ArrayList<>();
                            while (matcher.find()) {
    
                                String group = matcher.group();
                                //根据目标特征限制条件,否则匹配的情况太多了
                                if (group.startsWith("/photos")
                                        && group.charAt(group.length() - 1) >= '0'
                                        && group.charAt(group.length() - 1) <= '9') {
                                    detailsUrlList.add("https://pixabay.com" + group);
                                }
                            }
    
                            for (String s : detailsUrlList) {
                                Log.i("GFZY", "onResponse: " + s);
                            }
                        }

    结果如下:

    遍历list,二次访问

                        for (String s : detailsUrlList) {
    //                            Log.i("GFZY", "onResponse: " + s);
                                Request detailRequest = new Request.Builder()
                                        .url(s)
                                        .get()
                                        .header("User-Agent"
                                                , "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36")
                                        .url("https://pixabay.com/images/search/anim/")
                                        .build();
    
                                client.newCall(detailRequest)
                                        .enqueue(new Callback() {
                                            @Override
                                            public void onFailure(Call call, IOException e) {
                                                Log.e("GFZY", "onFailure: " + e.getMessage());
                                            }
    
                                            @Override
                                            public void onResponse(Call call, Response response) throws IOException {
                                                String resStr = response.body().string();
    //                                            Log.i("GFZY", "onResponse: " + resStr);
                                                Pattern detailPattern = Pattern.compile("(?<=srcset=\").*?(?=\")");
                                                Matcher detailMatcher = detailPattern.matcher(resStr);
                                                while (detailMatcher.find()) {
                                                    Log.i("GFZY", "onResponse: " + detailMatcher.group());
                                                }
                                            }
                                        });
                            }

    结果如下:

    这个就是我们最后想要拿到的数据了,至于这两个网页怎么处理,大家可以自己弄了。


    拿到详情图的url后,是想自己下载还是加载显示出来看大家需求了,这个功能到这里就完成了,怎么样,高兴不

     

     

    之前我是搜索的Google图片网站,已经把功能封装成依赖,大家是在不想看上面这一坨坨的话可以远程直接调用,github链接如下:

    https://github.com/gfzy9876/GoogleImgSearch

    展开全文
  • 專 欄❈作者:麦艳涛,挖掘机小王子,数据分析...至于为什么不爬PC端,原因是移动端较简单,很适合爬虫新手入门。有时间再写PC端吧!环境介绍Python3/Windows-10-64位/微博移动端网页分析以获取评论信息为例(你可以以
        

    專 欄

    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

    作者:麦艳涛,挖掘机小王子,数据分析爱好者。




    本文简要讲述用Python爬取微博移动端数据的方法。可以看一下Robots协议。另外尽量不要爬取太快。如果你毫无节制的去爬取别人数据,别人网站当然会反爬越来越严厉。至于为什么不爬PC端,原因是移动端较简单,很适合爬虫新手入门。有时间再写PC端吧!

    环境介绍

    Python3/Windows-10-64位/微博移动端

    网页分析

    以获取评论信息为例(你可以以自己的喜好获得其他数据)。如下图:

    0?wx_fmt=jpeg

    在这里就会涉及到一个动态加载的概念,也就是我们只有向下滑动鼠标滚轮才会加载出更多的评论数据。这也是网页经常使用的方式。接下来就应该找到评论信息的真实网址,找到真实网址的方法就是打开浏览器的开发者工具,火狐/谷歌是F12键。打开如下:

    0?wx_fmt=jpeg

    打开以后点击网络,网络用来记录浏览器和服务器交换的信息。接下来将鼠标滚轮缓慢向下滚动,在这个过程中就会弹出类似于上图的信息,也就是评论信息加载出来了。找到评论信息,应该会在第一条。如下图:

    0?wx_fmt=jpeg

    真实网址:https://m.weibo.cn/api/comments/show?id=4160547165300149&page=3

    将网址在火狐里面打开如下图:

    0?wx_fmt=jpeg

    上面的网址其实pages=3就代表第三页,所以只需模拟网址即可,pages=4,5,6。。。。

    另外由于是Json文件,所以提取数据非常方便,只需用切片操作即可。

    长按扫描下方二维码,

    关注“编程狗”,回复数字“1227”,

    获取本文源代码

    640?wx_fmt=jpeg


    编  程  狗

    编程大牛技术分享平台

    Python 中 文 社 区

    Python中文开发者的精神部落

    合作、投稿请联系微信:

    pythonpost

    — 人生苦短,我用Python —







    640?wx_fmt=jpeg

    展开全文
  • 移动端爬虫--Appium环境搭建(一)

    千次阅读 2018-07-23 18:44:00
    文集 移动端爬虫 配置 mac jdk最高支持1.8 查看安装路径 /usr/libexec/java_home -V JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home PATH=$JAVA_HOME/bin:$PATH:. CLASSPATH=.....
  • 文集 移动端爬虫 单设备自动化 准备 假设软件环境都已配置 一台android虚拟机, 我的是夜神端口是62025 启动 连接设备 [图片上传失败...(image-cd54b7-1532398731012)] 运行appium,默认启动4723端口 ...
  • 文集 移动端爬虫 多台设备自动化 思路 启动多个appium service,且每个server对应一个设备 appium -p 4723 -U udid appium -p 4724 -U udid Appium -p 4725 -U udid -p appium的端口 默认4723 -U udid 设备...
  • ... 为什么要提供一组api来启动程序 loach本身设计为任务驱动模型,需要有新的任务才能是loach继续运行。...最初是没有这组API的,每次启动loach都需要启动若干appium实例(wifi模式还需要建立adb连接),繁琐的...
  • 文集 移动端爬虫 源码 loach loach是一个移动端爬虫,针对现下很火的短视频app—抖音 支持多个android设备并行自动化 支持任意android设备的服务端部署到任意机器 支持使用http方法控制任务 示意图 ...
  • 移动端Python爬虫

    2020-07-06 10:58:11
    移动端Python爬虫 地址 https://www.piaodoo.com/10364.html
  • 爬虫 移动端数据爬取

    2019-09-23 05:42:31
    - 移动端数据的爬取 - 抓包工具: - fiddler - 青花瓷 - miteproxy - 环境的搭建 1.对fiddler进行配置:tools-》options-》connections->Allow remote cooxxx->设定一个端口 2.测试端口...
  • 在移动互联网时代,很大一部分企业抛弃了传统的网站,选择将数据、服务整合到 App 端,因此 App 端无论是爬虫还是反反爬都显得尤为重要。 常见的 App 端的爬虫方式是利用 Appium 和 Airtest 驱动手机打开应用,...
  • 在移动互联网时代,很大一部分企业抛弃了传统的网站,选择将数据、服务整合到 App 端,因此 App 端无论是爬虫还是反反爬都显得尤为重要。 常见的 App 端的爬虫方式是利用 Appium 和 Airtest 驱动手机打开应用,操作...
  • 前言 随着移动市场的火热,各大平台都陆陆续续的推出了...那么接下来就进入我们的移动端APP数据的爬虫中来吧。 移动端数据爬取方式 fiddler简介 手机APP抓包设置 fiddler设置 安装证书下载 安全证书...
  • 爬虫-移动端数据爬取

    2018-12-14 18:52:00
    前言 随着移动市场的火热,各大平台都...那么接下来就进入我们的移动端APP数据的爬虫中来吧。 1、 什么是Fiddler? Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一 。 它...
  • python爬虫移动端模拟 小贴士 分享一篇老文章 手机类型有点落后,其它可参考。很有技术性,值得学习。欢迎各位前沿者提出建议。 一般情况下,网站是通过对http请求的header 进行识别来判断是访问的是pc还是手
  • 在移动互联网时代,很大一部分企业抛弃了传统的网站, 选择将数据、服务整合到 App 端,因此 App 端无论是爬虫还是反反爬都显得尤为重要。 常见的 App 端的爬虫方式是利用 Appium 和 Airtest 驱动手机打开应用,...
  • 其中使用该爬虫的缺点是效率极低,傻瓜式的爬虫,不能并行执行等,但是它的优点是采用分析DOM树结构分析网页源码并进行信息爬取,同时它可以通过浏览器进行爬取中间过程的演示及验证码的输入。这篇文章对爬虫的详细...
  • #评论链接有max_id值,下个链接里的必要参数max_id是上个链接结果里的值,所以考虑到最后用递归,递归感觉还是挺难的,重点要考虑好结束条件,本案例结束条件就是max_id==0,等于0表示就是没有下一页了 ...
  • 爬虫学习 09.移动端数据爬取 前言 随着移动市场的火热,各...那么接下来就进入我们的移动端APP数据的爬虫中来吧。 今日概要 fiddler简介 手机APP抓包设置 fiddler设置 安装证书下载 安全证书安装 局域网设置 fi...

空空如也

1 2 3 4 5 ... 20
收藏数 445
精华内容 178
关键字:

移动端爬虫

爬虫 订阅