移动应用:进入物联网的后门?

安全 移动安全
在本文中,我们将解决逆向工程繁琐这个问题,并提出一个更容易的方法来逆向智能对象。我们的思路是,在许多情况下无需关注对象本身,而是关注相关的移动应用程序。我们详细介绍了该方法在三个智能对象上的应用,结果表明这种方法的效果非常棒。

[[180995]]

摘要

现在,每天都有大量新设备接入物联网,但是迫于市场的压力,这些设备的安全性和隐私性往往没有得到足够的重视。为了评估和改善这些设备的安全状况,研究人员需要对它们进行逆向工程。不幸的是,这可不是一个容易的任务,因为他们需要面对各种不同的智能对象,并且它们经常使用定制的硬件、固件、操作系统和协议,这意味着每次逆向工程都需要从头开始,这是相当费时费力的。

在本文中,我们将解决这个问题,并提出一个更容易的方法来逆向智能对象。我们的思路是,在许多情况下无需关注对象本身,而是关注相关的移动应用程序。我们详细介绍了该方法在三个智能对象上的应用,结果表明这种方法的效果非常棒。实验的设备包括:智能牙刷、智能手表和家用安全报警器。

引言

在牛津英语词典中,将物联网(IoT)定义为“互联网的进一步拓展,能让日常生活中的所有对象互联互通,允许它们发送和接收数据”。现在,物联网正在逐步走入我们的生活。2014年,约有20亿个物联网设备,这已经超过了笔记本电脑和台式电脑的数量(15亿),并且与智能手机的数量(18亿)相当。一些最常见的物联网对象包括:智能手表(请注意,截止2015年第4季度,智能手表的出货量就已经超过了瑞士手表)、健身腕带(通常用于人类,但也可用于猫和狗的设备,如奥托宠物系统)、智能电视和智能眼镜。但这些只是其中的很少一部分,物联网设备实际上涉及广泛的领域:

  • 娱乐领域,例如Archos公司的音乐智能比尼帽,Mattel公司的智能芭比娃娃Hello Barbie。
  • 高科技领域,例如Recon Instruments公司的增强现实防雪面罩,Narrative公司的可穿戴相机等。
  • 时尚领域,例如Volvorii公司的物联网高跟鞋或服装。
  • 农业领域,例如奶牛授精。
  • 健康和安全领域,例如Netatmo June公司的皮肤暴露检测仪,Vigo公司的睡眠检测仪,Glow-Cap公司的药物提醒帽。等等。

然而,这些设备的隐私和安全问题却非常让人担忧。迫于市场压力,这些物联网设备通常会急不可耐的尽早面世,因此,通常都没有经过适当的安全审查,有时甚至缺乏正确的安全设计。例如,HP研究发现,90%的IoT设备至少会收集一条个人信息,70%的设备使用未加密的网络,10个UI中有6个设备容易受到诸如XSS和弱凭证的威胁。根据这些现状,IDC预测到2016年12月,90%的IT网络将因IoT的安全漏洞而遭受威胁。在消费者方面,埃森哲咨询公司在28个不同国家对28,000个人进行了调查结果表明,47%的消费者对IoT存在隐私和安全担忧。

为了评估智能对象的安全性和隐私性,研究人员需要密切分析它们的具体实现。但是,由于技术文档很少,所以第一步通常需要对相关设备进行逆向工程。逆向工程本来就不是一个轻松的任务,对于物联网设备来说,就更加困难了,因为(i)它们使用的组件越特殊,人们对它的了解就越少,以及(ii)因为智能对象彼此差异很大。前者需要了解陌生领域的专业知识(例如,Riot,Contiki,Brillo等操作系统),而后者则意味着需要逆向智能对象,但是逆向一个智能对象的经验,在逆向其他对象的时候帮助不大。例如,智能手表的逆向工程与智能牙刷的逆向工程几乎没有共同之处。因此,在第一个任务期间获得的经验对第二个任务几乎没有帮助。

这些正是本文要解决的问题。我在这里提出了一种简单的方法,并且我已经多次实践,证明该方法确实有效。这种方法能够使得逆向过程的前面几步更加简单,从而有助于研究人员更快地了解设备本身。此外,它还能提供许多有价值的信息,可以使进一步的逆向工作更集中、更有针对性。

在本文中,我们首先讨论这个主题的前期工作(第2节),然后解释我们使用的方法(第3节)。然后,通过三种不同智能对象举例说明我们的方法:智能牙刷(第4节)、智能手表(第5节)和(第6节)。最后,我们将对这种方法进行总结。

