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

作业报告┭┮﹏┭┮(Android反调试)

一:Android反调试

主要是用来防止IDA进行附加的,主要的方法思路就是,判断自身是否有父进程,判断是否端口被监听,然后通过调用so文件中的线程进行监视,这个线程开启一般JNI_OnLoad中进行开启的。但是这个是在这个之前断开的。思路→过反调试的话呢,就要把相关的函数进行NOP掉,直接将这几个字节改为00就可以了。

反编译截图:

在这里插入图片描述
在这里插入图片描述

我们可以fax1这个软件是不可以调试的,要想调试这个软件,我们有俩个方法。

其一:我们给他增加上:android:debuggable="true"在application的节点中,然后进行编译,签名,安装。

其二:我们有magisk面具,刷入MagiskHideProsp Config模块
在这里插入图片描述

调试软件的时候执行以下命令,就可以调试软件了

adb shell
su
magisk resetprop ro.debuggable 1
stop
start

然后打开IDA进行附加:

  1. 常规的运行服务器,转发端口

adb forward tcp:23946 tcp:23946
  1. 然后使用调试模式进行运行:
adb shell am start -D -n com.ctf.mobile/com.ctf.mobile.MainActivity
  1. 查看我们软件的进程,并进行转发
adb shell ps | findstr ctf
adb forward tcp:8700 jdwp:
  1. 运行之后,使用IDA进行附加,附加的时候正常操作,但是进去之后我们需要选择一下:

在调试器的调试器选项中设置:
在这里插入图片描述

  1. 然后点击运行,之后就会不动,这个时候我们用jdb绑定端口(ddms需要打开的情况下使用8700端口),使用命令:

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700然后程序就会断下,因为在加载so文件。
  1. 我们一次运行就查看是否是我们的so被载入,我们的so文件名是:libmobile.so

  2. 当被载入的时候,我们就选择在JNI_OnLoad中进行下断点。然后破除反调试

(不会/(ㄒoㄒ)/~~)

参考文章

https://www.cnblogs.com/bmjoker/p/11962585.html

二:java分析

在这里插入图片描述

package com.ctf.mobile;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.ctf.mobile.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {private ActivityMainBinding binding;private Button button;private EditText flagText;public native boolean check(String str);static {System.loadLibrary("mobile");}/* access modifiers changed from: protected */@Override // androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, androidx.fragment.app.FragmentActivitypublic void onCreate(Bundle bundle) {super.onCreate(bundle);ActivityMainBinding inflate = ActivityMainBinding.inflate(getLayoutInflater());this.binding = inflate;setContentView(inflate.getRoot());final op opVar = new op();this.button = (Button) findViewById(R.id.button);this.flagText = (EditText) findViewById(R.id.editText);this.button.setOnClickListener(new View.OnClickListener() {/* class com.ctf.mobile.MainActivity.AnonymousClass1 */public void onClick(View view) {if (MainActivity.this.flagText.getText().toString().trim().length() < 50) {MainActivity mainActivity = MainActivity.this;if (mainActivity.check(mainActivity.flagText.getText().toString().trim())) {Toast.makeText(MainActivity.this, op.flagRight, 0).show();return;}}Toast.makeText(MainActivity.this, op.flagWrong, 0).show();}});}
}

载入时候的,发现按钮被点击之后,调用了Check这个方法,这是个本地函数,我们在IDA中进行寻找:

在这里插入图片描述

看一下IDA给我们的伪代码:

__int64 __fastcall Java_com_ctf_mobile_MainActivity_check(__int64 a1, __int64 a2, __int64 a3)
{__int64 v4; // x0v4 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(*(_QWORD *)a1 + 1352LL))(a1, a3, 0LL);return sub_EF0(a1, v4) & 1;
}

sub_EF0

