当前位置: 首页 > news >正文

安卓逆向_5 --- jeb 和 AndroidStudio 动态调试 smali

Jeb 工具的使用

  • :https://www.52pojie.cn/forum.php?mod=viewthread&tid=742250
  • :https://zhuanlan.zhihu.com/p/302856081

动态调试 smali 有两种方法:

  • Jeb 调试
  • AndroidStudio + smalidea 插件动态调试。

1、Jeb 动态调试 smali

​JEB是一个功能强大为安全专业人士设计的安卓应用程序反编译工具,用于逆向工程或者审计apk文件,可以提高效率减少许多工程师的分析时间。

jeb 动态调试分两种:

  • 普通调试 模式
  • debug 调试 模式

Jeb 常用功能、简单使用

  • 1. 反编译 apk、dex
  • 2. 包名 树状图
  • 3. 查看指定类的 smali 代码
  • 4. 转换成 java 语言
  • 5. java 代码中双击函数 进入函数方法的定义 ,查看方法的调用
  • 6. 查看 AndroidManifest.xml

打开 jeb 方法的 2 种方法:

  • 方法 1:直接打开 jeb.exe 软件
  • 方法 2:执行 jeb_wincon.bat,当需要定制 jeb 的参数时,可以直接修改 jeb_wincon.bat 再执行。

简单使用

  • 把 apk 拖拉到 JEB 中即可反编译 apk 双击 Bytecode 打开 smali 代码
  • 双击 包名 下的 类名 即可查看 smali 代码
  • 选中 smali 代码,然后按 tab 键 可转成 java 代码。或者 "右键 ---> 解析" 也可以转成 java 代码
  • 双击方法,可跳转到方法的定义
  • 点击方法,按 x 键可以查看方法的调用
  • 双击 Manifest 即可查看 AndroidManifest.xml
  • 搜索功能 可以搜索函数 字符串等。
  • 点击string查看dex中的字符串,ctrl+f就可以进行搜索。搜索到需要的字符串后双击就可以来到smali代码处,如果看不懂smali,按下tab就可以看到java代码

说明:对于Android逆向来说JEB是不可或缺的一款软件 本篇介绍了JEB的一些常用功能  更多详细功能还需自行百度。

Jeb 动态调试 ( 调试 zhuceji.apk )

jeb 调试 zhuceji.apk 找到注册码

普通调试 模式

1. 真机 (或者模拟器,例如:雷电模拟器、逍遥模拟器) 安装 zhuceji.apk。界面很简单。

2. Jeb 打开 apk,找到要调试的方法对应的 smali 代码,然后在 smali 代码中打上断代点。

鼠标点击要下断点的行:control+b 打断点

3. 下面开始对程序进行调试

debug ---> 开始 ---> 找到相关进程双击进行调试:

4. 首先在要调试的位置打上断点,然后在 app 中输入任意 16 位注册码进行调试 ( 通过查看 checkSN 源码,可以看到对 sn 长度进行检查,必须16位 ):

5. 通过调试 smali 代码,或者直接查看 Java 源码,可以找到 checkSN 方法是解决问题的关键。

 在 checkSN 方法上,按 tab 键,或者 "右键 ---> 解析" 即可查看 checkSN 对应的 Java 代码,

通过分析可以发现,把 userName 做了一个 md5,然后取出16位和 sn 相比 ( 注意:从第一位开始,间隔一位取一位)。

userName:李青

md5:4d85f1a100030c9ddb76e546152c1dfe

注册码:48fa0009d7e4121f

断点走到  access$2 时,单步进入函数。

在 access$2 函数中调用 checkSN 函数的。查看 参数值

进入 checkSN 函数继续 单步调试

 进入 checkSN 函数,并在 equalsIgnoreCase 打上断点,执行到断点处。

可以看到 v6 寄存器的值就是注册码,

userName:李青

注册码:48fa0009d7e4121f

输入正确的名字、注册码,即可验证通过

debug 调试 模式

debug 模式 和 普通模式的区别在于 启动过程

  • 普通模式:无法调试界面的 创建,即 onCreate 函数
  • debug 模式:可以调试 界面的 onCreate 函数,即刚开始创建界面是就开始调试

步骤:

1. 查看 application 节点 是否 为 可调式 。