发展现状

虽然物联网已经开始流行,但是,其安全研究仍处于早期阶段,相关的出版物也远少于其他领域,如操作系统安全。我们可以引用的文献有NEST恒温器、WeMo电源插座、健康输液泵中的漏洞、在Fitbit Flex dongles中注入任意代码、蓝牙扫描、婴儿监视器等等。一方面,这些研究为逆向物联网设备提供了有趣的线索,同时,也说明了不同的智能对象的差距是多么大,以及研究人员为了了解它们而需要做的工作量有多么大。

参考文献[14]将这项任务比作CTF竞赛,这看起来是非常合适的,因为每个挑战是不同的而且非常耗时,并且在网络上也找不到立即可用的解决方案。

在学术界,一些研究人员提出了相关的方法或自动化方法来帮助逆向固件。文献[15]给出了物联网不同攻击面的详细清单。该清单有助于在安全审核/渗透测试时防止遗漏某些领域。然而,它对逆向工程本身没有提供帮助,只是旨在帮助我们涵盖安全相关的所有方面。对于自动化框架和工具,它们是有发展潜力的,但目前仍处于早期阶段,因此现在还难以在实践中大展拳脚。

方法论

为了简化物联网设备的逆向工程,本文提出了以下方法:这种方法不是直接逆向智能对象本身,而是首先侧重于逆向与它们打交道的移动应用程序。

许多物联网设备都是通过相关的移动应用程序来进行控制、监督或与之交互的。例如,Meian公司的安全报警器就提供了相应的Android应用程序,帮助最终用户启动、停止设备,获取状态或设置警报区域。类似地,Beam牙刷也配备了与智能牙刷等通信的iOS或Android应用程序。当有这样的移动应用程序可用时,那就为我们提供了很大的优势:

更简单。有许多工具可以用来逆向移动应用程序(例如apktool、baksmali、clutch以及IDA Pro)。反病毒分析师经常使用这些工具来考察移动病毒,因此我们会有一个良好的支持社区。

安全性。物联网供应商开发这些移动应用程序(因为它们对最终用户很有吸引力)通常是处于营销的角度来考虑的,所以不会将它们完全集成到其安全设计中(如果有的话)。因此,我们通常有机会访问这些移动应用程序未经混淆的源代码,更有甚者,我们还能在这些应用中找到危及智能对象本身的安全漏洞,具体参考第6节。

退可守。如果针对移动应用的分析不足以解决问题,则研究人员总是可以将逆向智能对象作为研究的第二步。在第一阶段收集的信息很可能有助于在第二阶段进行更有针对性的逆向工程。

Beam牙刷

概述

智能牙刷的问世已经有一段时间了,但直到2015年才引起了相关媒体的关注,因为当时Beam在一份围绕其联网设备的牙科保险计划中提到了它。每支Beam牙刷都纳入了牙科保险计划,并且每支牙刷有自己的特殊优惠(例如免费牙膏)和附属牙医。

与胰岛素泵或起搏器相比,牙刷可能还涉及不到最敏感的健康数据。然而,一旦与保险单挂钩,就会引发多个问题,无论从安全教育角度还是从隐私角度考虑,考察该牙刷的工作原理都是非常有趣的。

该牙刷除了提供其商品规格:蓝牙LE 4.0(BLE)、声波电机、尺寸和颜色之外,没有提供其他技术信息。此外,也没有用户论坛,没有开发者社区,也没有学术出版物。不幸的是,这种情况对于物联网设备来说是非常常见的:我们必须从头开始,因为没有信息可供利用。

面对这种处境,一条路是拆卸牙刷的硬件:拆开它,拿到电子组件,探测测试点等。但是,这里我们决定重点探索该设备相关的iOS和Android移动应用。

逆向iOS应用程序

在逆向iOS应用程序的时候,它的架构对我们是很有帮助的。因为应用程序会使用名为BeamBrushData.sqlite的sqlite数据库,其中包含多个表,如BrushEvent、ClientDevice和ClientSession(请参见图1),所以,我们可以通过在函数名称中搜索关键字“primaryKey”来列出这些表。

http://p4.qhimg.com/t01cbb49290dd78dc7d.png

图1:Beam牙刷的移动应用程序所使用的SQL表。

每个表的内容都是由mappings命名的函数进行描述的,例如Insured表的[Insured mappings]。