bool __fastcall sub_EF0(__int64 a1, const char *a2)
{__int64 v3; // x25__int64 v4; // x0__int64 v5; // x24__int64 v6; // x0__int64 v7; // x8__int64 v8; // x26__int64 v9; // x25unsigned __int8 v10; // w0unsigned int v11; // w27char v12; // w0__int64 v13; // x22__int64 v14; // x26char v15; // w0const char *v16; // x24__int64 v17; // x23__int64 v18; // x0__int64 v19; // x8unsigned int v20; // w0unsigned int v21; // w0int v22; // w25bool v23; // ccconst char *v24; // x8__int64 v25; // x25__int64 v26; // x0__int64 v27; // x21__int64 v28; // x23__int64 v29; // x26__int64 v30; // x25unsigned int v31; // w27const char *v32; // x24__int64 v33; // x0unsigned int v34; // w0unsigned int v35; // w0__int64 v36; // x17__int64 v37; // x1__int64 v38; // x0__int64 i; // x8__int64 v40; // x9unsigned int v41; // w10char v42; // w14char v43; // w13_BYTE *v44; // x16_BYTE *v45; // x15char v46; // w11int v47; // w22_BYTE *v48; // x23int v49; // w24__int64 v50; // x8int v51; // w20FILE *v52; // x0FILE *v53; // x28int v58; // w8int v59; // w20FILE *v60; // x0FILE *v61; // x28__int64 v62; // x24FILE *v63; // x0FILE *v64; // x28FILE *v65; // x0FILE *v66; // x28__int64 v67; // x26__int64 v68; // x28__int64 v69; // x27__int64 v70; // x20int v71; // w22int v72; // w23int v73; // w9__int64 v74; // x3__int64 v75; // x25unsigned __int64 v76; // x24_BOOL4 v77; // w21FILE *v78; // x0FILE *v79; // x23_BYTE v81[256]; // [xsp-630h] [xbp-8A0h] BYREF__int64 v82; // [xsp-530h] [xbp-7A0h] BYREF_BYTE v83[48]; // [xsp-430h] [xbp-6A0h] BYREF_BYTE v84[256]; // [xsp-400h] [xbp-670h] BYREF_BYTE v85[12]; // [xsp-300h] [xbp-570h] BYREF__int128 v86; // [xsp-2F4h] [xbp-564h]__int128 v87; // [xsp-2E4h] [xbp-554h]__int128 v88; // [xsp-2D4h] [xbp-544h]__int128 v89; // [xsp-2C4h] [xbp-534h]__int128 v90; // [xsp-2B4h] [xbp-524h]__int128 v91; // [xsp-2A4h] [xbp-514h]__int128 v92; // [xsp-294h] [xbp-504h]__int128 v93; // [xsp-284h] [xbp-4F4h]__int128 v94; // [xsp-274h] [xbp-4E4h]__int128 v95; // [xsp-264h] [xbp-4D4h]__int128 v96; // [xsp-254h] [xbp-4C4h]__int128 v97; // [xsp-244h] [xbp-4B4h]__int128 v98; // [xsp-234h] [xbp-4A4h]__int128 v99; // [xsp-224h] [xbp-494h]__int128 v100; // [xsp-214h] [xbp-484h]int v101; // [xsp-204h] [xbp-474h]_BYTE v102[520]; // [xsp-200h] [xbp-470h] BYREF__int64 v103; // [xsp+8h] [xbp-268h]__int64 v104; // [xsp+10h] [xbp-260h]unsigned __int64 StatusReg; // [xsp+18h] [xbp-258h]_BYTE *v106; // [xsp+20h] [xbp-250h]_BYTE *v107; // [xsp+28h] [xbp-248h]__int64 *v108; // [xsp+30h] [xbp-240h]const char *v109; // [xsp+38h] [xbp-238h]_BYTE *v110; // [xsp+40h] [xbp-230h]__int64 v111; // [xsp+48h] [xbp-228h]_BYTE *v112; // [xsp+50h] [xbp-220h]const char *v113; // [xsp+58h] [xbp-218h]char v114[10]; // [xsp+60h] [xbp-210h] BYREF_BYTE v115[6]; // [xsp+6Ah] [xbp-206h] BYREFchar v116[256]; // [xsp+160h] [xbp-110h] BYREF__int64 v117; // [xsp+260h] [xbp-10h]v109 = a2;StatusReg = _ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2));v117 = *(StatusReg + 40);if ( y >= 10 && (((x - 1) * x) & 1) != 0 )goto LABEL_5;while ( 1 ){v106 = v85;v112 = v84;v110 = v84;v107 = v83;v113 = v83;v108 = &v82;v3 = (*(*a1 + 48LL))(a1, &xmmword_4350);v4 = (*(*a1 + 264LL))(a1, v3, &byte_4364, &byte_436C);v5 = sub_1B58(a1, v3, v4);v6 = (*(*a1 + 264LL))(a1, v3, &byte_4370, &byte_4374);v7 = *a1;v111 = v6;v8 = (*(v7 + 264))(a1, v3, &byte_437C, &byte_4374);v9 = (*(*a1 + 264LL))(a1, v3, &byte_4380, &byte_4374);v101 = 0;memset(v102, 0, 256);v100 = 0u;v99 = 0u;v98 = 0u;v97 = 0u;v96 = 0u;v95 = 0u;v94 = 0u;v93 = 0u;v92 = 0u;v91 = 0u;v90 = 0u;v89 = 0u;v88 = 0u;v87 = 0u;v86 = 0u;v10 = sub_1BF4(a1, v5, v8, 20LL, 28LL);v11 = v10;v85[0] = v10;v85[1] = sub_1BF4(a1, v5, v8, v10, 72LL);v85[2] = sub_1BF4(a1, v5, v8, v11, 1LL);v85[3] = sub_1BF4(a1, v5, v8, v11, 2LL);v85[4] = sub_1BF4(a1, v5, v8, v11, 3LL);v85[5] = sub_1BF4(a1, v5, v8, v11, 4LL);v85[6] = sub_1BF4(a1, v5, v8, v11, 5LL);v85[7] = sub_1BF4(a1, v5, v8, v11, 6LL);v85[8] = sub_1BF4(a1, v5, v8, v11, 7LL);v12 = sub_1BF4(a1, v5, v8, v11, 8LL);v13 = v112;v85[9] = v12;v85[10] = sub_1BF4(a1, v5, v8, v11, 9LL);v14 = v5;v15 = sub_1BF4(a1, v5, v9, v11, v11);v16 = v109;v85[11] = v15;v17 = v111;memset(v84, 0, sizeof(v84));v18 = strlen(v109);__memcpy_chk(v13, v16, v18 + 1, 256LL);v19 = v110;*(v110 - 3) = unk_980;*(v19 - 32) = unk_990;*(v19 - 19) = unk_99D;*(v19 - 48) = sub_1BF4(a1, v14, v17, 6LL, 115LL);v20 = sub_1BF4(a1, v14, v17, 42LL, 189LL);v21 = sub_1BF4(a1, v14, v9, 226LL, v20);v22 = sub_1BF4(a1, v14, v17, v21, 331LL);v23 = y < 10;v24 = v113;*(v113 - 16) = 0u;*(v24 - 15) = 0u;*(v24 - 14) = 0u;*(v24 - 13) = 0u;*(v24 - 12) = 0u;*(v24 - 11) = 0u;*(v24 - 10) = 0u;*(v24 - 9) = 0u;*(v24 - 8) = 0u;*(v24 - 7) = 0u;*(v24 - 6) = 0u;*(v24 - 5) = 0u;*(v24 - 4) = 0u;*(v24 - 3) = 0u;*(v24 - 2) = 0u;*(v24 - 1) = 0u;if ( v23 || (((x - 1) * x) & 1) == 0 )break;
LABEL_5:v25 = (*(*a1 + 48LL))(a1, &xmmword_4350);v26 = (*(*a1 + 264LL))(a1, v25, &byte_4364, &byte_436C);v27 = sub_1B58(a1, v25, v26);v28 = (*(*a1 + 264LL))(a1, v25, &byte_4370, &byte_4374);v29 = (*(*a1 + 264LL))(a1, v25, &byte_437C, &byte_4374);v30 = (*(*a1 + 264LL))(a1, v25, &byte_4380, &byte_4374);v31 = sub_1BF4(a1, v27, v29, 20LL, 28LL);sub_1BF4(a1, v27, v29, v31, 72LL);sub_1BF4(a1, v27, v29, v31, 1LL);sub_1BF4(a1, v27, v29, v31, 2LL);sub_1BF4(a1, v27, v29, v31, 3LL);sub_1BF4(a1, v27, v29, v31, 4LL);sub_1BF4(a1, v27, v29, v31, 5LL);sub_1BF4(a1, v27, v29, v31, 6LL);sub_1BF4(a1, v27, v29, v31, 7LL);sub_1BF4(a1, v27, v29, v31, 8LL);sub_1BF4(a1, v27, v29, v31, 9LL);sub_1BF4(a1, v27, v30, v31, v31);memset(v81, 0, sizeof(v81));v32 = v109;v33 = strlen(v109);__memcpy_chk(v81, v32, v33 + 1, 256LL);sub_1BF4(a1, v27, v28, 6LL, 115LL);v34 = sub_1BF4(a1, v27, v28, 42LL, 189LL);v35 = sub_1BF4(a1, v27, v30, 226LL, v34);sub_1BF4(a1, v27, v28, v35, 331LL);}v103 = v14;v104 = a1;if ( v22 < 1 ){v36 = v108;v37 = 0LL;goto LABEL_14;}v36 = v108;v37 = v22;if ( v22 == 1 ){v38 = v106;for ( i = 0LL; i != v22; *(v36 + i++) = v46 ){
LABEL_13:v46 = *(v38 + i % 0x2A);v102[i] = i;}goto LABEL_14;}v38 = v106;v40 = 0LL;i = v22 & 0xFFFFFFFE;v41 = 1;do{v42 = *(v38 + v40 % 0x2A);v43 = *(v38 + v40 + ((-42 * (v41 / 0x2A)) | 1));v44 = &v102[v40];v44[1] = v40 | 1;v45 = (v36 + v40);*v44 = v40;v40 += 2LL;v41 += 2;*v45 = v42;v45[1] = v43;}while ( i != v40 );if ( i != v22 )goto LABEL_13;
LABEL_14:v113 = v115;if ( v37 ){v47 = 0;v48 = 0LL;v110 = v37;do{v49 = v48[v36];while ( 1 ){v51 = v102[v48];getpid();sub_1C90(v116, 256LL);v52 = fopen(v116, &byte_43A0);if ( v52 ){v53 = v52;while ( fgets(v114, 256, v53) ){if ( strstr(v114, &qword_43A8) ){if ( atoi(v113) )__asm { SVC             0x80 }break;}}fclose(v53);}v58 = (v47 + v51 + v49) % v22;v23 = y < 10;v102[v48] = v102[v58];v102[v58] = v51;if ( v23 || (((x - 1) * x) & 1) == 0 )break;v59 = v102[v48];getpid();sub_1C90(v116, 256LL);v60 = fopen(v116, &byte_43A0);if ( v60 ){v61 = v60;while ( fgets(v114, 256, v61) ){if ( strstr(v114, &qword_43A8) ){if ( atoi(v113) )__asm { SVC             0x80 }break;}}fclose(v61);}v50 = (v47 + v59 + v49) % v22;v102[v48] = v102[v50];v102[v50] = v59;}v36 = v108;++v48;v47 = (v47 + v51 + v49) % v22;}while ( v48 != v110 );}v62 = v104;while ( 1 ){getpid();sub_1C90(v116, 256LL);v63 = fopen(v116, &byte_43A0);if ( v63 ){v64 = v63;while ( fgets(v114, 256, v64) ){if ( strstr(v114, &qword_43A8) ){if ( atoi(v113) )__asm { SVC             0x80 }break;}}fclose(v64);}if ( y < 10 || (((x - 1) * x) & 1) == 0 )break;getpid();sub_1C90(v116, 256LL);v65 = fopen(v116, &byte_43A0);if ( v65 ){v66 = v65;while ( fgets(v114, 256, v66) ){if ( strstr(v114, &qword_43A8) ){if ( atoi(v113) )__asm { SVC             0x80 }break;}}fclose(v66);}}v68 = v111;v67 = v112;v69 = v103;v70 = 0LL;v71 = 0;v72 = 0;do{v72 = (v72 + 1) % v22;v73 = v102[v72];v74 = *(v67 + v70);v71 = (v71 + v73) % v22;v102[v72] = v102[v71];v102[v71] = v73;*(v67 + v70++) = sub_1BF4(v62, v69, v68, v74, v102[(v102[v72] + v73) % v22]);}while ( v70 != 42 );v75 = v107;v76 = 0LL;v77 = 1;do{getpid();sub_1C90(v116, 256LL);v78 = fopen(v116, &byte_43A0);if ( v78 ){v79 = v78;while ( fgets(v114, 256, v79) ){if ( strstr(v114, &qword_43A8) ){if ( atoi(v113) )__asm { SVC             0x80 }break;}}fclose(v79);}if ( *(v67 + v76) != *(v75 + v76) )break;_CF = v76++ >= 0x29;v77 = !_CF;}while ( v76 != 42 );return !v77;
}