如果是 False,则不能调试,需要改成 True 然后重新打包 apk,安装 可调试的 apk,然后执行命令:adb shell am start -D -n 应用程序包名/应用程序入口界面

除了在入口处添加Debug.waitForDebugger外,还可以使用下面的命令启动app,也能使app在入口处断下来:adb shell am start -D -S -n com.xy.testcrack/com.xy.testcrack.MainActivity

这里可以看到 apk 已经 可调试。

2. cmd ---> adb shell am start -D -n 应用程序包名/应用程序入口界面:

adb shell am start -D -n com.qianyu.zhuceji/.MainActivity

执行完后,真机 ( 或者 模拟器 ) 显示如图:

这时候,不需要点击弹窗。

3. 使用 jeb 开始调试

  • 首先 在 onCreate 方法打一个断点,设置断点的方法和普通模式相同。
  • 然后 点击菜单栏 “Debugger ---> Start” 开始调试 ( 和 普通模式 步骤一样 )。

点击 附上 之后,弹窗 自动消失,然后就会自动停在 onCreate 方法中设置的断点。

2、AndroidStudio + Smalidea 动态调试 smali 代码

下载、安装 Android Studio

安装 Android Studio 时,会自动弹出 Android sdk 的下载安装界面。Android Studio 自带有 java jdk,如果不想使用自带的 Java JDK 可以自己下载

  • Android Studio 下载地址: Download Android Studio & App Tools - Android Developers
  • Smalidea:用来给 smali 下断点,单步调试,下载地址:https://github.com/JesusFreke/smalidea
  • Smali Support:setting->Plugins->Marketplace->搜索Smali Support

Android studio 配置

  • Android Studio 配置(一):https://www.cnblogs.com/qianguyihao/p/4390905.html
  • Android Studio 配置(二):https://www.cnblogs.com/qianguyihao/p/4392611.html
  • Android Studio 配置(三):gradle项目构建:https://www.cnblogs.com/xiaofengfeng/p/9133043.html

 Android Studio手动配置Gradle的方法:[Android Studio系列(五)] Android Studio手动配置Gradle的方法_androidstudio gradle_u010142437的博客-CSDN博客

(1) android sutdio第一次打开一个工程巨慢怎么办? 
(2) 手动配置Gradle Home为什么总是无效? 
(3) 明明已经下载了Gradle,配置了gradle home,为什么打开工程还是去自动下载Gradle?

Gradle 构建配置详解:Gradle 构建配置详解 | 程序员笔记

史上最全 Android build.gradle 配置详解:史上最全Android build.gradle配置详解 - 简书

在开发过程中,

  • debug 版本我们可以跟踪调试,查看 bug 等信息,
  • 但是 release 版本中只能去打 log 进行代码进行猜测,还有就是 dump 堆栈等无法与代码直接交互的方法。无源码调试 指的是在没有源代码的情况下可以对 app 进行代码调试,逆向 smali 代码,然后查看其运行逻辑。对发现 release 版本问题的过程中可以让我们更块的定位错误。

安装 smalidea 插件

从 github 下载 smalidea.zip,然后在 Android 中依次选择:

  • File ---> setting -> Plugins -> 齿轮 -> Install Plugin from Disk…-> 找到smalidea-0.06.zip

在弹出选择对话框中,找到下载好的 smalidea 压缩包,选择ok即可

方法 1:导入 APK 调试 smali

Android Studio 2022 可以直接导入apk 包就可以进行动态调试

File ---> Profile or Debug APK ,会自动生成smali进行查看

设置 Project 的 sdk:

如果是通过 "新建项目" 导入的 smali ,则不需要设置 sdk,因为 新建工程 时已经有默认的 sdk

如果是通过 " 导入已经存在的 " 方式导入 smali ,则需要设置 sdk :

选择 sdk ,这里选择 sdk  1.8

调试

连接上手机,进行debug

方法 2:反编译 apk 为 smali 进行调试

常用的反编译工具有 Apktool、AndroidKiller、jadx、jeb 等

 第一步:拿到想要 debug 的 apk。

第二步:反编译 apk 得到 smali 代码。这里使用 AndroidKiller ( AK 实际是调用 apktool 进行反编译)。

让 apk 可调式

在 Android 真机上调试程序有一个前提,就是这个apk包必须有 debuggable=true 的属性才行。