了解每个表的字段对于掌握哪些数据被存储以及哪些数据可能泄露给对手是非常有用的。例如,BTStarCardInfo表包含最终用户的积分的变化情况:name,beforeValue,afterValue,starCount,lastTotalStars,totalStars。积分是最终用户完成指定挑战(例如连续刷牙超过两分钟)时授予终端用户的虚拟点数。攻击者当然可以尝试修改这里的值来获取积分——当然,还可能存在其他相关的检查,例如在远程服务器上的检查事项等。

存储在这些表中的信息对于广告工具包或广告软件来说,可能是非常有价值的。例如,Insured表保存被保险用户的称谓,名字,中间名,姓氏,性别和出生日期,当然用户也可能是家庭中的成年人(通常是父亲或母亲)。然后,User表为家庭的其他成员(例如儿童)提供相同的信息。因此,通过分析这些表中包含的数据,间谍软件可以了解特定家庭的组成成员,然后给他们发送有针对性的广告等。

除了数据库结构之外,通过反汇编iOS应用程序还能揭示它实现的类的结构。移动应用程序二进制文件的objc节提供了每个类的方法和字段的完整概述。例如,图2示出了UserSummary类的字段——也称为属性(例如,beamScore,numberOfBrushDaysLeft)和方法(例如,beamScoreRoundedInteger)。此外,IDA Pro中的注释也特别有用,甚至为每个字段的类型和方法都提供了签名。

IDA Pro显示了UserSummary类的方法和属性

图2:IDA Pro显示了UserSummary类的方法和属性。属性的注释显示了该字段的具体类型。

从这里我们可以了解到:

牙刷提供了加速度计和陀螺仪。两者都在BTBrushData类中提供了一个三轴向量。牙刷就是通过它们来了解最终用户是否正在刷牙,如果是的话,当前位于哪个象限(口腔被分为四个区域,或象限:左上,右上,右下,左下)。

固件的空中下载服务。BTFirmwareUpdater类的内容表明,该固件提供了通过空中下载进行的更新服务。更新固件时,会将新固件的字节发送到牙刷,直到写入所有字节为止。

  1. char *firmware; 
  2. unsigned int totalLength; 
  3. unsigned int written; 
  4. unsigned int toWrite; 
  5. unsigned int loopCount; 
  6. int state; 
  7. CBService *otaService; 
  8. CBCharacteristic *otaControlPoint, *otaDataPoint; 

这些积分只是软件而已。特定最终用户的积分数量并不存储在牙刷本身上,而是存储在移动电话上(并且可能在远程服务器数据库上)。事实上,类BTBrushData,BTBrushEvent,Device和ClientDevice中没有积分相关的字段。从这些类的内容可以看出,牙刷是由固件、硬件、序列号、闪光灯、电池电量、电动机(其速度是可控的)、三轴陀螺仪、三轴加速度计、自动关闭定时器和具有BLE功能的芯片构成的。

逆向Android应用程序

通过逆向该Android应用程序,我们可以获得更多的详细信息。例如,虽然我们知道牙刷导出了几种BLE服务和characteristic(参见图3),但是除了标准的服务之外,大多数都是未知的。

牙刷的BLE characteristic

图3:牙刷的BLE characteristic。

通过逆向Android应用程序,能够更轻松地找到每个characteristic的意义。例如,图4中的代码给出了牙刷的电动机速度(其转换为刷子每分钟的行程)的UUID和象限蜂鸣(当最终用户在特定象限中的刷牙时间足够长时,牙刷就会振动)。我们在表1和2中分别列出了已知的BLE服务和characteristic。

用于电机速度和象限蜂鸣的BLE characteristic

图4:用于电机速度和象限蜂鸣的BLE characteristic。

  1. UUID                               描述 
  2. 00001800-0000-1000-8000-00805f9b34fb 通用访问(标准) 
  3. c05fc343-c076-4a97-95d3-f6d3e92a2799 固件 OTA 服务 
  4. 04234f8e-75b0-4525-9a32-193d9c899d30 Beam 服务 
  5. 89bae1fa-2b59-4b06-919a-8a775081771d 可能是加速度计/陀螺仪芯片服务 