最重要的一部分

在这里插入图片描述

我们发现最后返回的是根据V67和V76,V75进行判断的,在java层我们也分析道我们要的就是返回值,看最后的循环语句,可以清楚的发现,其实就是就是一个类似于strcmp的一个函数,每一个字符进行比较,如果有一处不一样,就跳出循环,否则都一样的话呢,返回v77,这个是1,需要获取到值,这个就是注册码,或者试试将这个返回修改一下也是可以的。

然后尝试分析流程图(不会/(ㄒoㄒ)/~~
在这里插入图片描述

相关文章:

作业报告┭┮﹏┭┮(Android反调试)

一&#xff1a;Android反调试 主要是用来防止IDA进行附加的&#xff0c;主要的方法思路就是&#xff0c;判断自身是否有父进程&#xff0c;判断是否端口被监听&#xff0c;然后通过调用so文件中的线程进行监视&#xff0c;这个线程开启一般JNI_OnLoad中进行开启的。但是这个是…...

在 Delphi BSD11中安装 DCU 格式的第三方组件库

在 Delphi BSD 11 中安装 DCU 格式的第三方组件库可以按照以下步骤进行&#xff1a; 打开 Delphi&#xff1a;启动 Delphi 开发环境。 选择安装组件&#xff1a; 在菜单栏中&#xff0c;选择 Component -> Install Component。 选择 DCU 文件&#xff1a; 在弹出的对话框中…...

综合题第二题(路由器的配置)

题目 如何计算子网掩码 第一类 我们可以观察到上图的IP地址后面有“/26”、“30”。我们都知道子网掩码是由多个连续“1”和多个连续“0”组成的&#xff0c;“、26”表示子网掩码的二进制表达中有26个1。 例如&#xff1a;156.95.9.128/26 1111 1111.1111 1111.1111 1111.1…...

人工智能概览

目录 什么是人工智能 人工智能的历史与发展 人工智能发展时间轴示意图&#xff1a; 人工智能的主要分支 机器学习与深度学习在AI中的地位 什么是人工智能 人工智能&#xff08;Artificial Intelligence, AI&#xff09;是指由人制造出来的具有一定智能的系统&#xff0c;能够理…...

[vulnhub] Prime 1

https://www.vulnhub.com/entry/prime-1,358/ 主机发现端口扫描 探测存活主机&#xff0c;137是靶机 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-22 16:25 CST Nmap scan report for 192.168.75.1 Host is up (…...

JavaSE——lombok、juint单元测试、断言

一、lombok的使用 默认jvm不解析第三方注解&#xff0c;需要手动开启 链式调用 二、juint单元测试 下载juint包 public class TestDemo {// 在每一个单元测试方法执行之前执行Beforepublic void before() {// 例如可以在before部分创建IO流System.out.println("befor…...

商标价值如何评估与增值?

商标是企业的标志&#xff0c;代表着企业的产品或服务质量、信誉和形象。一个具有高知名度和美誉度的商标&#xff0c;能够为企业带来巨大的商业价值。它不仅可以帮助企业在市场中脱颖而出&#xff0c;吸引消费者的关注和购买&#xff0c;还可以作为企业的重要资产进行融资、并…...

linux命令之firewall-cmd用法

firewall-cmd Linux上新用的防火墙软件&#xff0c;跟iptables差不多的工具 补充说明 firewall-cmd 是 firewalld的字符界面管理工具&#xff0c;firewalld是centos7的一大特性&#xff0c;最大的好处有两个&#xff1a;支持动态更新&#xff0c;不用重启服务&#xff1b;第…...

深入浅出CSS盒子模型

“批判他人总是想的太简单 剖析自己总是想的太困难” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;什么是盒子模型&#xff1f;盒子模型的组成部分详解1. 内容区&#xff08;Content&#xff09;2. 内边距&#xff08;Padding&#xff09;3. 边框&#xff08;Border&am…...

字符编码发展史4 — Unicode与UTF-8

上一篇《字符编码发展史3 — GB2312/Big5/GBK/GB18030》我们讲解了ANSI编码中的GB2312/Big5/GBK/GB18030。本篇我们将继续讲解字符编码的第三个发展阶段中的Unicode与UTF-8。 2.3. 第三个阶段 国际化 前面提到的第二个阶段&#xff0c;各个国家和地区各自为政&#xff0c;纷纷…...

【flink】之如何消费kafka数据并读写入redis?

背景&#xff1a; 最近公司出现做了一个新需求&#xff0c;需求内容是加工一个营销时机&#xff0c;但是加工营销时机的同时需要把数据内容里的一个idmapping存入redis用于后续的读写。 准备&#xff1a; <!-- 依赖 --><dependency><groupId>org.apache.fl…...

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(二)-索引

场景 首先介绍测试的场景&#xff0c;本系列schema定义 pdm文档索引&#xff0c;包括nested&#xff0c;作为文档扩展属性字段&#xff0c;_content字段是组件保留字段&#xff0c;支持文本内容&#xff0c;字段属性还有其他属性&#xff0c;如boost&#xff0c;getter&#x…...

离散化算法

离散化 在C中&#xff0c;离散化通常指的是将连续的数值或数据转化为离散的形式。这在数值分析、信号处理、图像处理和机器学习等领域都非常常见。以下是一些离散化的基本概念和方法&#xff1a; 1.区间划分&#xff1a; 将连续变量的值域分成多个区间&#xff0c;每个区间对…...

基于ollama的本地RAG实践

先放参考的原文链接大语言模型实战——搭建纯本地迷你版RAG_本地rag-CSDN博客 一、大模型选择 在我之前的文章中有讲到&#xff0c;我用的是ollama中的llama3.1 Ollama在Windows安装&#xff0c;使用&#xff0c;简单调用API_ollama如何对外提供api-CSDN博客 二、嵌入模型 …...

安卓开发板_MTK开发板_联发科开发评估套件Demo板接口介绍

开发板是一种功能丰富的电路平台&#xff0c;专为开发人员设计&#xff0c;集成了多种传感器、扩展接口和通信模块。这使得开发者能够高效进行原型设计和功能验证&#xff0c;极大地简化了软硬件开发的过程。 此次介绍的安卓开发板由MT8788核心板与底板构成&#xff0c;特别之处…...

代码随想录冲冲冲 Day58 图论Part9

47. 参加科学大会&#xff08;第六期模拟笔试&#xff09; 根据昨天的dijkstra进行堆优化 使用的原因是点多但边少 所以直接对于边进行操作 1.对于priority_queue来说 这是最小堆, 小于的话就是最大堆 之后由于是根据边来说的 所以新建一个Edge并且初始化一下 之后由于使用…...

UnityHub下载任意版本的Unity包

1)先打开 // 也可以采用2直接打开 2)也可以直接打开 下载存档 (unity.com) 3)关联起来UnityHub即可...

