drozer安装与使用总结(含adb命令总结)
本文参考并拷贝了网上很多人的文章,仅作为个人思路总结。由于环境搭建复杂,步骤繁多,因此制作本文章,留以查看。
如想详细了解adb命令,可直接在目录中点击进入1.4.2 adb命令总结。
如想了解(逍遥)模拟器上运行drozer agent,与电脑drozer的连接步骤,可直接点击二、连接。
如有侵权,请联系,我将主动删除。
drozer安装与使用总结(含adb命令总结)
- 一、环境的安装
- 1.1 电脑下载安装依赖
- 1.1.1 jdk1.7
- 1.1.2 python2.7.15
- 1.1.3 逍遥模拟器
- 1.2 电脑下载安装drozer
- 1.3 在模拟器上安装手机drozer agent
- 1.4 adb管理工具
- 1.4.1 配置及说明
- 1.4.2 adb命令总结
- a、查看应用列表
- b、安装apk
- c、卸载apk
- d、清除应用数据与缓存命令
- e、Android四大组件相关命令
- f、日志相关命令
- g、查看设备情况
- h、修改设置
- i、实用功能
- j、查看进程
- 二、连接过程
- 1、查看连接设备
- 2、端口转发
- 3、开启drozer控制台
- 三、drozer使用
- 3.1 通过app.package.list模块获取要检测的app的包名
- 3.2 使用app.package.info模块查看apk基本信息
- 3.3 使用app.package.attacksurface模块识别攻击面
- 3.4 使用app.activity.info模块查看activity组件信息
- 3.5 使用app.broadcast.info模块查看暴露的广播组件接口
- 3.6 使用app.provider.info模块查看content provider(数据提供接口)组件信息
- 3.7 使用app.service.info模块查看service组件信息
- 3.8 文件操作
一、环境的安装
1.1 电脑下载安装依赖
1.1.1 jdk1.7
安装jdk1.7(我之前安装的为1.8,也可以用)。Java是安卓的主要开发语言,与手机交互时使用。jdk安装、环境变量配置可参考链接链接https://www.cnblogs.com/lsdb/p/6497816.html。
用户变量下:
编缉Path变量在最后添加:;C:\Program Files\Java\jdk1.8.0_131\bin
系统变量下:
新建JAVA_HOME变量:C:\Program Files\Java\jdk1.8.0_131新建CLASSPATH变量:C:\Program Files\Java\jdk1.8.0_131\lib
1.1.2 python2.7.15
安装python2.7.15https://www.python.org/downloads/release/python-2715/。drozer使用python2.7编写不支持python3.x,所以只能装python2.7。原先电脑中装python 2.7.18,但无法运行drozer console connect显示模块不存在。更换版本为2.7.15.运行正常。将python的两个路径分别加入系统变量中的Path变量中。
系统变量下:
C:\Users\******\Desktop\Python27\C:\Users\******\Desktop\Python27\Scripts
1.1.3 逍遥模拟器
将逍遥模拟器MEmu.exe的安装路径D:\Program Files\Microvirt\MEmu
也添加入系统变量中的Path变量中。
1.2 电脑下载安装drozer
下载链接:https://github.com/mwrlabs/drozer/releases/。选择系统相应的包,选windows的msi安装包。
1.3 在模拟器上安装手机drozer agent
可将agent安装包存放于电脑中,而后如图点击安装将drozer agent安装到手机。
agent下载地址:https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk
双击打开启agent,如下图确保右下角按钮显示为“开启”(如果显示为关闭,在其上点击将其切换为开启即可)。
1.4 adb管理工具
1.4.1 配置及说明
参考链接:
adb下载安装及使用
adb命令整理大全
开发者工具ADB命令行使用汇总——ADB安装(初学者手册)
微信公众号「闷骚的程序员」关于adb的最全解释
adb----Android Debug Bridge,一般在Android SDK安装目录下的platform-tools文件夹下就有,也可以另外下载安装。它就是一个命令行窗口,用于通过电脑端与模拟器或者是设备之间的交互。借助adb工具,我们可以管理设备或手机模拟器的状态。还可以进行很多手机操作,如安装软件、系统升级、运行shell命令等等。
环境变量配置:
环境变量中编辑PATH,新增D:\ChromeCoreDownloads\adb
。
运行在pc端的adb server:
ADB Server是运行在主机上的一个后台进程。它的作用在于检测USB端口感知设备的连接和拔除,以及模拟器实例的启动或停止,ADB Server还需要将adb client的请求通过usb或者tcp的方式发送到对应的adbd上。运行在设备端的常驻进程adb demon (adbd):程序“adbd”作为一个后台进程在Android设备或模拟器系统中运行。它的作用是连接ADB服务器,并且为运行在主机上的客户端提供一些服务。
运行在pc端的adb client:
命令行程序”adb”用于从shell或脚本中运行adb命令。首先,“adb”程序尝试定位主机上的ADB服务器,如果找不到ADB服务器,“adb”程序自动启动一个ADB服务器。接下来,当设备的adbd和pc端的adb server建立连接后,adb client就可以向ADB servcer发送服务请求。
1.4.2 adb命令总结
a、查看应用列表
查看模拟手机上所有应用列表:
adb shell pm list packages
查看系统应用列表:
adb shell pm list packages -s
查看第三方应用列表:
adb shell pm list packages -3
b、安装apk
adb install "-lrtsdg" "path_to_apk"“-lrtsdg”:-l:将应用安装到保护目录 /mnt/asec;-r:允许覆盖安装;-t:允许安装 AndroidManifest.xml 里 application 指定 android:testOnly=“true” 的应用;-s:将应用安装到 sdcard;-d:允许降级覆盖安装;-g:授予所有运行时权限;path_to_apk:apk的绝对路径。示例安装淘宝apk:adb install -l /data/local/tmp/taobao.apk
c、卸载apk
adb uninstall -k "packagename"“packagename”:表示应用的包名,以下相同;-k 参数可选,表示卸载应用但保留数据和缓存目录。示例卸载手机淘宝:adb uninstall com.taobao.taobao
d、清除应用数据与缓存命令
adb shell pm clear "packagename"相当于在设置里的应用信息界面点击「清除缓存」和「清除数据」。示例:adb shell pm clear com.taobao.taobao 表示清除手机淘宝数据和缓存。
e、Android四大组件相关命令
Android四大组件有Activity,Service服务,Content Provider内容提供,BroadcastReceiver广播接收器,具体不做多讲,常用的有以下(注意grep为linux下过滤命令):
查看前台 Activity命令:
adb shell dumpsys activity activities | grep mFocusedActivity
查看正在运行的 Services命令:
adb shell dumpsys activity services "packagename"其中参数不是必须的,指定 “packagename” 表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
查看应用详细信息命令:
adb shell dumpsys package "packagename"
调起 Activity命令格式:
adb shell am start [options] 例如:adb shell am start -n com.tencent.mm/.ui.LauncherUI表示调起微信主界面
调起 Service命令格式:
adb shell am startservice [options] 例如:adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService 表示调起微信的某 Service。
强制停止应用命令:
adb shell am force-stop "packagename"例如强制停止淘宝:adb shell am force-stop com.taobao.taobao
模拟按键/输入:
adb shell input keyevent keycode 不同的 keycode有不同的功能
keycode | 功能 |
---|---|
3 | HOME键 |
4 | 返回键 |
5 | 打开拨号应用 |
6 | 挂断电话 |
26 | 电源键 |
27 | 拍照(需要在相机应用里) |
61 | Tab键 |
64 | 打开浏览器 |
67 | 退格键 |
80 | 拍照对焦键 |
82 | 菜单键 |
85 | 播放/暂停 |
86 | 停止播放 |
92 | 向上翻页键 |
93 | 向下翻页键 |
111 | ESC键 |
112 | 删除键 |
122 | 移动光标到行首或列表顶部 |
123 | 移动光标到行末或列表底部 |
124 | 插入键 |
164 | 静音 |
176 | 打开系统设置 |
207 | 打开联系人 |
208 | 打开日历 |
209 | 打开音乐 |
220 | 降低屏幕亮度 |
221 | 提高屏幕亮度 |
221 | 提高屏幕亮度 |
223 | 系统休眠 |
224 | 点亮屏幕 |
231 | 打开语音助手 |
276 | 如果没有 wakelock 则让系统休眠 |
滑动解锁:
如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 input swipe 来解锁。
adb shell input swipe 300 1000 300 500(其中参数 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标。)
输入文本:
在焦点处于某文本框时,可以通过 input 命令来输入文本。
adb shell input text *** (***即为输入内容)
f、日志相关命令
打印日志:
Android 的日志分为如下几个优先级(priority):
V —— Verbose(最低,输出得最多)
D —— Debug I —— Info
W —— Warning
E —— Error
F—— Fatal
S —— Silent(最高,啥也不输出)
某级别过滤日志则会将该级别及以上的日志输出。
adb logcat *:W 会将 Warning、Error、Fatal 和 Silent 日志输出。
(注: 在 macOS 下需要给 :W 这样以 作为 tag 的参数加双引号,如 adb logcat “:W”,不然会报错 no matches found: :W。)
adb logcat | 打印当前设备上所有日志 |
---|---|
adb logcat *:W | 过滤打印严重级别W及以上的日志 |
adb logcat l findstr ***> F:\log.txt | 把仅含***的日志保存到F盘的log.txt文件中 |
adb logcat -c | 清除屏幕上的日志记录 |
adb logcat -c && adb logcat -s ActivityManager l grep "Displayed” | 客户端程序启动时间获取日志 |
adb logcat > F:\log.txt | 打印当前设备上所有日志保存到F盘的log.txt文件中 |
adb logcat l findstr *** | 打印过滤仅含***的日志 |
adb logcat l findstr ***> F:\log.txt | 把仅含***的日志保存到F盘的log.txt文件中 |
按 tag 和级别过滤日志:
adb logcat ActivityManager:I MyApp:D *:S表示输出 tag ActivityManager 的Info以上级别日志,输出tag MyApp的Debug 以上级别日志,及其它tag的Silent级别日志(即屏蔽其它tag日志)。adb logcat -v 选项指定日志输出格式。日志支持按以下几种 :默认格式brief、process、tag、raw、time、long指定格式可与上面的过滤同时使用。比如:adb logcat -v long ActivityManager:I *:S
清空日志:
adb logcat -c
内核日志:
adb shell dmesg
g、查看设备情况
查看设备信息型号命令:
adb shell getprop ro.product.model
电池状况命令:
adb shell dumpsys battery
屏幕分辨率命令:
adb shell wm size
如果使用命令修改过,那输出可能是:
Physical size: 1080x1920
Override size: 480x1024
表明设备的屏幕分辨率原本是 1080px * 1920px,当前被修改为 480px * 1024px。
屏幕密度命令:
adb shell wm density
如果使用命令修改过,那输出可能是:
Physical density: 480
Override density: 160
表明设备的屏幕密度原来是 480dpi,当前被修改为 160dpi。
显示屏参数:
adb shell dumpsys window displays输出示例:WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)Display: mDisplayId=0init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731deferred=false layoutNeeded=false其中 mDisplayId为显示屏编号,init是初始分辨率和屏幕密度,app的高度比 init里的要小,表示屏幕底部有虚拟按键,高度为1920 - 1794 = 126px 合42dp。
android_id查看命令:
adb shell settings get secure android_id
查看Android 系统版本:
adb shell getprop ro.build.version.release
查看设备ip地址:
adb shell ifconfig | grep Mask或者adb shell netcfg
查看CPU 信息命令:
adb shell cat /proc/cpuinfo
查看内存信息命令:
adb shell cat /proc/meminfo
设备的更多硬件与系统属性:
adb shell cat /system/build.prop
单独查看某一硬件或系统属性:
adb shell getprop <属性名>
属性名 | 含义 |
---|---|
ro.build.version.sdk | SDK 版本 |
ro.build.version.release | Android 系统版本 |
ro.product.model | 型号 |
ro.product.brand | 品牌 |
ro.product.name | 设备名 |
ro.product.board | 处理器型号 |
persist.sys.isUsbOtgEnabled | 是否支持 OTG |
dalvik.vm.heapsize | 每个应用程序的内存上限 |
ro.sf.lcd_density | 屏幕密度 |
rro.build.version.security_patch | Android 安全补丁程序级别 |
h、修改设置
修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。
修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。
修改分辨率命令:
adb shell wm size 480x1024
恢复原分辨率命令:
adb shell wm size reset
修改屏幕密度命令:
adb shell wm density 160 表示将屏幕密度修改为 160dpi;
恢复原屏幕密度命令:
adb shell wm density reset
修改显示区域命令:
adb shell wm overscan 0,0,0,200 四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。
恢复原显示区域命令:
adb shell wm overscan reset
关闭 USB 调试模式命令:
adb shell settings put global adb_enabled 0 需要手动恢复:「设置」-「开发者选项」-「Android 调试」
状态栏和导航栏的显示隐藏:
adb shell settings put global policy_control
可由如下几种键及其对应的值组成,格式为 =:=。
key | 含义 |
---|---|
immersive.full | 同时隐藏 |
immersive.status | 隐藏状态栏 |
immersive.navigation | 隐藏导航栏 |
immersive.preconfirms | ? |
这些键对应的值可由如下值用逗号组合:
value | 含义 |
---|---|
apps | 所有应用 |
* | 所有界面 |
packagename | 指定应用 |
-packagename | 排除指定应用 |
举例:adb shell settings put global policy_control immersive.full=* 表示设置在所有界面下都同时隐藏状态栏和导航栏。adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3 表示设置在包名为 com.package1 和 com.package2 的应用里隐藏状态栏,在除了包名为 com.package3 的所有应用里隐藏导航栏。
恢复正常模式:
adb shell settings put global policy_control null
i、实用功能
截图保存到电脑:
adb exec-out screencap -p > sc.png然后将 png 文件导出到电脑:adb pull /sdcard/sc.png
录制屏幕:
录制屏幕以 mp4 格式保存到 /sdcard:adb shell screenrecord /sdcard/filename.mp4 需要停止时按 Ctrl+C,默认录制时间和最长录制时间都是 180 秒。如果需要导出到电脑:adb pull /sdcard/filename.mp4
挂载、查看连接过的 WiFi 密码、开启/关闭 WiFi、设置系统日期和时间都需要root权限,不做多说。
使用 Monkey 进行压力测试:
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。
adb shell monkey -p < packagename > -v 500 表示向 指定的应用程序发送 500 个伪随机事件。
j、查看进程
adb shell ps
查看实时资源占用情况:
adb shell top
查看进程 UID:
adb shell dumpsys package | grep userId=
二、连接过程
1、查看连接设备
双击打开逍遥模拟器。而后按win+r,输入cmd,输入adb devices
,显示已连接设备。该设备ip即为逍遥模拟器ip,端口默认为5555。(怎么修改,无从知晓)
2、端口转发
adb forward tcp:31415 tcp:31415
3、开启drozer控制台
drozer console connect
连接成功:
连接成功后,控制台显示dz> 。
三、drozer使用
使用list查看支持哪些模块。
list
然后,使用help module_name
,或者run module_name -h
查看各module的用法。
最后,通过run module_name module_options
来对app进行检测。
3.1 通过app.package.list模块获取要检测的app的包名
run app.package.list -f package_name
3.2 使用app.package.info模块查看apk基本信息
run app.package.info -a package_name
3.3 使用app.package.attacksurface模块识别攻击面
所谓攻击面,应该就是指可export的安卓四大组件(activaty、broadcast receiver、content provider、service)。
如果查看到四大组件中有可export的,就去具体看可export的组件有没有问题。
run app.package.attacksurface package_name
输出结果:
Attack Surface:
3 activities exported 暴露的控件接口
0 broadcast receivers exported 暴露的广播接收器
0 content providers exported 数据提供接口,数据泄漏
3 services exported service服务接口
解释参考链接:
【安全测试工具】Drozer介绍及使用
解释:
Activity控件接口:
应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。
intent介绍:
可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts。
Intent有以下几个属性: 动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。通过Drozer完整的发送intent消息命令格式为:
run app.activity.start [-h] [–action ACTION] [–category CATEGORY [CATEGORY …]] [–component PACKAGE COMPONENT] [–data-uri DATA_URI][–extra TYPE KEY VALUE] [–flags FLAGS [FLAGS …]] [–mimetype MIMETYPE]
BroadcastReceive广播接收器:
应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
content providers exported数据提供接口:
android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式, 其他应用可以通过ContentResolver类(见ContentProviderAccessApp例子)从该内容提供者中获取或存入数据(相当于在应用外包了一层壳), 只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处:统一数据访问方式。
service服务接口:
services服务接口,一般常驻,连接上公开的service后,可通过service提供的接口调起其他activity等。
检测到攻击面,可进行的攻击:
activities exported 越权攻击,发送伪造消息等;
broadcast receivers exported 发送恶意广播,伪造广播消息,越权攻击等;
content providers exported 数据泄漏,SQL注入等;
services exported 越权攻击,服务拒绝,权限提升等;
3.4 使用app.activity.info模块查看activity组件信息
run app.activity.info -a package_name
对activity尝试进行攻击:
(1)来一把越权攻击:绕过登录页直接拉activity,看到有activity启动不需要权限,尝试用drozer直接拉起这些activity看看。
run app.activity.start --component com.example com.example.activity.WelcomeActivity
(2)发送伪造的残缺消息,刻意制造不完整的intent,发送给对应的activity。
run app.activity.start --action android.intent.action.SEND --component com.example com.example.activity.share.ShareToSessionActivity
intent中缺少extra部分。
3.5 使用app.broadcast.info模块查看暴露的广播组件接口
run app.broadcast.info -a com.example -i 获取暴露的广播组件信息
尝试拒绝服务攻击,向广播组件发送不完整intent(空action或空extras)。
run app.broadcast.send --component com.example com.example.sdk.communication.AppRegisterReceiver --extra string TEXT "hahahaha"
传递空的action。
3.6 使用app.provider.info模块查看content provider(数据提供接口)组件信息
run app.provider.info -a package_name
如果有暴露的content组件接口,可能存在:
数据泄漏问题;
–直接访问URI获取敏感信息;–目录遍历;
构造特殊的URI进行SQL注入;
获取content provider的信息:
run app.provider.info -a com.example -i
使用drozer的scanner模块去猜测可能存在的URIs:
run scanner.provider.finduris -a com.example
检测可注入的URI的注入点:
run scanner.provider.injection -a com.example
SQL注入的方式,如果上一步有拿到可注入的URI,获取某个表(如Key)中的数据:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM Key;--"
3.7 使用app.service.info模块查看service组件信息
run app.service.info -a package_name
获取公开的service服务接口信息:
run app.service.info -a com.example -i
直接启动服务看下
run app.service.start --action com.example.plugin.game.service.GameDownloadService --component com.example com.example.plugin.game.service.GameDownloadService
3.8 文件操作
安装minimal来可以获取暂时的root权限
run tools.setup.minimalsu
进入shell模式,查看/data/data/com.example下是否有明文存储敏感信息。
在AndroidManifest.xml中android:allowBackup字段是否为true。当这个标志被设置为true或不设置该标志时应用程序数据可以备份和恢复,adb调试备份允许恶意攻击者复制应用程序数据。有名的栗子新浪微博android客户端越权泄密事件。
疑难问题可参考以下链接:
https://www.jianshu.com/p/28635f35cf8f
制作不易,点个赞再走吧!
drozer安装与使用总结(含adb命令总结)相关推荐
- app测试(手机自动化测试)----(含adb命令,monkey命令)
[持续更新中] 1.环境搭建: (1). 安装 jdk1.8 [测试 java -version] [appium 运行需要] (2). 安装 sdk [appium 运行需要 ][不要写中文路径,不 ...
- Android常用adb命令-获取应用安装路径
adb shell pm list package - 获取 apk 对应的包名 或 adb shell pm list package <要搜索的字符串> adb shell pm pa ...
- [整理]ADB命令行学习笔记
global driver # 元素定位 driver.find_element_by_id("id") # id定位 driver.find_element_by_name(&q ...
- adb connect 连不上_使用ADB命令卸载安卓手机系统软件
有句话怎么说的?哦,是这样说的:"我就喜欢看你想干掉我却又干不掉我的样子!"当你买了一部安卓手机,发现手机上塞满了各种你根本不想要也用不着却又卸载不了的软件,心中难免万" ...
- android 环境配置和安装, Android系统包说明,基本控件,常用代码,ADB 命令行,APK文件确解,小技艺,...
一. 环境配置和安装(Android2.2) 参考文章:这里 1.1 JDK 1.2 SDK 下载地址:http://dl.google.com/android ...
- Android使用adb命令安装应用-连接usb
adb命令最全,墙都不扶,就服他,好东西要记录和分享 全网最全adb命令_国内某知名游戏公司小菜鸡工程师-CSDN博客 接下来开始正文 一.配置adb的环境变量 如果没有配置,请移步Java配置环境变 ...
- Android开发之adb命令安装apk的问题
众所周知,有时候我们只有apk安装包不一定可以直接在AS跑起来,所以有了adb命令安装 使用adb命令的前提: 1.你的首先配置adb的环境变量查看环境变量配置方法 2.配置好后请检查是否配置成功?如 ...
- android 代码发adb,Android预安装软件adb命令编译源码
Android预安装软件&adb命令&编译源码 发布时间:2020-06-02 17:28:41 来源:51CTO 阅读:895 作者:年少的风 1.预安装软件: 将eclipse下的 ...
- adb命令安装apk 来学习吧
1.将需要安装的apk放在platform-tools下 2.将手机和电脑连接,在cmd中输入 adb devices查看 3.使用adb命令安装apk,在cmd中输入:adb install apk ...
最新文章
- UF_DRAW_set_view_display 使用问题
- linux下的ps命令
- 打破冷漠僵局文章_研究僵局–第3部分
- es通过mapping创建索引出错
- mybatis基于注解(三)
- linux 添加deepin ppa,Deepin 添加PPA源问题
- java vc_vc++与 java有什么不同
- Markdown流程图实用工具汇总Obsidian+excalidraw
- xsmax无法进入dfu模式_iPhoneXSMax怎么强制重启-如何进入DFU模式
- 根轨迹 matlab 怎么画一半儿,现有 1020 个西瓜,第一天卖一半多两个,以后每天都卖剩下的一半多两个,编程计算几天后能把所有西瓜都卖完? 请编程实现_学小易找答案...
- android webView加载页面时显示出全部网页内容
- the owning Session was closed
- [渝粤教育] 平顶山学院 学前心理学 参考 资料
- 【人工智能】深度学习、神经网络图
- 国科大学习资料--人工智能原理与算法-第十三次作业解析(学长整理)
- 05-SA8155 QNX I2C框架及代码分析
- EasyUI 系列之 combobox 默认选中第一个 添加请选择选项
- 20170118修改商品流水
- 特斯拉、软件与颠覆,下一家震惊世界的科技公司会是谁?
- 2022年全球与中国LED嵌入式照明行业发展趋势及投资战略分析报告