表1:Beam牙刷的BLE服务。

  1. UUID                                   描述 
  2. a8902afd-4937-4346-a4f1-b7e71616a383 布尔指示器,指示牙刷处于活动状态 
  3. 267b09fd-fb8e-4bb9-85ccade55975431b  电机状态 
  4. 3530b2ca-94f8-4a1d-96beaa76d808c131  当前时间 
  5. 833da694-51c5-4418-b4a9-3482de840aa8 电机速度 
  6. 19dc94fa-7bb3-4248-9b2d-1a0cc6437af5 自动关闭和象限蜂鸣指示器(2位) 
  7. 6dac0185-e4b7-4afd-ac6b-515eb9603c4c 电池电量(2字节) 
  8. 0971ed14-e929-49f9-925f-81f638952193 牙刷颜色(1 byte) 
  9. 0227f1b0-ff5f-40e3-a246-b8140205bc49 加速度计数据(6字节) 
  10. ed1aa0cf-c85f-4262-b501-b9ddf586a1db 陀螺仪(6字节) 
  11. cf0848aa-ccdb-41bf-b1e1-337651f65461 按钮状态 

表2:我们对Beam牙刷最感兴趣的BLE characteristics

有了这些信息,我们便可以使用自己的实现代码来控制自动关闭和象限蜂鸣功能了。

我们可以控制的功能包括:

打开与牙刷的BLE连接。

将字节值写入相应的characteristic UUID中。最低有效位用来控制象限蜂鸣,第二位控制自动关闭。

断开牙刷的连接。

BLE命令可以使用诸如建立在bluez(蓝牙栈实现)之上的gattlib [21]之类的库和简单的BLE USB dongle来发送。

利弊

通过对Beam牙刷的移动应用程序进行逆向,我们发现了下列有效信息。

存在陀螺仪和加速度计。这一点上,通过拆卸牙刷的硬件也能达到同样的效果,只不过做起来可能会有点难度,具体取决于芯片的封装方式。显然,逆向移动应用程序的优点是我们不需要拆开牙刷,并且也没有毁坏它的风险。缺点是我们看不到组件的铭牌和型号,因此也无法了解其电器规格。

存在固件更新服务。对于这一点来说,很难通过其他方式(例如通过监听BLE流量)来获得。

积分并未存储在牙刷本身中。这一点很难通过硬件探测或BLE扫描找到。

实现代码的设计。显然,没有反汇编代码的话,是没有办法了解这一点的。我们唯一不知道的部分,就是硬件设计。

识别BLE服务和characteristic。这一点也可以使用BLE扫描器应用程序(例如nRF主控制面板[22])来达到目的,但需要消耗更长的时间,因为必须通过尝试各种值,然后通过观察牙刷的行为差异来进行识别。

智能手表

架构

我们对索尼的智能手表SmartWatch 2 SW2进行了相应的实验。

与Beam牙刷不同,这款智能手表提供了很多技术信息和开发人员信息,这主要得益于索尼鼓励开发人员为其编写新的应用程序。索尼为该产品提供了相应的API、文档、示例和教程。该智能手表含有STM32F439 SoC(包括ARM Cortex-M4和加密加速器)、光传感器、加速器,支持NFC和蓝牙3.0(注意不兼容低功耗蓝牙技术)和LiPo电池。它运行的是Micrium的μC/ OS-II实时操作系统。

知道了这一点,那么就可以请μC/ OS-II或ST微电子SoC专家继续对设备的相关部件进行深入调查。在本文中,我们假设研究人员无法接触这方面的专家,相反,我们将重点研究该智能手表的应用情况。要使用智能手表,必须至少安装两个Android应用程序:一个名为Smart Connect的应用程序以及一个名为SmartWatch 2 SW2的应用程序。这里,我们将重点考察这两个应用程序。

要了解这些应用程序,必须首先掌握索尼的有关术语。对于索尼而言,智能手表更一般的称呼为智能配件,因为还有其他类型的配件,如耳机等。一个智能手表的“应用程序”(我们稍后就会发现,实际上根本没有这样的东西)被称为智能扩展。

要创建新的智能扩展程序,开发人员需要对使用了索尼的智能扩展API的代码进行编译,从而得到一个Android应用程序(即一个.apk程序,研究人员可以使用标准工具,如apktool,baksmali等对它们进行逆向)——但需要注意的是,只有将我们前面提到的两个应用程序都安装之后,该应用程序才能正常运行。

因此,为了安装智能扩展程序,最终用户需要安装开发人员的apk,即Android应用程序。该应用程序由两个强制性应用程序之一的Smart Connect自动找到,并添加到相应的智能配件中。这样,新的智能扩展图标就会出现在智能手表上。