网站服务器怎么计算同时在线人数?

网站服务器计算同时在线人数通常涉及跟踪和记录当前活跃会话的数量。以下是几种常用的方法来估算或计算网站的同时在线人数&#xff1a; 1. 会话跟踪 - 基于会话(Session)&#xff1a;服务器可以为每个访问者创建一个会话&#xff0c;并跟踪这些会话。当访问者首次访问网站时&a…...

[spring]MyBatis介绍 及 用MyBatis注解操作简单数据库

文章目录 一. 什么是MyBatis二. MyBatis操作数据库步骤(使用注解)创建工程创建数据库创建对应实体类配置数据库连接字符串写持久层代码单元测试 三. MyBatis基础操作 使用注解打印日志参数传递增删改查 一. 什么是MyBatis 简单来说 MyBatis 是更简单完成程序和数据库交互的框架…...

Ks渲染做汽车动画吗?汽车本地渲染与云渲染成本分析

Keyshot是一款强大的实时光线追踪和全域光渲染软件&#xff0c;它确实可以用于制作汽车动画&#xff0c;包括汽车模型的渲染和动画展示。Keyshot的动画功能允许用户创建相机移动、物体变化等动态效果&#xff0c;非常适合用于汽车动画的制作。 至于汽车动画的渲染成本&#xff…...