让运行在设备中的程序支持 debug。方法有几种:

  • 把设备 root 掉,修改 /default.prop 文件的 ro.debuggable=1
  • 使用 模拟器
  • 修改 apk 的 Manifest application 属性 android:debuggable="true",可以用 apktool 解出 Manifest 然后修改,接着重新打包回去。
  • 打开系统调试总开关,使用 am 命令,以调试模式启动应用。
  • Magisk 模块可以实现 app 的 debug。xposed 也有对应模块。直接搜索 "debug" 找到对应模块安装即可。 ( 推荐 )
  • 终极办法,自己编译一个 debug 版的 rom,这个稍微麻烦一点,自己编一个,想怎么玩就怎么玩。

下面只说明两种方法,

  • 一种是 修改 " AndroidManifest.xml " 实现可调试 ,
  • 另一种是 "打开系统调试总开关"

修改 " AndroidManifest.xml " 实现可调试 

修改 " AndroidManifest.xml " 实现可调试。使用 AndroidKiller 进行反编译,然后在反编译出的 AndroidManifest.xml 添加 debug 属性

如果没有这个属性的话,需要自己添加 android:debuggable="true" 然后编译安装修改后的 apk 即可。。。

修改 AndroidManifest.xml 之后,只要以调试状态启动 app 即可

命令:adb shell am start -D -n com.wizardev.testjar/.MainActivity

转发 8700 端口 到安卓 对应进程 [app_pid]。命令:adb forward tcp:8700 jdwp:446

记住这时候需要将 DDMS 关掉,不然会出现错误

方法 2:

找到启动 apk 的启动界面,然后在启动界面的 onCreate 方法的第一行添加 invoke-static {}, Landroid/os/Debug;->waitForDebugger()V 这句代码。

怎么知道程序的启动界面呢? 其实可以通过以下几种方式:

方法 1: 观察 “AndroidManifest.xml” 文件中的代码,看下图

如果图中 “1” 处的代码,那么程序启动界面的 smail 文件就是 “2” 处的名称。如上图启动界面的 smali 文件就是“MainActivity.smali”。然后在 “MainActivity.smali” 文件中的 onCreate 方法中添加等待调试的代码即可。用 am 命令,使目标程序以调试模式运行。

方法 2:通过 adb 命令来发现 apk 的启动界面,命令:adb shell dumpsys activity top

运行命令后会出现以下界面

图中用红框标记的就是启动界面的 smali 文件名。注:这种方式找到的启动界面可能不准确,因为有的 app 会有欢迎页,因此推荐用第一种方法来找 app 的启动界面。

主 Activity 中加入  invoke-static {},Landroid/os/Debug;->waitForDebugger()V

回编译 apk 并签名安装到手机,如果启动 app 出现以下界面,则说明以启动模式运行app成功。

(这步如果重新打包失败,可以安装原始包,把手机 root 配置/default.prop 的 ro.debuggable=1 开启全局调试。

然后用命令启动 Activiry : adb shell am start -D -n package属性的值/android:name属性的值  )

打开系统调试总开关

这种方法不用修改 “AndroidManifest.xml”,而且当你打开这个开关后手机中的所有 App 都是可以调试的了。但是这种方法操作起来比较复杂,而且手机必须是已经 root 过的,下面会详细描述怎么打开系统调试的总开关。

这里会介绍两种方法,第一种方法是大家普遍采用的,但是我使用采用第一种方法没有成功,于是查找资料找到了第二种方法,如果你使用第一种方法不成功,那么可以试下第二种方法。

