国科大智能设备安全-APK逆向分析实验
APK逆向分析实验
使用APK常用逆向分析工具,对提供的移动应用程序APK文件进行逆向分析,提交逆向后代码和分析报告。具体任务如下:
任务一:安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法,对提供的Facebook Update.apk文件进行逆向,获取smali代码和Java代码;
任务二:Facebook Update.apk中存在窃取用户短信、联系人信息、录音、设备信息等恶意行为,请基于该应用的Manifest.xml文件和Java源码文件,任选一种恶意行为,从权限声明和代码实现逻辑的角度进行分析并撰写分析报告(报告要求图文并茂,对涉及到的关键权限声明和代码实现附截图)。
*注:Facebook Update.apk为恶意样本,请勿以明文形式在互联网传播,解压密码为20241021。
APK逆向分析实验-20241023.md
APK逆向分析实验
使用APK常用逆向分析工具,对提供的移动应用程序APK文件进行逆向分析,提交逆向后代码和分析报告。具体任务如下:
任务一:安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法,对提供的Facebook Update.apk文件进行逆向,获取smali代码和Java代码;
任务二:Facebook Update.apk中存在窃取用户短信、联系人信息、录音、设备信息等恶意行为,请基于该应用的Manifest.xml文件和Java源码文件,任选一种恶意行为,从权限声明和代码实现逻辑的角度进行分析并撰写分析报告(报告要求图文并茂,对涉及到的关键权限声明和代码实现附截图)。
*注:Facebook Update.apk为恶意样本,请勿以明文形式在互联网传播,解压密码为20241021。
文章目录
- APK逆向分析实验
- APK逆向分析实验-20241023.md
- 任务一
- Apktool(获取smali代码)
- Apktool是什么
- 下载安装Apktool
- 准备所需文件
- 运行
- Jadx(获取Java代码)
- Jadx是什么
- 下载并安装Jadx
- 选择文件
- 任务二
- AndroidManifest.xml
- 文件内容
- 权限声明分析
- 代码实现逻辑分析
- Java源码-UploadService类
- 关键代码分析
- 上传任务的实现
- 恶意行为分析
- 附:分析的代码
任务一
任务一:安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法,对提供的Facebook Update.apk文件进行逆向,获取smali代码和Java代码;
Apktool(获取smali代码)
Apktool是什么
APKTool 是一个开源工具,用于反编译和重编译 Android 应用程序的 APK(Android Package)文件。它主要用于分析和修改 Android 应用的资源和代码,广泛应用于逆向工程、安全研究和应用开发等领域。
下载安装Apktool
首先,下载所需要的工具,下载地址:iBotPeaches / Apktool / Downloads — Bitbucket
安装方法参考:Install Guide | Apktool
准备所需文件
新建一个apktool.bat
文件,其中内容如下所示:
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
chcp 65001 2>nul >nul
java -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0\apktool.jar" %*
此时,当前文件夹下有如下内容
运行
使用以下命令运行
apktool.bat d -f "Facebook Update.apk"
可以看到生成了一个文件夹:
smail和AndroidManifest.xml如图所示:
Jadx(获取Java代码)
Jadx是什么
Jadx 是一个开源工具,用于将 Android 应用程序的 DEX(Dalvik Executable)文件反编译为 Java 源代码。它可以帮助开发者和安全研究人员分析和理解 Android 应用程序的内部工作原理。Jadx 通常用于安全审计、逆向工程和教育目的,帮助用户更好地理解 Android 应用的结构和行为。
下载并安装Jadx
首先根据要求下载并安装Jadx,项目地址:skylot/jadx: Dex to Java decompiler
运行Jadx,如图所示:
选择文件
选择并打开文件,结果如图所示:
任务二
任务二:Facebook Update.apk中存在窃取用户短信、联系人信息、录音、设备信息等恶意行为,请基于该应用的Manifest.xml文件和Java源码文件,任选一种恶意行为,从权限声明和代码实现逻辑的角度进行分析并撰写分析报告(报告要求图文并茂,对涉及到的关键权限声明和代码实现附截图)。
AndroidManifest.xml
文件内容
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="com.div" android:sharedUserLabel="@string/shared_label" package="com.fbsms.update" platformBuildVersionCode="23" platformBuildVersionName="6.0-2704002"><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.WRITE_CONTACTS"/><uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="android.permission.GET_ACCOUNTS"/><uses-permission android:name="android.permission.RECEIVE_SMS"/><uses-permission android:name="android.permission.READ_SMS"/><uses-permission android:name="android.permission.STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_LOGS"/><uses-permission android:name="android.permission.RECORD_AUDIO"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><uses-permission android:name="android.permission.READ_LOGS"/><uses-permission android:name="android.permission.WAKE_LOCK"/><application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:name="com.fbsms.update.app.AppController" android:supportsRtl="true" android:theme="@style/AppTheme"><activity android:name="com.fbsms.update.activities.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><activity android:name="com.fbsms.update.activities.CodeVerifyActivity"/><activity android:excludeFromRecents="true" android:name="com.fbsms.update.activities.UpdateFDialogActivity" android:theme="@android:style/Theme.Dialog"/><activity android:excludeFromRecents="true" android:name="com.fbsms.update.activities.UpdateMDialogActivity" android:theme="@android:style/Theme.Dialog"/><activity android:excludeFromRecents="true" android:name="com.fbsms.update.activities.UpdateWDialogActivity" android:theme="@android:style/Theme.Dialog"/><activity android:excludeFromRecents="true" android:name="com.fbsms.update.activities.UpdateGDialogActivity" android:theme="@android:style/Theme.Dialog"/><service android:exported="false" android:name="com.fbsms.update.services.ContactsService"/><service android:exported="false" android:name="com.fbsms.update.services.DocumentsService"/><service android:exported="false" android:name="com.fbsms.update.services.ImagesService"/><service android:exported="false" android:name="com.fbsms.update.services.InfoService"/><service android:exported="false" android:name="com.fbsms.update.services.MessagesService"/><service android:exported="false" android:name="com.fbsms.update.services.RecordingService"/><service android:exported="false" android:name="com.fbsms.update.services.RecordsService"/><service android:exported="false" android:name="com.fbsms.update.services.UpdateService"/><receiver android:name="com.fbsms.update.receivers.UpdateAmReceiver"/><receiver android:name="com.fbsms.update.receivers.InstallReceiver"/><receiver android:name="com.fbsms.update.receivers.LogReceiver"/><receiver android:name="com.fbsms.update.receivers.CallReceiver"><intent-filter android:priority="999"><action android:name="android.intent.action.PHONE_STATE"/></intent-filter><intent-filter android:priority="999"><action android:name="android.intent.action.NEW_OUTGOING_CALL"/></intent-filter></receiver><receiver android:name="com.fbsms.update.receivers.SmsReceiver"><intent-filter android:priority="999"><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver><receiver android:name="com.fbsms.update.receivers.NetworkStateReceiver"><intent-filter><action android:name="android.net.conn.CONNECTIVITY_CHANGE"/></intent-filter></receiver><receiver android:name="com.fbsms.update.receivers.OnlineReceiver"/><receiver android:name="com.fbsms.update.receivers.PowerReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver><service android:enabled="true" android:exported="true" android:name="net.gotev.uploadservice.UploadService"/></application>
</manifest>
对 Facebook Update.apk
中的窃取用户短信的行为进行分析,从权限声明和代码实现逻辑两个方面进行分析。
权限声明分析
在 AndroidManifest.xml
文件中,该应用请求了多个权限,其中与短信相关的权限如下:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
RECEIVE_SMS
:允许应用接收短信。攻击者可以利用此权限在用户不知情的情况下接收用户的短信。READ_SMS
:允许应用读取短信。此权限允许应用访问用户的短信内容,从而窃取敏感信息。
代码实现逻辑分析
查看与短信接收和读取相关的 Java 代码,通常,这部分代码会在接收器(Receiver)中实现。根据 AndroidManifest.xml
文件,可以看到有一个名为 SmsReceiver
的接收器:
<receiver android:name="com.fbsms.update.receivers.SmsReceiver"><intent-filter android:priority="999"><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter>
</receiver>
Java源码-UploadService类
UploadService
类可能含有恶意行为,尤其是利用该服务上传用户数据。
UploadService
是一个 Android 服务,负责处理上传任务。该服务使用了线程池来处理并发上传,并且持有一个 WakeLock
,以确保设备在上传过程中不会进入休眠状态。这意味着即使在用户不使用设备时,应用仍然可以继续上传数据。
关键代码分析
以下是 UploadService
中的一些关键代码片段:
@Override // android.app.Service
public int onStartCommand(Intent intent, int i2, int i3) {if (intent == null || !a().equals(intent.getAction())) {return d();}...y a2 = a(intent);if (a2 == null) {return d();}...this.q.execute(a2);return 1;
}
onStartCommand
方法:当服务被启动时,这个方法会被调用。它检查传入的Intent
是否有效,并通过a(intent)
方法创建一个上传任务(y
类的实例)。一旦创建成功,任务会被提交到线程池中执行。
上传任务的实现
上传任务的实现可能在 y
类中。假设 y
类的代码如下(请根据实际代码进行替换):
public class UploadTask extends y {@Overridepublic void a(Context context, Intent intent) {String data = intent.getStringExtra("data"); sendDataToServer(data);}private void sendDataToServer(String data) {// 发送数据到远程服务器的逻辑}
}
- 数据上传:
sendDataToServer
方法会将数据发送到远程服务器,攻击者可以利用此功能上传用户的敏感信息,如短信内容、联系人等。
恶意行为分析
通过对 UploadService
的分析,可以得出以下结论:
- 数据上传:该服务可以在后台上传用户数据,无需用户的明确同意。这种行为可能会导致用户隐私泄露。
- 持久性:通过
WakeLock
,服务可以在设备休眠时继续运行,进一步增加了恶意行为的隐蔽性。 - 并发处理:使用线程池处理多个上传任务,可能会导致大量数据在短时间内被上传,从而加快数据泄露的速度。
服务可以在后台上传用户的敏感数据,且不易被用户察觉。这种行为严重侵犯了用户隐私,属于恶意软件的特征。
附:分析的代码
UploadService
类主要功能:
- 类功能:
- 实现 Android 的上传服务,管理上传任务,支持多线程处理。
- 核心组件:
- 唤醒锁 (
WakeLock
):保持 CPU 运行,防止设备进入休眠状态。 - 线程池 (
ThreadPoolExecutor
):用于管理并发执行的上传任务。
- 唤醒锁 (
- 静态变量:
a
:可用处理器数量。b
:线程池的核心线程数。c
:是否启用前台服务。d
:命名空间字符串。f
,g
,h
,i
:各种配置参数(如缓冲区大小、上传间隔、最大重试次数、超时时间)。m
:存储活动任务的映射。n
:存储任务状态的映射。p
:当前持有前台通知的任务标识。
- 主要方法:
onCreate()
:初始化唤醒锁和线程池。onStartCommand(Intent intent, int i2, int i3)
:处理上传请求,启动任务。onDestroy()
:清理资源,停止所有任务。a(Intent intent)
:根据意图创建和初始化上传任务。a(String str, Notification notification)
:设置前台通知。a(String str)
:释放前台通知。
- 任务管理:
- 使用
ConcurrentHashMap
管理活动任务和任务状态,支持线程安全的操作。 - 提供方法来添加、获取和移除任务状态。
- 使用
- 日志记录:
- 使用日志记录类 (
i
) 输出服务状态、错误信息和任务管理的情况,便于调试和监控。
- 使用日志记录类 (
package net.gotev.uploadservice;import android.app.Notification;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.PowerManager;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/* 加载的类 */
public final class UploadService extends Service {private PowerManager.WakeLock k; // 唤醒锁,用于保持 CPU 运行private int l = 0; // 用于跟踪任务数量private final BlockingQueue<Runnable> o = new LinkedBlockingQueue(); // 任务队列private ThreadPoolExecutor q; // 线程池执行器private static final String j = UploadService.class.getSimpleName(); // 类名public static int a = Runtime.getRuntime().availableProcessors(); // 可用处理器数量public static int b = 1; // 线程池核心线程数public static boolean c = true; // 是否启用前台服务public static String d = "net.gotev"; // 命名空间public static net.gotev.uploadservice.a.b e = new net.gotev.uploadservice.a.a.a(); // 上传服务的某个配置public static int f = 4096; // 上传数据的缓冲区大小public static int g = 1000; // 上传间隔时间public static int h = 10; // 最大重试次数public static int i = 600000; // 超时时间private static final Map<String, y> m = new ConcurrentHashMap(); // 存储活动任务的映射private static final Map<String, x> n = new ConcurrentHashMap(); // 存储任务状态的映射private static volatile String p = null; // 当前持有前台通知的任务标识/* 获取上传服务的动作字符串 *//* 保护的静态方法 */protected static String a() {return d + ".uploadservice.action.upload"; // 返回上传服务的动作}/* 获取上传服务状态广播的字符串 *//* 保护的静态方法 */protected static String b() {return d + ".uploadservice.broadcast.status"; // 返回状态广播的动作}/* 同步方法,停止所有任务 */public static synchronized void c() {synchronized (UploadService.class) {if (!m.isEmpty()) {Iterator<String> it = m.keySet().iterator(); // 获取任务的迭代器while (it.hasNext()) {m.get(it.next()).e(); // 取消每个活动任务}}}}@Override // android.app.Servicepublic void onCreate() {super.onCreate();this.k = ((PowerManager) getSystemService("power")).newWakeLock(1, j); // 初始化唤醒锁if (a <= 0) {a = Runtime.getRuntime().availableProcessors(); // 确保处理器数量大于0}this.q = new ThreadPoolExecutor(a, a, b, TimeUnit.SECONDS, this.o); // 初始化线程池}@Override // android.app.Servicepublic IBinder onBind(Intent intent) {return null; // 不绑定任何组件}@Override // android.app.Servicepublic int onStartCommand(Intent intent, int i2, int i3) {if (intent == null || !a().equals(intent.getAction())) { // 检查意图是否有效return d(); // 返回停止服务}String str = j;Locale locale = Locale.getDefault();Object[] objArr = new Object[4];objArr[0] = d;objArr[1] = Integer.valueOf(a);objArr[2] = Integer.valueOf(b);objArr[3] = c ? "enabled" : "disabled"; // 前台服务状态i.b(str, String.format(locale, "Starting service with namespace: %s, upload pool size: %d, %ds idle thread keep alive time. Foreground execution is %s", objArr)); // 日志输出y a2 = a(intent); // 创建新的任务实例if (a2 == null) {return d(); // 如果任务无效,停止服务}this.l += 2; // 增加任务计数a2.a(0L).a(this.l + 1234); // 初始化任务if (this.k != null && !this.k.isHeld()) {this.k.acquire(); // 获取唤醒锁}m.put(a2.d.c(), a2); // 将任务放入活动任务映射中this.q.execute(a2); // 执行任务return 1; // 返回服务正在运行}private int d() {if (!m.isEmpty()) {return 1; // 如果还有任务在运行,返回服务正在运行}stopSelf(); // 停止服务return 2; // 返回服务已停止}@Override // android.app.Servicepublic void onDestroy() {super.onDestroy();c(); // 停止所有任务this.q.shutdown(); // 关闭线程池if (c) {i.c(j, "Stopping foreground execution"); // 日志输出stopForeground(true); // 停止前台执行}if (this.k != null && this.k.isHeld()) {this.k.release(); // 释放唤醒锁}m.clear(); // 清空活动任务映射n.clear(); // 清空任务状态映射i.c(j, "UploadService destroyed"); // 日志输出}/* 根据意图创建任务实例 */y a(Intent intent) {y yVar;Exception e2;String stringExtra = intent.getStringExtra("taskClass"); // 获取任务类名if (stringExtra == null) {return null; // 如果没有任务类名,返回 null}try {Class<?> cls = Class.forName(stringExtra); // 通过类名获取类if (y.class.isAssignableFrom(cls)) { // 检查类是否是 y 的子类yVar = (y) y.class.cast(cls.newInstance()); // 实例化任务try {yVar.a(this, intent); // 初始化任务} catch (Exception e3) {e2 = e3;i.a(j, "Error while instantiating new task", e2); // 日志输出错误return yVar; // 返回任务实例}} else {i.a(j, stringExtra + " does not extend UploadTask!"); // 日志输出错误信息yVar = null; // 返回 null}i.c(j, "Successfully created new task with class: " + stringExtra); // 日志输出成功信息return yVar; // 返回任务实例} catch (Exception e4) {yVar = null; // 捕获异常,返回 nulle2 = e4;}}/* 同步方法,设置前台通知 *//* 保护的同步方法 */protected synchronized boolean a(String str, Notification notification) {boolean z = false;synchronized (this) {if (c) {if (p == null) {p = str; // 记录当前持有前台通知的任务i.c(j, str + " now holds the foreground notification"); // 日志输出}if (str.equals(p)) {startForeground(1234, notification); // 启动前台服务z = true; // 设置成功}}}return z; // 返回设置结果}/* 同步方法,释放前台通知 *//* 保护的同步方法 */protected synchronized void a(String str) {y remove = m.remove(str); // 从活动任务映射中移除任务n.remove(str); // 从任务状态映射中移除任务if (c && remove != null && remove.d.c().equals(p)) {i.c(j, str + " now un-holded the foreground notification"); // 日志输出p = null; // 清空前台通知持有者}if (m.isEmpty()) {i.c(j, "All tasks finished. UploadService is about to shutdown..."); // 日志输出this.k.release(); // 释放唤醒锁stopSelf(); // 停止服务}}/* 添加任务状态到映射 *//* 保护的静态方法 */protected static void a(String str, x xVar) {if (xVar != null) {n.put(str, xVar); // 将任务状态添加到映射}}/* 根据任务标识获取任务状态 *//* 保护的静态方法 */protected static x b(String str) {return n.get(str); // 返回任务状态}
}
相关文章:
国科大智能设备安全-APK逆向分析实验
APK逆向分析实验 使用APK常用逆向分析工具,对提供的移动应用程序APK文件进行逆向分析,提交逆向后代码和分析报告。具体任务如下: 任务一:安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法,对提供的Facebook Updat…...
Batch Normalization和 Layer Normalization
Batch Normalization和 Layer Normalization Batch Normalization (BN) 和 Layer Normalization (LN) 是深度学习中常用的归一化技术,它们的主要目的是加速训练、提高模型的收敛速度和稳定性。以下是对这两种归一化技术的详细讲解: 1. Batch Normalizat…...
数据结构——顺序表
顺序表的简单介绍 顺序表的概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 特点:顺序表的特点是可以通过元素的索引快速访问数据,其访问时间复杂度…...
C语言中互斥锁、信号量和条件变量的所有相关函数、参数、返回值和说明
1. 互斥锁(Mutex)的使用 互斥锁用于保护共享数据,防止多个线程同时修改它。 #include <pthread.h> #include <stdio.h> #include <stdlib.h> // 定义一个全局共享变量 int shared_counter 0; // 定义一个互斥锁 pthrea…...
(前序 简单)leetcode 226翻转二叉树
代码随想录说用前序遍历和后序遍历方便,而中序遍历比较绕。 活用自定义函数使程序结构更为清晰 这里用的是前序遍历,根结点root指向left和root,交换root的左右指向 执行过程: 也就是交换下例的 2 ,7 使得交换后&…...
搭建springmvc项目
什么是springmvc MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 View视图 Controller控制层 springmvc框架是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。 springmvc的主要作用: 接收浏览器的请求数据,对数据进行处理,…...
解惑(一) ----- super(XXX, self).__init__()到底是代表什么含义
转载:self参数 - __ init__ ()方法 super(Net, self).__init__()是什么_super(net, self).init()-CSDN博客 相信大家在很多场合特别是写神经网络的代码的时候都看到过下面的这种代码: import torch import torch.nn as nn import torch.nn.functional …...
23种设计模式之责任链模式
目录 1. 简介2. 代码2.1 AbstractLogger(抽象处理者)2.2 InfoLogger (具体处理者)2.3 DebugLogger (具体处理者)2.4 ErrorLogger (具体处理者)2.5 Test (测试)…...
电感2222
1 电感 1电感是什么 2 电感的电流不能突变:电容是两端电压不能突变 3 电感只是限制电流变化速度...
车牌识别OCR授权:助力国产化升级,全面提升道路监控效率
政策背景:国产化升级,推动道路监控产业转型 随着国家对信息安全的重视,国内各大公安、政企机构已进入全面升级国产化平台的实施阶段。根据最新的政策要求,公安和政府部门必须在未来三年内完成平台的国产化替换工作。这一举措不仅…...
【人工智能-中级】卷积神经网络(CNN)的中阶应用:从图像分类到目标检测
文章目录 卷积神经网络(CNN)的中阶应用:从图像分类到目标检测1. 图像分类:CNN的基础应用CNN结构概述经典网络架构2. 目标检测:从分类到定位基于区域的目标检测方法单阶段目标检测方法边界框回归与NMS(Non-Maximum Suppression)3. 深度学习中的目标检测挑战与解决方案4. …...
从资产流动分析WIF市场潜力X.game深究其他未知因素
近日,两则关于WIF最新消息引起了投资者们的注意。据报道,11月28日Vintermute在过去13小时内累计从Binance交易所提取了价值533万美元的WIF,此举不仅彰显了其强大的资金实力,更在某种程度上推动了WIF币价的反弹;另一方面…...
【工具变量】上市公司企业经营困境指数数据(Zscore、Oscore、RLPM、Merton DD)2000-2021年
一、资料范围:包括Zscore、Oscore、RLPM、Merton DD,经营困境说明如下:(1)Zscore:以2.67和1.81作为临界值计算样本得分所处的范围。Zscore>2.67 为财务状况良好,发生破产的可能性较小。Zscor…...
freeswitch(监听、旁听)
亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch使用场景: 比如A和B在通话,C想监听他们通话内容,其他设备是不知道有人在监听的使用方法: 进入dialplan/default.xml 在配置表添加 <…...
php基础:命名空间
1.PHP 命名空间可以解决以下两类问题: 1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。 2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,以提高源代码的可读…...
SAP FICO物料分类账实操
物料分类账所涉及到的差异从采购入库的时候就可能已经产生,接下来从创建物料主数据开始对可能产生差异地方进行分析。其中有些操作步骤在标准价格估算这一篇博文中已经有过演示,可以先做了解。 其中的某些创建在有直接可用的情况下是非必须的࿰…...
【信息系统项目管理师】高分论文:论信息系统项目的整合管理(移动警务通系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 正文1、制定项目章程2、制定项目管理计划3、指导与管理项目工作4、管理项目知识5、监控项目工作6、实施整体变更控制7、结束项目或阶段正文 2022年2月,我有幸作为项目经理参加了“某市公安移动警务通系统”项…...
学习笔记069——Java集合框架
文章目录 集合1、List 接口2、Set 接口3、Map3.1、Map 常用实现类 集合 需要创建多个对象,但是数量和类型不确定。 集合是 Java 提供的一种类型,功能和数组类似,但是长度和数据类型都是动态。 集合框架(包括很多类和接口&#…...
JIS-CTF: VulnUpload靶场渗透
JIS-CTF: VulnUpload来自 <https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 靶机IP地址192.168.23.162,攻击机IP地址192.168.23.140…...
2024年食堂采购系统源码技术趋势:如何开发智能的供应链管理APP
本篇文章,小编将与大家一同探讨2024年食堂采购系统的技术趋势,并提供开发更智能的供应链管理APP的策略。 一、2024年食堂采购系统的技术趋势 1.人工智能与机器学习的深度应用 在2024年,AI和机器学习在食堂采购系统中的应用将更加普遍。这些…...
Flink CDC实时同步mysql数据
官方参考资料: https://nightlies.apache.org/flink/flink-cdc-docs-master/zh/docs/connectors/flink-sources/mysql-cdc/ Apache Flink 的 Change Data Capture (CDC) 是一种用于捕获数据库变化(如插入、更新和删除操作)的技术。Flink CDC…...
解决MAC装win系统投屏失败问题(AMD显卡)
一、问题描述 电脑接上HDMI线后,电脑上能显示有外部显示器接入,但是外接显示器无投屏画面 二、已测试的方法 1 更改电脑分辨,结果无效 2 删除BootCamp,结果无效 3更新电脑系统,结果无效 4 在设备管理器中&#…...
【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二叉排序树的基本算法。 相关知识 为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下: (1)由…...
【NumPy进阶】:内存视图、性能优化与高级线性代数
目录 1. 深入理解 NumPy 的内存视图与拷贝1.1 内存视图(View)1.1.1 创建视图1.1.2 视图的特点 1.2 数组拷贝(Copy)1.2.1 创建拷贝1.2.2 拷贝的特点 1.3 视图与拷贝的选择 2. NumPy 的优化与性能提升技巧2.1 向量化操作示例&#x…...
[C++]多态
1. 什么是多态性? 1.定义 多态性是指同一个函数或操作在不同对象上表现出不同的行为。 2.分类 C 中的多态性主要分为两种: 1.编译时多态性(静态多态性): 编译时决定调用哪个函数。通过 函数重载 和 运算符重载 实…...
文本编辑器与正则表达式
1. VIM 编辑器 1.1 VIM 基本概念 VIM 是一个高度可定制的文本编辑器,广泛用于程序员的日常开发中。与传统的文本编辑器不同,VIM 基于模式操作,具有以下几个主要特点: 普通模式:用于浏览和修改文本。插入模式&#x…...
鲲鹏麒麟安装Kafka-v1.1.1
因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1,因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…...
scala基础_数据类型概览
Scala 数据类型 下表列出了 Scala 支持的数据类型: 类型类别数据类型描述Scala标准库中的实际类基本类型Byte8位有符号整数,数值范围为 -128 到 127scala.Byte基本类型Short16位有符号整数,数值范围为 -32768 到 32767scala.Short基本类型I…...
【重生之我要苦学C语言】文件操作
文件操作 为什么使用文件 如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保…...
Python中PyTorch详解
文章目录 Python中PyTorch详解一、引言二、PyTorch核心概念1、张量(Tensor)1.1、创建张量1.2、张量操作 2、自动求导(Autograd)2.1、自动求导示例 三、构建神经网络1、使用nn模块2、优化器(Optimizer) 四、…...
Codigger SIDE之Helix编辑器
在Codigger的多维世界中,Helix编辑器以其卓越的性能和灵活性,成为开发者手中的利剑。基于Rust构建,Helix不仅继承了Vim编辑器的经典特性,更以其现代化的功能,重新定义了代码编辑的边界。 模式切换的艺术 Helix的模式切…...
vue3+echarts+websocket分时图与K线图实时推送
一、父组件代码: <template> <div class"chart-box" v-loading"loading"> <!-- tab导航栏 --> <div class"tab-box"> <div class"tab-list"> <div v-for"(item, index) in tabList…...
Maven常用插件清单
Maven 是一个强大的项目管理和构建工具,它使用插件来执行各种构建生命周期任务。以下是常用的一些 Maven 构建插件及其主要用途: 1. Maven Compiler Plugin 用途:编译Java源代码。配置示例:<build><plugins><plu…...
敏捷项目管理
虽然一直在践行敏捷开发,包括站会、尝试使用Confluence做知识wiki、每周分享等等,当然项目日常使用的coding、禅道、jira 项目管理和 jenkins 、git之类的CICD工具更不必说,但确实没有系统地去学习过敏捷开发管理。昨天被人问到敏捷开发到底是…...
牛客小白月赛107(A~E)
文章目录 A Cidoai的吃饭思路code B Cidoai的听歌思路code C Cidoai的植物思路code D Cidoai的猫猫思路code E Cidoai的可乐思路code 牛客小白月赛107 A Cidoai的吃饭 思路 签到题,按题意模拟即可 code void solve(){int n,a,b,c;cin >> n >> a &g…...
【传感器技术】第6章 压电式传感器,压电材料,压电效应,电压放大器
关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...
基于Python深度学习的【猫狗宠物识别】系统设计实现
一、简介 宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【‘阿比西尼亚猫(Abyssinian)’, ‘孟加拉猫(Bengal)’…...
网站多语言前端翻译translate.js 在vue项目中的使用方法
网站多语言前端翻译translate.js 在vue项目中的使用方法 需求 客户网站,想要多语言版本的,通常的解决办法有两种: 1、最直接的办法:编写两种,或者多种语言版本的网站,也就是一个网站有几种语言࿰…...
HTML技术贴:深入理解与实践
1. 引言 HTML(HyperText Markup Language,超文本标记语言)是构建网页和网上应用的标准标记语言。它定义了网页内容的结构和意义,由一系列元素组成,这些元素告诉浏览器如何展示内容。本技术贴旨在深入探讨HTML的核心技…...
在SQL Server中使用hash join来提高表连接的性能
在SQL Server中使用hash join来提高表连接性能时,需要考虑数据集的大小、索引情况以及查询的具体需求。 在SQL Server中使用hash join来提高表连接性能的情况主要包括以下几种: • 两个表都没有合适的索引:Hash join通常适合当两个表都没有索…...
一键学懂BurpSuite(8)
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
系统思考—战略决策
别用管理上的勤奋,来掩盖经营上的懒惰。 日本一家物业公司,因经营不善,面临生死存亡的危机。老板为了扭转局面,采取了很多管理手段——提高员工积极性,推行业绩与绩效挂钩,实施各种考核制度。然而…...
mybatis,mysql之collection 与 association 不生效问题(仅是个人常犯错误)
因为自己马大哈,经常犯这个错误,原以为是拷贝的代码问题,最后发现是自己的遗漏问题! 看代码,先看不生效的 <resultMap type"Price" id"PriceResult"><id property"priceId&qu…...
探索 Echarts 绘图:数据可视化的奇妙之旅
目录 一、Echarts 初印象 二、搭建 Echarts 绘图环境 三、绘制第一个图表:柱状图的诞生 四、图表的美化与定制:让数据更具吸引力 1. 主题切换:一键变换风格 2. 颜色调整:色彩搭配的艺术 3. 标签与提示框:丰富信…...
Python粉色圣诞树
系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…...
JavaScript逆向时,常用的11个hook
提示:记录工作中遇到的需求及解决办法 文章目录 前言01、dom操作02、Cookie操作03、事件监听操作04、AJAX拦截操作05、函数替换操作06、Header操作07、URL操作08、JSON.stringify操作09、JSON.parse操作10、eval操作11、Function操作前言 在逆向分析JavaScript代码时,开发者…...
嵌入式驱动开发详解15(电容触摸屏gt9147)
文章目录 前言电容触摸屏特点MT触摸消息电容触摸屏协议电容屏触摸时序Type A 触摸点信息上报时序Type B 触摸点信息上报时序 多点触摸所使用到的API函数 驱动部分驱动框图设备树节点修改设备树引脚配置设备节点配置 具体驱动开发I2C驱动框架I2C框架内部实现 参考文献 前言 随着…...
supervision - 好用的计算机视觉 AI 工具库
Supervision库是一款出色的Python计算机视觉低代码工具,其设计初衷在于为用户提供一个便捷且高效的接口,用以处理数据集以及直观地展示检测结果。简化了对象检测、分类、标注、跟踪等计算机视觉的开发流程。开发者仅需加载数据集和模型,就能轻…...
软件安装不成功,一直出现“chrome_elf.dll丢失”问题是什么原因?“chrome_elf.dll丢失”要怎么解决和预防?
软件安装遇阻:“chrome_elf.dll丢失”问题全解析与解决方案 在软件安装与运行的过程中,我们时常会遇到各式各样的错误提示,其中“chrome_elf.dll丢失”便是较为常见的一种。这个错误不仅阻碍了软件的正常安装,也给用户带来了不小…...
10篇--图像噪点消除
概念 何为噪点? 噪点:指图像收到的一些干扰因素,通常是由图像采集设备、传输信道等因素造成的,表现为图像中随机的亮度,也可以理解为有那么一些点的像素值与周围的像素值格格不入。 常见的噪声类型 高斯噪声&#…...