AI智能时代:哪款编程工具让你的工作效率翻倍?

引言 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。那么&#xff0c;哪款编程工具让你的工作效率翻倍&#xff1f;是智能的代码编…...

这五本大模型书籍,让你从大模型零基础到精通,非常详细收藏我这一篇就够了

大模型&#xff08;Large Language Models, LLMs&#xff09;是近年来人工智能领域的一大热点&#xff0c;它们在自然语言处理、对话系统、内容生成等多个方面展现出了强大的能力。随着技术的发展&#xff0c;市面上出现了许多介绍大模型理论与实践的书籍&#xff0c;为研究人员…...

面试经典150题 堆

215.数组中的第K个最大元素 建堆算法实现-CSDN博客 215. 数组中的第K个最大元素 中等 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必…...

day-62 每种字符至少取 K 个

思路 滑动窗口&#xff1a;改变思路&#xff0c;从左右两边取字符&#xff0c;是a b c三个字符至少被取k次&#xff0c;那么意味着如果我们知道字符串中a b c的出现个数&#xff0c;那么可以知道取走后剩下子串a b c的个数&#xff0c;问题转化为了求最长子串 解题过程 如果a …...

免费好用!AI声音克隆神器,超级简单,10秒就能克隆任何声音!(附保姆级教程)