第一种方法

  • 下载 mprop 文件 ( https://github.com/wpvsyou/mprop )
  • 依次运行一下命令设置 “ro.debuggable”
    adb push “下载mprop文件所在的位置”\mprop /data/local/tmp/
    adb shell su
    chmod 755 /data/local/tmp/mprop
    data/local/tmp/mprop
    setprop ro.debuggable 1
    /data/local/tmp/mprop -r
  • 运行 getprop ro.debuggable 命令可以查看 debuggable 的状态,显示为 1,表示更改成功。

注:这种方法在开机后设置的“debuggable”将会失效,需要重新设置

第二种方法

这种方法其实说复杂也不复杂,说不复杂呢!还是有一点复杂的。具体操作方法如下:

  • 需要手机刷入“Magisk”,下载:Releases · topjohnwu/Magisk · GitHub。Magisk是什么:简单的说就是集成了root的框架,它强大的是root权限还可以设置对其他软件隐藏。
    Magisk的强大远不止这点,想了解Magisk具有哪些功能可以自行搜索。
  • 通过Magisk安装“MagiskHide Props Config”模块,安装的方法可以看下面的动图。

安装完成之后需要重启,才能生效。

打开终端,输入以下命令

adb shell
props

会出现这个界面

然后,输入3,回车,会出现这个界面

然后,输入1,回车,出现这个界面

可以看到图中显示当前的 “ro.debuggable” 的值为0,如果要修改为1的话输入“y”,回车即可修改完成。接着终端会弹出是否重启,这时继续输入“y”重启,重启后修改的“ro.debuggable”才会生效。

经过以上5步,就可以打开系统调试的总开关,这时我们打开“Monitor”工具就可以看见当前运行的所有的所有进程了。

注:通过这种方式修改的 “ro.debuggable” 值,重启手机后不会还原,就是设置过后,手机重启后不需要再次设置。

打开系统调试的总开关后,这时通过 am 命令以调试模式启动应用,即可让目标应用处于可调式状态。

adb shell am start -D -n xxx

这里的 “xxx” 为我们要调试应用的启动界面,如我们要调试应用的启动界面为 com.wizardev.testjar/.MainActivity 则输入以下命令

adb shell am start -D -n com.wizardev.testjar/.MainActivity

这是目标应用就会以调试模式运行,处于等待调试的状态。

反编译的 smali  导入到 Android Studio 

把 project 文件夹单独复制一份,然后导入 Android Studio 中。

导入步骤:菜单栏 ---> File ---> New ---> import Project... ---> 选择Create project from existing sources,之后一直选择 next 即可

导入完成后,切换到 project 视图 ( 不是 Android 视图 )。然后选择smali目录作为资源目录

不新建项目也行,但需要新建一个 module。
将项目切换到 project 视图,将新建的项目下 app 中 src 目录下的代码删除或将新建的 module 下 src 目录下的代码删除。
将我们反编译的 smali 文件夹放入 src 目录下。
这样,就将反编译的 smali 文件导入到 AndroidStudio 目中了。

配置远程调试的选项

设置调试器:run --> edit configurations ---> + --> Remote JVM Debug,端口选择:8700

Project Structure(Ctrl+Shift+ALT+S),Project SDK设置为 Android API 10 Platform

远程调试配置,Run -> Edit Configuration进入Run/Dubug Configurations;Add New Configuration(+符号) -> Remote,将 5005 端口,修改为 8700 端口

smali 打断点

安装设置 debug=true 的 APK,通过 adb shell dumpsys activity top | grep --color=always ACTIVITY 在终端获取包名和页面信息。也可以通过 配置文件查看包名

在 smali 中需要断点的地方打好断点,

通过以下命令行启动进程调试等待模式:

调试模式打开 app ( 命令: adb shell am start -D -n )

adb shell am start -D -n com.qianyu.zhuceji/.MainActivity

对 apk 进行动态调试,这条命令运行后手机屏幕将会进入到调试界面,千万别点手机上弹出来的对话框(不要点Force Close),它是在等待 debug 接入

  

进入等待调试

查看 Monitor 并记住下面红框里的两个值。

新版本的 AndroidStudio 已经淘汰了 Android Device Monitor 功能,可以使用 monitor 代替 ( D:\Android\Sdk\tools 下打开 monitor.bat )

  

然后把 Android Device Monitor关掉(这里一定要关掉,因为它会占用8700端口 导致后面转发端口失败)

开启转发

C:\>netstat -aon |findstr 8700
  TCP    127.0.0.1:8700         0.0.0.0:0              LISTENING       10708
    看看有没有哪个进程占用端口,没有就直接开启端口转发: 
C:\>taskkill /PID 10708 /F
    成功: 已终止 PID 为 10708 的进程。

开启转发(这里jdwp是自己Android Device Monitor中要调试app的Online值,tcp为debug值)
C:\>adb forward tcp:8700 jdwp:3669
8700

C:C:\>

获取运行 apk 的进程(pid):adb shell ps | grep 包名

  • 示例:adb shell ps | findstr "zhuceji" ,如下图所示,可以看到 pid 是 3170

端口映射: adb forward tcp:8701 jdwp:<pid>

  • 执行:adb forward tcp:8701 jdwp:3170    建立端口转发,即把端口 8701 上面的信息通过 jdwp 转发到 pid 是 3170 上面

开始等待调试

在 Android Studio 附加、动态 调试 smali

图二

此时,已经 Attach 到进程中,可以快乐的调试了。通过断点可以查看内存的信息。

打好断点之后。然后 Run --> Debug 'zhuceji_smail' 进行调试。

android studio 已经进入debug模式了  按F8执行下一步,F9运行程序 

以上方法经常会出现端口转发问题,现象就是 android studio debug 的TCP端口  与 设备应用的端口无法绑定,导致启动debug 无法启动。

解决方法:直接 attach 一个进程

步骤: 菜单栏 ---> run ---> attach Process

相关文章:

安卓逆向_5 --- jeb 和 AndroidStudio 动态调试 smali

Jeb 工具的使用 &#xff1a;https://www.52pojie.cn/forum.php?modviewthread&tid742250&#xff1a;https://zhuanlan.zhihu.com/p/302856081动态调试 smali 有两种方法&#xff1a; Jeb 调试AndroidStudio smalidea 插件动态调试。1、Jeb 动态调试 smali ​JEB是一个…...

docker-容器命令

1.新建启动 docker run options image command [arg..] options: --name"容器新名字" -d&#xff1a;后台运行程序 -it&#xff1a;交互式运行 -P: 随机端口 -p: 指定端口 docker run -it ubuntu /bin/bash docker run -it ubuntu:v1 /bin/bash docker run -it 1c352…...

Spring——是什么?作用?内容?用到的设计模式?

目录 什么是spring&#xff1f; spring是为了解决什么问题而衍生的&#xff1f;&#xff08;历史&#xff09;Spring解决了实际生产中的什么问题&#xff1f; spring包含了哪些部分&#xff1f;&#xff08;组成&#xff09; Spring的特点是什么&#xff1f; spring框架中…...

Qt交叉编译环境搭建

环境及版本&#xff1a; 编译机&#xff1a;Deepin 20.3 Qt 5.12.9 arm编译工具&#xff1a; gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz 运行机&#xff1a;创龙335X开发板 1.下载arm编译工具&#xff1a; gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-…...

Java switch case 语句

Java 的 switch case 语句是一种常用的控制流语句&#xff0c;用于基于不同的输入值执行不同的操作。本文将详细介绍 Java switch case 语句的作用、用法以及在实际工作中的应用。 一、switch case 语句的作用 switch case 语句是一种多分支条件语句&#xff0c;它基于不同的输…...

Linux下MQTT客户端消息订阅与发布实现

MQTT(消息队列遥测传输)是一个基于客户端-服务器的消息发布/订阅传输协议。它基于TCP协议&#xff0c;默认端口号为1883&#xff0c;为此&#xff0c;它也需要一个消息中间件 。MQTT协议是轻量、简单、开放和易于实现的&#xff0c;这些特点使它适用范围非常广泛。在很多情况下…...

代码规范----编程规约(下)

目录 四、OOP规约 五、日期时间 六、集合处理 四、OOP规约 &#xff08;1&#xff09;、避免通过一个类的对象引用访问此类的静态变量或静态方法&#xff0c;无谓增加编译器解析成本&#xff0c;直接用类名来访问即可 &#xff08;2&#xff09;、所有的覆写方法&#xff0…...

c++连接mysql

开始想用mysql connector/c8.0 来操作数据库cmake加上配置后一直编译错误 我这里也没有截屏编译错误大概意思是driver.h里面声明的一个check_lib函数里面用了一个未定义的check找遍了资料都没有找到解决办法最后还是用了原始API如果有人有解决办法请留个位置先上在用的cmake配置…...

CentOS7操作系统安装nginx实战(多种方法,超详细)

文章目录前言一. 实验环境二. 使用yum安装nginx2.1 添加yum源2.1.1 使用官网提供的源地址&#xff08;方法一&#xff09;2.1.2 使用epel的方式进行安装&#xff08;方法二&#xff09;2.2 开始安装nginx2.3 启动并进行测试2.4 其他的一些用法&#xff1a;三. 编译方式安装ngin…...

【测绘程序设计】——空间直角坐标转换

测绘工程中经常遇到空间直角坐标转换——比如,北京54(或西安80)空间直角坐标转换成CGCS2000(或WGS-84)空间直角坐标,常用转换模型包括:①布尔沙模型(国家级及省级范围);②莫洛坚斯基模型(省级以下范围);③三维四参数(小于22局部区域) 等。   本文分享了基于布…...

数组--java--动态数组--有序数组--底层

java数组基础--java中的数组创建数组空间占用初始化数组访问元素插入查找删除元素动态数组扩容插入和添加重写toString删除二维数组二维数组注意点有序数组实现测试写在开头&#xff1a; 这篇文章包括数组的基础、一点底层的内容和一些稍微深入的东西。 作为第一个深入学习的数…...

Linux下使用C语言实现简单的聊天室程序

本文章介绍一种基于Linux使用C语言实现简单的局域网聊天室程序的方法&#xff0c;支持消息群发&#xff0c;历史数据查询&#xff0c;好友列表查看&#xff0c;好友上线下线提醒等功能。聊天界面如下图所示&#xff1a;下面将按步骤介绍该系统的设计实现&#xff0c;首先在linu…...

【数学】任意一个正整数n最多只有一个质因数大于根号n,怎么证明?

定理 任意一个正整数n最多只有一个大于n\sqrt{n}n​的质因子&#xff0c;并且该大于n\sqrt{n}n​质因子的幂次是1。 证明&#xff08;反证法&#xff09; 证明&#xff1a;最多只有一个大于n\sqrt{n}n​的质因子 假设n存在两个大于n\sqrt{n}n​的质因子&#xff0c;分别为p…...

【ES6】var let const 之面试题系列

关于 var、let、const 是前端开发人员经常用到的关键字&#xff0c;也是经典的面试题&#xff0c;接下来就站在面试题的角度来看待它们之间的区别。 一、区别 1. var 声明的范围是函数作用域&#xff0c;let 和 const 声明的范围是块作用域&#xff0c;块作用域是函数作用域的…...

Vue基础入门讲义(四)-组件化

文章目录1.引言2.定义全局组件3.组件的复用4.局部注册5.组件通信5.1.父向子传递props5.2.传递复杂数据5.3.子向父的通信1.引言 在大型应用开发的时候&#xff0c;页面可以划分成很多部分。往往不同的页面&#xff0c;也会有相同的部分。例如可能会有相同的头部导航。 但是如果…...

Android onLayout布局流程解析

组件布局流程结论 1.&#xff09;layout流程始于ViewRootImpl的performLayout()方法&#xff0c;该方法会调用根View&#xff08;DecorView&#xff09;的layout()方法进行布局&#xff0c;因为DecorView是ViewGroup(FrameLayout),所以layout流程来到了ViewGroup&#xff08;其…...

浅分析BIG-建筑展示系统

一、主页&#xff08;主要界面&#xff09;重点疑点&#xff08;需要解决&#xff09;1.云平台实时同步。是否可以电脑与hololens2同步或链接&#xff1f;并可以传输信息提醒&#xff1f;一级界面&#xff08;启动界面&#xff09;1.交互式启动激活效果&#xff08;触发按钮旋转…...

模电基础(1) 半导体基础知识

基本内容&#xff1a; 1.本征半导体的基本介绍结构&#xff1b; 2.杂质半导体&#xff1b; 3.PN结的形成&#xff1b; 4.PN结的性质。 1.本征半导体 半导体&#xff1a;导电性能介于绝缘体和导体之间的物质。 本征半导体是纯净的晶体结构的半导体。 纯净→无杂质晶体结构→稳…...

阅读笔记:TF - IDF 原理

今天查阅 TF-IDF 资料&#xff0c;发现百度百科里面提供了一个例子&#xff0c;解释的很清楚&#xff0c;记下来备用。 原文链接&#xff1a;https://baike.baidu.com/item/tf-idf/8816134?fraladdin 例子&#xff1a;在某个一共有一千词的网页中 “原子能”、“的” 和 “应…...

【C语言】float 关键字

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...