需要注意的是,我们没有在智能手表本身上直接安装软件。事实上,根本就没有智能手表应用程序的概念。实际上,智能扩展的所有工作都是在智能手机上完成的。智能手表基本上只是充当一个远程显示器。智能扩展生成的各种事件和消息都是由两个强制性应用程序中的第二个,即SmartWatch 2 SW2生成的。这个应用程序实际上就是索尼所谓的主机应用程序,即专门用来跟给定智能附件(就本例而言,就是SW2)通信的Android应用程序。我们在表3和图5中对相关的术语进行了详细的解释,需要注意的是,其中一些很容易引起误解。

http://p3.qhimg.com/t010a609b96782eaf78.jpg

图5:索尼SmartWatch 2 SW2的架构。

  1. 名称            说明 
  2. 主机应用程序专门用于跟特定智能配件通信的Android应用程序的通用术语。 
  3. 智能配件    智能手表、智能耳机等的通用术语 
  4. Smart Connect这是必须安装在智能手机上才能使用智能手表的两个强制性Android应用程序之一。这是一个官方的索尼应用程序。它管理哪个扩展使用哪个配件。它的软件包名称是com.sonyericsson.extras.liveware。 
  5. 智能扩展    这是一个Android应用程序,它在手机上运行,但可从智能手表远程访问/控制。索尼提供了几个扩展(Twitter feed,Facebook feed,Chrono),并鼓励开发人员创建自己的扩展。 
  6. Smart Watch 2 SW 2这是SW2的两个强制性Android应用程序中的另一个。实际上,它是SW2配件的主机应用程序。这是一个官方的索尼应用程序,该软件包名为com.sonymobile.smartconnect.smartwatch2。 

表3:索尼的智能手表术语。

推论

知道了智能手表的架构之后,可以得到下列推论:对于智能手表上的任何扩展,实际上都可以通过逆向其Android应用程序的代码来进行安全分析。

我们假设,需要考察发送SMS消息的扩展。智能手表本身没有什么可逆向的,相反,我们需要做的是反汇编相关的Android应用程序,这样,就能找到像smsManager.sendTextMessage(mPhoneNumber,null,message,...)这样的代码。如果智能手表恶意软件的确存在并在传播的话,防病毒供应商只需要为相应的Android应用程序写签名即可,这些事情正是他们所擅长的。

此外,我们还可以对官方SmartWatch 2 SW2主机应用程序也进行逆向工程。逆向结果表明,与远程智能手表的通信是通过“Costanza”消息来进行处理的。这些消息由类型(消息类型),消息标识符和打包的缓冲区字节组成。打包或解包是通过名为“protocol”(libprotocol.so)的本机库进行处理的。一旦打包完毕,这些消息就可以通过蓝牙进行发送了——这里是通过Android API来打开蓝牙套接字的。Costanza消息的类型有多种,例如:

电池电量指示(id = 18),电量水平以百分比形式表示。

恢复出厂设置的请求和响应(id = 20或21)。