今天下午还有读者问&#xff1a; 有没有能克隆声音的 AI 工具&#xff1f; 其实剪映很早就上了克隆声音的功能。 只需要按要求朗读例句&#xff0c;或者上传本地的音视频文件&#xff0c;就可以克隆声音了。 操作非常简单&#xff0c;效果也不错&#xff0c;可以试试。 除了…...

LeetCode146 LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -1 …...

【Java】包装类【主线学习笔记】

文章目录 前言包装类基本数据类型与包装类之间的转换基本数据类型转换为包装类可以通过以下几种方式&#xff1a;包装类转换为基本数据类型可以通过以下几种方式&#xff1a;初始化值不同与String之间的转换 前言 Java是一门功能强大且广泛应用的编程语言&#xff0c;具有跨平台…...

华为HarmonyOS地图服务 11 - 如何在地图上增加点注释?

场景介绍 本章节将向您介绍如何在地图的指定位置添加点注释以标识位置、商家、建筑等&#xff0c;并可以通过信息窗口展示详细信息。 点注释支持功能&#xff1a; 支持设置图标、文字、碰撞规则等。支持添加点击事件。 PointAnnotation有默认风格&#xff0c;同时也支持自定…...

uniapp js怎么根据map需要显示的点位,计算自适应的缩放scale

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

Mysql 架构

目录 1.1 Mysql 逻辑架构图 1.2 SQL 的执行流程 1.3 SQL 书写顺序和执行顺序 1.4 Mysql 日志文件 1.4.1. 二进制日志&#xff08;Binary Log&#xff09; 1.4.2. 错误日志&#xff08;Error Log&#xff09; 1.4.3. 慢查询日志&#xff08;Slow Query Log&#xff09; 1.…...