一个iOS系统弹窗引发的探索

一.前言

苹果iOS 14针对本地局域做了一些权限限制,详情见链接:developer.apple.com/videos/play…

直观的现象是:可能在任意的界面上会弹出一个 本地网络的授权弹窗,影响了用户体验,产品希望能关闭这个弹窗。

图片[1]-一个iOS系统弹窗引发的探索-一一网

二、什么是本地网络?

这里的本地网络其实就是我们常说的局域网,是将设备接入路由器以后形成的网络,设备可以通过这张网络互相通信,如我们的设备发现(悟空遥控器)、视频播放器中的投屏功能等功能都是使用的本地网络。

从 iOS 13 开始,应用想要获得当前连接到的 Wi-Fi 名称,那就必须要获得定位权限。因为通过识别 Wi-Fi 名称, 应用就能轻松地在你和周围的人之间建立大数据网络。但是不给定位权限不代表应用就没有办法跟踪你了,因为应用可以通过本地网络里的设备进行跟踪。

三、为什么iOS14后需要向用户申请权限?

在过去的 iOS 版本中,应用可以随意扫描本地网络中的设备,因此应用就可以很轻松地得到本地网络里所有设备的名称和 MAC 地址,来识别用户。

简单来说,请求该权限的主要目的还是为了跟踪用户并推送广告。比方,个性化推荐和广告推荐。

主要影响:智能家居类,局域网游戏,网络测试工具等等

在Info.plist的权限申请描述字段

image-20210709113145241.png

四、如何排查哪里触发了弹窗

通过对本地网络的了解和在苹果开发者论坛找到了文档链接

哪些操作需要本地网络接入?

一般规则是,发送到本地网络地址的流量需要用户授予应用本地网络访问权限。常见的场景包括:
发送TCP连接-是的

侦听和接收传入的TCP连接-不是

发送UDP单播-是的

发送UDP多播-是的

发送UDP广播-是的

接收传入UDP单播- no

接收传入的UDP多播-是的

接收传入UDP广播-是的
复制代码

1、源码中查找结果

我们就先从其中的一个查起发送TCP连接,后面去查看相关的底层代码,定位到其中的一个发送TCP连接 sendto

ps:测试的时候记得用真机去测试,且弹窗后记得去卸载重装,否则就出现不了了。

在我们自己项目源码中主要查找到了4个地方,网络监测相关的。

2、第三方SDK库怎么排查?

源码能通过全局搜索出来相关的关键字,但是没有源码的呢?要怎么办。

后面想到了逆向,sendto属于系统符号,我们是不是可以去macho文件找到相关的蛛丝马迹呢?

有意思的东西来了,我们在广告的二进制库中查找到了这个

再通过 Symbol Table 中 Data 字段 进入 String Table 字符串表找到 目标字符串

这里data 其实是一个偏移值

0x2ADCF8 + data 得到就是 字符串字节位置

这里又想起了Linux的一个基础命令nm(names)nm命令主要是用来列出某些文件中的符号

nm  #{libFilePath} -px --extern-only -arch arm64 |  grep "sendto"
复制代码

image-20210709102340069.png

到了这里大体思路就明确了。

同时我们的项目中,又涉及到几十个的framework和lib静态库,总不能一个个手动敲过去,或者以后我们要查其他的符号怎么处理呢?

3、脚本与查找结果

于是,撸起袖子干,一个简单的脚本就出场了,以后大家有类似的查找系统符号表的需求,可以大概参考下

#!/usr/bin/ruby @slj
# 查找静态库、framework中引用的方法,或者符号表
# 拷贝到要查找的路径下,或者设置path
# 用法: ruby LibraryFindSymbolUtil.rb
# 输出结果 :
#     ===lib 包含===
#     ====framework 包含==
# coding: utf-8
require 'fileutils'

# 要查找的文件夹路径  修改路径
path = "/Users/ss/Workspace/YoubaobaoApp/BBJShellApp/Pods"

unless File.directory? path
    path = Dir.pwd  #路径不存在,使用当前路径
end
#要查找的 符号
find_symbols = "sendto"

libs = Dir.glob("#{path}/**/*.a")
libs.each do |lib|
  output = `nm -px --extern-only #{lib} |  grep "#{find_symbols}"`
  if output.include? find_symbols
    puts "===lib 包含=====" + lib
  end
end

frameworks = Dir.glob("#{path}/**/*.framework")

frameworks.each do |fw|
  basename = File.basename(fw, ".framework")
  fw_lib = File.join(fw, basename)

  if File.exist? fw_lib
    output = `nm  -px #{fw_lib} -arch arm64 |  grep "#{find_symbols}"`
    if output.include? find_symbols
      puts "====framework 包含==" + fw_lib
    end
  end

end

exit
复制代码

我们自己的项目静态库中包含sendto 符号表这个方法的

libRCT-Folly-Debug.a
liblibevent.a
libRCT-Folly.a
复制代码

查找到的第三方SDK库

image-20210709095435828.png

我们只能尽量减少不必要出现的场景,对于第三方的SDK,阿里爸爸的,额,我们就无能为力了。

4、思考

我们找出了对应的SDK包含了这个符号表,我们是不是也可以class-dump命令找对调用的class呢?

找到了class是不是可以知道公开的头文件的方法了,那我们Hook,或者通过runtime方法交换,是不是可以定位在哪个 类、哪个「方法」弹窗了。

额,接下来就是iOS逆向的方面的知识了。

有兴趣的同学可以试试看 class-dumphopperapp


本文是在公司内部知识点分享,在这里做记录

欢迎您加入美柚大家庭,可以帮您内推。
内推简历发送至邮箱: suliangjin@xiaoyouzi.com

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享