'Force crash'(id = 666)。源代码表明,这里有一个隐藏的调试界面,其中含有“Force crash on watch”按钮。这将创建以下消息:

  1. public RequestForceCrash(int 
  2. newMessageId) { 
  3. super(newMessageId); 
  4. this.type = 666
  5. this.mMagic = 0xC057A72A

注意类型666和魔法值,可能与前面讲过的'costanza'消息相匹配。

Fota请求(id = 6)。这可能意味着空中下载更新固件。

传感器数据(请求或响应)(id = 127或128)。

滑动指示(id = 116)。

版本请求和响应(id = 4和5)。

振动请求(id = 129),其中包括振动的持续时间等。

这些消息的用法和标识符将很难通过其他方式找到(特别是在正常情况下不出现的Force Crash消息)。同样,这也证明了通过考察移动应用来分析物联网硬件是多么的有价值。

安全报警器

Meian公司是一家家用安全报警器的制造商。该公司的一些报警器可通过SMS进行远程控制:您可以远程启动/停止报警器、获取其当前状态、启用/禁用某些监控区域等。当然,这些命令必须符合特定的格式,同时,还必须提供正确的密码。为了控制报警器,最终用户必须按照特定格式把相应的命令写入SMS,并将其发送到报警器。当报警器接收SMS后,会对传入的消息进行处理,并回复执行结果。由于Meian对于SMS消息的格式的要求非常严格,所以Meian专门实现了一个Android应用程序来自动格式化短信。在配置期间,最终用户需要提供报警器的具体配置:报警器的电话号码、管理密码、输入密码时可接受的延迟、紧急电话号码(如果检测到入侵,则拨打该号码)。然后,该应用程序就会提供用于启动/停止/获取警报的状态(等等)的各种按钮(参见图6),这给用户的操作带来了极大的便利。

http://p3.qhimg.com/t016fd5567d0cf8ead4.png

图6:用于远程控制家用安全报警器的Android应用程序的主屏幕。

同样的,这里我们还是通过分析设备的移动应用程序来考察该设备的安全问题。这里存在两个安全问题:

短信未删除。发送的短信会继续保留在智能手机上,除非手动删除。因此,如果攻击者能够读取它的话,就能得到报警器的密码。注意,无论最终用户是否使用该应用程序(手动写入SMS),都会出现此问题。

报警器配置的弱保护。该应用程序使用了一个弱加密算法来保护配置数据(电话号码、密码、紧急电话号码和延迟。请注意,配置数据是非常敏感的,因为任何人都可以用它来控制报警器。攻击者可以轻松逆向该加密算法,从而解密所有的设置(参见图7中的概念证明)。该漏洞在2015年就报告给Meian [23]公司了,但是一直没有回应。在Play商店中的这个应用程序仍未修复该漏洞,截至目前已被下载了1,000到5,000次。

http://p7.qhimg.com/t014a75997f9b9a4990.png

图7:解密安全报警器的所有主要机密设置的概念证明。

这个家用安全报警器的安全状态总结在表4中。遗憾的是,它的相关移动应用实际上给该设备的安全性带来了很大的麻烦,这也正是其他物联网设备正面临的问题之一。

情形:攻击者可以获得报警器的密码或电话号码... 从发件箱的命令SMS中...? 一旦SMS消息被删除...?

  1. 手动SMS是否 
  2. 使用Meian的Android应用程序是是 

表4:使用Android应用程序前后报警器的安全状况比较

结束语

物联网设备的安全分析具有很大的挑战性,主要是因为它们的多样性所导致的,有时研究人员根本就不知道如何开始或从哪里开始。本文表明,在这种情况下,我们不妨从相关的移动应用程序开始下手,因为它们通常会与物联网设备进行通信,这是一个不错的起点。此外,这些移动应用在物联网设备中是非常常见的。

在本文中,我们通过相关移动应用程序分析了三种不同的设备:智能牙刷,智能手表和家用安全报警器。在所有三个案例中下,我们所用的策略都能够快速揭示其安全设计、协议详细信息和相关漏洞。当然,这些信息也可以通过其他方式发现,例如蓝牙扫描和模糊测试,但这样会需要消耗更多的时间,因为我们不得不猜测多种可能,而移动应用程序逆向工程则能够直接给出结果。

事实上,物联网和移动应用程序的结合会带来多个问题。为此,供应商应该设法完善设备的安全设计和实现,以及提高相关的移动应用的安全性。注意,对代码进行模糊处理的快速修复方案将很难奏效,而应该下大力气改进安全设计和实现。另外,防病毒行业需要为IoT恶意软件做好准备,无论来自设备本身还是来自移动应用程序。这可能是安全行业的下一个主战场。

责任编辑:赵宁宁 来源: 安全客
相关推荐

2023-04-20 13:31:35

物联网智能建筑

2020-01-20 13:59:10

物联网移动应用蓝牙

2019-05-22 09:00:00

物联网移动应用IOT

2020-05-19 15:09:52

5G物联网移动宽带

2020-03-26 22:03:06

物联网移动应用用户体验

2019-05-22 09:43:29

物联网应用物联网IOT

2020-06-09 15:17:50

物联网自动驾驶智能

2019-06-11 09:45:56

物联网应用酒店IOT

2023-08-18 11:42:51

物联网IOT

2023-08-08 10:26:20

2023-12-06 13:18:00

物联网

2021-08-06 10:26:14

蜂窝物联网物联网IOT

2013-03-26 11:41:37

移动互联网硬件时代应用时代

2020-06-15 07:56:48

物联网移动基于物联网的移动应UX。 物联网为应用

2020-08-31 11:36:21

物联网移动应用程序IOT

2018-05-04 07:26:38

工业物联网物联网人工智能

2022-09-27 16:08:06

物联网IOT

2023-08-01 16:08:11

物联网IOT

2020-05-25 20:54:56

物联网智能电网技术

2021-12-07 18:35:08

物联网执法应用IOT
点赞
收藏

51CTO技术栈公众号