IDA+Frida分析CTF样本和Frid源码和objection模块

news2024/9/22 13:28:52

文章目录

  • 一些资料
    • IDA调试命令
    • IDA调试安卓的10个技巧
    • objection基本使用+ Wallbreaker1
    • frida源码阅读之frida-java
  • 第一个实例EasyJNI
  • 第二个实例
  • objection
    • 资料
  • art_trace2.py
  • art_trace2.js

IDA+Frida分析CTF样本和Frid源码和objection模块

一些资料

IDA调试命令

adb devices
adb push d:\as /data/local/tmp/as

adb shell
su

chmod 777 /data/local/tmp/as

/data/local/tmp/as
/data/local/tmp/as -p31928

再开一个cmd窗口
adb forward tcp:23946 tcp:23946
adb forward tcp:31928 tcp:31928

adb shell am start -D -n com.yaotong.crackme/.MainActivity
adb shell am start -D -n com.wolf.ndktest/.MainActivity
adb shell am start -D -n com.faloo.BookReader4Android/com.faloo.app.activity.LogoPageActivity
adb shell am start -D -n com.example.helloworld/com.example.helloworld.MainActivity
adb shell am start -D -n com.pingan.peanut/com.pingan.peanut.activity.GuideActivity
adb shell am start -D -n com.lalamove.huolala.driver/.main.mvp.ui.SplashActivity


打开DDMS或者执行adb forward tcp:8700 jdwp:7319

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8616

如果出现错误
查看serverSocket所监听的端口
netstat -nao

static main(void)
{
auto fp, dexAddress, end, size;
dexAddress = 0xD9B18000;
size = 0xBF000;
end = dexAddress + size;
fp = fopen("C:\\Users\\Administrator\\Desktop\\upx.so", "wb");
for ( ; dexAddress < end; dexAddress++ )
fputc(Byte(dexAddress), fp);
}

动态调式本身就是很复杂的,和APP本身,安卓系统,IDA软件,电脑环境,要下断的函数等都有联系,
任何一个因素都可能影响动态调试的成败。大部分错误都在JDB启动那一步,网上没有好的解决或原因
分析,下面就做一些小结:
1.不满足动态调试条件,安卓系统配置文件build.prop的ro.debugable或APP的Androidmainfest.xml中的android:debugable,必须两个有1个为true2.使用jdb前的步骤出现错误:如android_server文件权限不够,没有am start启动目标程序等。
3.一般来说,使用jdb连接前后都是可以下断的,但确实会出现,有的必须jdb连接前下断,有的必须jdb连接后下断,否则可能出现错误。
4.虽然说jdb连接前后都可以下断,但在jdb连接前,一定要先用IDA附加,这个次序是一定的。
5.jdb属于电脑的JDK,如果JDK出错,JDB也可能出错。

有关so层逆向分析的问题
问题解决:
1.加密方法在一个叫libmt2.so的so文件中,然后用ida动态调试附加之后,
发现搜不到这个libmt2.so的so文件,这种类型问题怎么解决?

第一步:要先判断so文件是否已经加载到内存中 
	如果在IDA里面搜索不到
	
第二步:cat /proc/$pid/maps 执行该命令获取模块列表信息
	获取指定应用程序的进程pid
	
	ps 获取当前存在进程信息
	
	补充:|grep 特征字符串
	
	ida工具里面搜索不到?  如何下段调试?
	
	解决方法:
b3cfe000-b3d0c000 r-xp 00000000 b3:17 521239     /data/app/bin.mt.plus-2/lib/arm/libmt2.so
b3d0c000-b3d0d000 r--p 0000d000 b3:17 521239     /data/app/bin.mt.plus-2/lib/arm/libmt2.so
b3d0d000-b3d0e000 rw-p 0000e000 b3:17 521239     /data/app/bin.mt.plus-2/lib/arm/libmt2.so

b3cfe000 模块起始地址+偏移地址(ida静态分析时在反汇编窗口中的左边的地址栏)


dd if=/dev/zero of=/data/local/tmp/info.txt bs=1 count=1

if 代表输入文件。如果不指定if,默认就会从stdin中读取输入,/dev/zero 是一个字符设备,会不断返回0值字节(\0)。
of 代表输出文件。如果不指定of,默认就会将stdout作为默认输出。
bs 代表字节为单位的块大小。 
count 代表被复制的块数。 
 
获取指定进程模块信息
cat /proc/6594/maps >info.txt

dex是看0x20处找大小,odex是看0x32处就有
dd if=/proc/7081/mem of=/data/local/tmp/dump.so skip=3421749248 bs=1 count=16384


tcpdump+Wireshark:
adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap 开始抓包
ctrl+c	结束抓包
adb pull /sdcard/capture.pcap 导出文件

tcpdump下载地址
https://www.androidtcpdump.com/android-tcpdump/downloads


孤挺花(Armariris)
	基于LLVM的支持多平台多语言的混淆器
	
开源工程:https://github.com/GoSSIP-SJTU/Armariris

Control Flow Flattening(-fla,控制流程平坦化)
Bogus Control Flow(-bcf,虚假控制流程)
Instructions Substitution & SplitBasicBlock (-sub,指令替换)
字符串加密Pass
函数名称加密Pass

分析技巧:
分析被ollvm混淆的算法的时候,关心的参数的加密过程,以及结果的生成过程。


Android源码在线阅读:
	http://androidxref.com/
	http://aospxref.com/
	
系统源码下载地址
链接:https://pan.baidu.com/s/1IW-UR2UaDQaEQKB8DRa_bg 提取码:n5sb 	

seLinux安全机制:
	adb shell getenforce	
	adb shell setenforce 0

当系统引导程序启动Linux内核,内核会加载各种数据结构,和驱动程序,
加载完毕之后,Android系统开始启动并加载第一个用户级别的进程,
即init进程。
1.启动电源以及系统启动
	当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行
	加载引导程序BootLoader到ARM,然后执行
2.引导程序bootloader
	引导程序BootLoader是在Android操作系统运行前的一个小程序,它的主要作用
	是把系统OS拉起来并运行
3.Linux内核启动
	当内核启动时,设置换成、被好好存储器、计划列表、加载驱动
	当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程
4.init进程启动
	创建和挂载启动需要的文件目录
	初始化和启动属性服务
	解析init.rc配置文件并启动zygote进程
5.zygote进程启动
	创建AndroidRuntime并调用其start函数,启动zygote进程
	创建java虚拟机并为java虚拟机注册JNI函数
	通过JNI调用ZygoteInit的main方法进入zygote的java框架层
	通过registerServerSocket方法创建服务器端socket,并通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程
	启动SystemServer进程,该进程主要用来创建系统服务
6.systemserver进程启动
	启动binder线程池,这样就可以与其他进程进行通信
	创建SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期管理
	启动各种系统方法(引导服务、核心服务、其他服务)
7.launcher启动


Android 8.1.0 libart.so 32 JNI_onLoad
.text:0024F88C
.text:0024F88C loc_24F88C                              ; CODE XREF: .text:0024FD9Cj
.text:0024F88C                                         ; .text:0024FE10j
.text:0024F88C                 MOV             R0, R6
.text:0024F88E                 MOVS            R1, #0
.text:0024F890                 BLX             R5
.text:0024F892                 MOV             R7, R0
.text:0024F894                 LDR             R0, [R6,#4]
.text:0024F896                 LDR.W           R0, [R0,#0x2D4]
.text:0024F89A                 CBZ             R0, loc_24F8A6
.text:0024F89C                 CMP             R0, #0x15
.text:0024F89E                 BGT             loc_24F8A6
.text:0024F8A0                 MOVS            R0, #0xB

Android 8.1.0 libart.so 64 JNI_onLoad
.text:0000000000300F68 loc_300F68                              ; CODE XREF: art::JavaVMExt::LoadNativeLibrary(_JNIEnv *,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,_jobject *,_jstring *,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>*)+FAC↓j
.text:0000000000300F68                                         ; art::JavaVMExt::LoadNativeLibrary(_JNIEnv *,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>> const&,_jobject *,_jstring *,std::__1::basic_string<char,std::__1::char_traits<char>,std::__1::allocator<char>>*)+1030↓j
.text:0000000000300F68                 MOV             X0, X22
.text:0000000000300F6C                 MOV             X1, XZR
.text:0000000000300F70                 BLR             X27
.text:0000000000300F74                 LDR             X8, [X22,#8]
.text:0000000000300F78                 MOV             W24, W0
.text:0000000000300F7C                 LDR             W8, [X8,#0x4A8]
.text:0000000000300F80                 CBZ             W8, loc_300F94
.text:0000000000300F84                 CMP             W8, #0x15
.text:0000000000300F88                 B.GT            loc_300F94
.text:0000000000300F8C                 MOV             W0, #0xB

Android 8.1.0 linker 32 function
.text:00013562                 LDR             R1, =(aLinker - 0x13572)
.text:00013564                 ADR             R2, aCallingCTorSPF ; "[ Calling c-tor %s @ %p for '%s' ]"
.text:00013566                 MOVS            R0, #4
.text:00013568                 MOV             R3, R4
.text:0001356A                 STRD.W          R6, R5, [SP]
.text:0001356E                 ADD             R1, PC  ; "linker"
.text:00013570                 BL              __dl_async_safe_format_log
.text:00013574
.text:00013574 loc_13574                               ; CODE XREF: __dl__ZL13call_functionPKcPFviPPcS2_ES0_+18↑j
.text:00013574                 LDR             R0, =(__dl_g_envp_ptr - 0x1357A)
.text:00013576                 ADD             R0, PC  ; __dl_g_envp_ptr
.text:00013578                 LDR             R0, [R0] ; __dl_g_envp
.text:0001357A                 LDR             R2, [R0]
.text:0001357C                 LDR             R0, =(__dl_g_argv_ptr - 0x13582)
.text:0001357E                 ADD             R0, PC  ; __dl_g_argv_ptr
.text:00013580                 LDR             R0, [R0] ; __dl_g_argv
.text:00013582                 LDR             R1, [R0]
.text:00013584                 LDR             R0, =(__dl_g_argc_ptr - 0x1358A)
.text:00013586                 ADD             R0, PC  ; __dl_g_argc_ptr
.text:00013588                 LDR             R0, [R0] ; __dl_g_argc
.text:0001358A                 LDR             R0, [R0]
.text:0001358C                 BLX             R6
.text:0001358E                 LDR             R0, =(__dl_g_ld_debug_verbosity - 0x13594)
.text:00013590                 ADD             R0, PC  ; __dl_g_ld_debug_verbosity
.text:00013592                 LDR             R0, [R0]

Android 8.1.0 linker 64 function
.text:0000000000020838                 ADRP            X2, #aCallingCTorSPF@PAGE ; "[ Calling c-tor %s @ %p for '%s' ]"
.text:000000000002083C                 MOV             W0, #4
.text:0000000000020840                 MOV             X1, X23
.text:0000000000020844                 ADD             X2, X2, #aCallingCTorSPF@PAGEOFF ; "[ Calling c-tor %s @ %p for '%s' ]"
.text:0000000000020848                 MOV             X3, X26
.text:000000000002084C                 MOV             X4, X28
.text:0000000000020850                 MOV             X5, X19
.text:0000000000020854                 BL              __dl_async_safe_format_log
.text:0000000000020858
.text:0000000000020858 loc_20858                               ; CODE XREF: __dl__ZL10call_arrayIPFviPPcS1_EEvPKcPT_mbS5_+D0↑j
.text:0000000000020858                 ADRP            X8, #__dl_g_argc_ptr@PAGE
.text:000000000002085C                 LDR             X8, [X8,#__dl_g_argc_ptr@PAGEOFF]
.text:0000000000020860                 LDR             W0, [X8]
.text:0000000000020864                 ADRP            X8, #__dl_g_argv_ptr@PAGE
.text:0000000000020868                 LDR             X8, [X8,#__dl_g_argv_ptr@PAGEOFF]
.text:000000000002086C                 LDR             X1, [X8]
.text:0000000000020870                 ADRP            X8, #__dl_g_envp_ptr@PAGE
.text:0000000000020874                 LDR             X8, [X8,#__dl_g_envp_ptr@PAGEOFF]
.text:0000000000020878                 LDR             X2, [X8]
.text:000000000002087C                 BLR             X28
.text:0000000000020880                 LDR             W8, [X25,#__dl_g_ld_debug_verbosity@PAGEOFF]
.text:0000000000020884                 CMP             W8, #2

.text:0000000000020AE0                 ADRP            X1, #__dl_$d.20_0@PAGE ; "linker"
.text:0000000000020AE4                 ADRP            X2, #aCallingCTorSPF@PAGE ; "[ Calling c-tor %s @ %p for '%s' ]"
.text:0000000000020AE8                 ADRP            X3, #aDtInit@PAGE ; "DT_INIT"
.text:0000000000020AEC                 ADD             X1, X1, #__dl_$d.20_0@PAGEOFF ; "linker"
.text:0000000000020AF0                 ADD             X2, X2, #aCallingCTorSPF@PAGEOFF ; "[ Calling c-tor %s @ %p for '%s' ]"
.text:0000000000020AF4                 ADD             X3, X3, #aDtInit@PAGEOFF ; "DT_INIT"
.text:0000000000020AF8                 MOV             W0, #4
.text:0000000000020AFC                 MOV             X4, X20
.text:0000000000020B00                 MOV             X5, X21
.text:0000000000020B04                 BL              __dl_async_safe_format_log
.text:0000000000020B08
.text:0000000000020B08 loc_20B08                               ; CODE XREF: __dl__ZN6soinfo17call_constructorsEv+1C0↑j
.text:0000000000020B08                 ADRP            X8, #__dl_g_argc_ptr@PAGE
.text:0000000000020B0C                 ADRP            X9, #__dl_g_argv_ptr@PAGE
.text:0000000000020B10                 ADRP            X10, #__dl_g_envp_ptr@PAGE
.text:0000000000020B14                 LDR             X8, [X8,#__dl_g_argc_ptr@PAGEOFF]
.text:0000000000020B18                 LDR             X9, [X9,#__dl_g_argv_ptr@PAGEOFF]
.text:0000000000020B1C                 LDR             X10, [X10,#__dl_g_envp_ptr@PAGEOFF]
.text:0000000000020B20                 LDR             W0, [X8]
.text:0000000000020B24                 LDR             X1, [X9]
.text:0000000000020B28                 LDR             X2, [X10]
.text:0000000000020B2C                 BLR             X20
.text:0000000000020B30                 LDR             W8, [X23,#__dl_g_ld_debug_verbosity@PAGEOFF]
.text:0000000000020B34                 CMP             W8, #2

IDA调试安卓的10个技巧

请添加图片描述

objection基本使用+ Wallbreaker1

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

frida源码阅读之frida-java

请添加图片描述

第一个实例EasyJNI

在这里插入图片描述
发现只有32位的so
在这里插入图片描述
运行64位的frida
在这里插入图片描述
在这里插入图片描述
常见的ps命令及输出格式
在这里插入图片描述

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 168448  9776 ?        Ss   Aug28   0:03 /usr/lib/systemd/systemd --system --deserialize 19
root         2  0.0  0.0      0     0 ?        S    Aug28   0:00 [kthreadd]
...

第二个实例

jadx先看java代码,看调用的时机
在这里插入图片描述在这里插入图片描述

复制这个代码
在这里插入图片描述找到偏移地址
在这里插入图片描述
因为我的手机是64位的,将64位的so库放入到IDA工具中
在这里插入图片描述选中我们要调试的函数

在这里插入图片描述
如何看64位的指令
在这里插入图片描述
在这里插入图片描述
arm64位指令集
在这里插入图片描述

将Graph View切换成TextView
在这里插入图片描述
目标要得到的结果
在这里插入图片描述在这里插入图片描述IDA导入头文件

  • 步骤一:点击IDA Pro 菜单项“File->Load file->Parse c header file ” 选择jni.h头文件
  • 步骤二:点击IDA Pro 主界面上的“Structures”选项卡 然后按下Insert键打开“Create structure/union”对话框,点击界面上的"Add standard structure"按钮,在打开的结构体选择对话框中选择JNINativeInterface并点击OK返回,同理JNIInvokeInterface结构体也导入进来
  • 步骤四:在0x29C等调用env的地方右键,出现jni函数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述输出一个结果
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
使用下面的脚本

// HOOK未导出函数
function Test02() {
    // 绝对地址=so模块起始地址(基地址)+偏移地址
    let baseAddr = Module.findBaseAddress("libcyberpeace.so");
    send("baseAddr:" + baseAddr);
    // 指令集 分为ARM指令、thumb指令
    // ARM指令地址不变  thumb指令地址+1 sub_ 开头的函数 这种函数只能使用这种方式来进行
    Interceptor.attach(baseAddr.add(0x840), {
        onEnter: function (args) {
            send("============CheckString===============");
            send(args[0]); // 第一个参数
            send(args[1]); // 第二个参数
            send(args[2]); // 第三个参数
            // 获取JNIEnv*
            let env = Java.vm.tryGetEnv();
            // 将jstring 转换 const char*
            let str = env.getStringUtfChars(args[2], 0);
            send(str.readCString());
            console.log(hexdump(str, {
                offset: 0,
                length: 32,
                header: true,
                ansi: false
            }));
        },
        onLeave: function (retval) {
            send("============result===============");
            send(retval);
            // 获取JNIEnv*
            let env = Java.vm.tryGetEnv();
            // 将jstring 转换 const char*
            let str = env.getStringUtfChars(retval, 0);
            send(str.readCString());
        }
    });
}

Java.perform(function () {
    Test02();
})

能得到正确的结果
在这里插入图片描述返回结果是0x0,并不是我们想要的结果,所以要使用IDA调试一下
关闭frida-server
使用64位的android_server64
在这里插入图片描述
选择一个进程
在这里插入图片描述
搜索模块
在这里插入图片描述
在这里插入图片描述
双击进入, 并找到我们要找到的函数
在这里插入图片描述跳转到你想要看指定寄存器的位置
在这里插入图片描述在这里插入图片描述
老师又返回看了看静态分析的函数
在这里插入图片描述
拿数据在这里插入图片描述
分析后的结果
在这里插入图片描述

objection

资料

Windows/Ubuntu安装frida和objection 原创
kali Linux 逆向环境pyenv、Frida、objection、jadx、的安装

先运行frida-sever
在这里插入图片描述
端口转发
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
跳转到指定的界面
在这里插入图片描述生成Hook样例代码
在这里插入图片描述在这里插入图片描述在这里插入图片描述监控类
在这里插入图片描述

art_trace2.py

# -*- coding: utf-8 -*-

import os
import sys
import frida
import codecs


def message(message, data):
    if message["type"] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)


# process = frida.get_remote_device().attach('Transformers')
# if not os.path.isfile('./art_trace2.js'):
#     raise TypeError("./art_trace2.js does not exist")
# with codecs.open('./art_trace2.js', 'r', 'UTF-8') as file:
#     js_code = file.read()
# script = process.create_script(js_code)
# script.on("message", message)
# script.load()
# sys.stdin.read()
rdev = frida.get_remote_device()
pid = rdev.spawn(["com.zhuotong.crackme"])
process = rdev.attach(pid)
if not os.path.isfile('art_trace2.js'):
    raise TypeError("./art_trace2.js does not exist")
with codecs.open('art_trace2.js', 'r', 'UTF-8') as file:
    js_code = file.read()
script = process.create_script(js_code)
script.on('message', message)
script.load()
rdev.resume(pid)
sys.stdin.read()

art_trace2.js

Java.perform(function () {
    let symbols = Module.enumerateSymbolsSync("libart.so");
    let addrRegisterNatives = null;
    for (let i = 0; i < symbols.length; i++) {
        let symbol = symbols[i];
        //_ZN3art3JNI15RegisterNativesEP7_JNIEnvP7_jclassPK15JNINativeMethodi
        if (symbol.name.indexOf("art") >= 0 &&
                symbol.name.indexOf("JNI") >= 0 && 
                symbol.name.indexOf("RegisterNatives") >= 0 && 
                symbol.name.indexOf("CheckJNI") < 0) {
            addrRegisterNatives = symbol.address;
            console.log("RegisterNatives is at ", symbol.address, symbol.name);
        }
    }

    if (addrRegisterNatives != null) {
        Interceptor.attach(addrRegisterNatives, {
            onEnter: function (args) {
                console.log("[RegisterNatives] method_count:", args[3]);
                let java_class = args[1];
                let class_name = Java.vm.tryGetEnv().getClassName(java_class);
                let methods_ptr = ptr(args[2]);
                let method_count = parseInt(args[3]);
                for (let i = 0; i < method_count; i++) {
                    let name_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3));
                    let sig_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize));
                    let fnPtr_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize * 2));

                    let name = Memory.readCString(name_ptr);
                    let sig = Memory.readCString(sig_ptr);
                    let find_module = Process.findModuleByAddress(fnPtr_ptr);
					console.log("[RegisterNatives] java_class:", class_name, "name:", name, "sig:", sig, "fnPtr:", fnPtr_ptr, "module_name:", find_module.name, "module_base:", find_module.base, "offset:", ptr(fnPtr_ptr).sub(find_module.base));
                    // console.log("[RegisterNatives] java_class:", class_name, "name:", name, "sig:", sig, "fnPtr:", fnPtr_ptr);
                }
            }
        });
    }
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/834678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 如何解决缓存雪崩、缓存击穿、缓存穿透难题

前言 Redis 作为一门热门的缓存技术&#xff0c;引入了缓存层&#xff0c;就会有缓存异常的三个问题&#xff0c;分别是缓存击穿、缓存穿透、缓存雪崩。我们用本篇文章来讲解下如何解决&#xff01; 缓存击穿 缓存击穿: 指的是缓存中的某个热点数据过期了&#xff0c;但是此…

我们一起聊聊Docker And Dockerfile

目录 一、前言 二、了解Dockerfile 三、Dockerfile 指令 四、多阶段构建 五、Dockerfile 高级用法 六、小结 一、前言 对于开发人员来说&#xff0c;会Docker而不知道Dockerfile等于不会Docker&#xff0c;上一篇文章带大家学习了Docker的基本使用方法&#xff1a;《一文…

Mybatis where 1=1 会导致索引失效?

背景 这几天在网上百度看到有说法 where 11 会导致索引失效 实践 1.直接where 条件 这是我自己本地建立的表&#xff0c;索引也看到了&#xff0c;是这个index_shopname 2.where 11 and 条件 这个是加了11的&#xff0c;可以看到也是走了索引的 3.直接select * from whe…

测试平台——用户模块开发

这里写目录标题 一、创建子应用二、用户注册设计1、用户注册模型类设计a、Django认证系统提供了用户模型类User&#xff0c;为什么还要定义User模型类?b、AbstractUserc、自定义用户模型类的字段有d、User模型类编写好了就可以了吗? 2、用户注册序列化器类设计a、注意b、单字…

基于分级安全的OpenHarmony架构设计

本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第1期 | 基于分级安全的OpenHarmony架构设计》 演讲嘉宾 | 付天福 回顾整理 | 廖 涛 排版校对 | 李萍萍 嘉宾简介 付天福&#xff0c;OpenHarmony技术指导委员会安全及机密计算TSG负责人&#xff0c;华为公司科学家委员会…

机器人“瓦力”近在咫尺?谷歌最新的RT-2 AI模型简介

“首创”的机器人 AI 模型能够识别垃圾并执行复杂的动作。 上周五&#xff0c;谷歌 DeepMind 宣布了机器人变形器 2&#xff08;RT-2&#xff09;&#xff0c;这是一种“首次推出”的视觉-语言-行动&#xff08;VLA&#xff09;模型&#xff0c;利用从互联网上抓取的数据&…

理解 CSS 中的 Containing Block

前言 在开始本文之前先来看一个例子&#xff0c;下面一段简单的 html 代码&#xff0c;布局很简单&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"w…

clickhouse调研报告2

由Distributed表发送分片数据 clickhouse分区目录合并 clickhouse副本协同流程 clickhouse索引查询逻辑 clickhouse一级索引生成逻辑(两主键) clickhouse的data目录下包含如下目录: [root@brfs-stress-01 201403_10_10_0]# ll /data01/clickhouse/data total 4 drwxr-x---…

【Linux操作系统】网络配置详解:从原理到实践(详细通俗讲明DNS)

导语&#xff1a;网络配置是Linux系统中的一项重要任务&#xff0c;合理的网络配置可以保证计算机与其他设备的正常通信。本文将详细介绍Linux网络配置的原理和实践&#xff0c;包括网络配置原理、查看网络IP和网关、测试网络连通性、网络环境配置、设置主机名和hosts映射以及主…

获取全部的地区并生成表格

思路 写文章的时间2023-8-4&#xff0c;大部分网页设置的区域都是先是省&#xff0c;然后通过省获取对应的市&#xff0c;再通过市获取对应的区&#xff0c;以此类推。所以模拟的请求也是按照这个逻辑&#xff0c;先获取所有的省&#xff0c;再获取所有的市&#xff0c;最后获取…

【2023华数杯全国大学生数学建模竞赛】C题 母亲身心健康对婴儿成长的影响第一、二问

第一问部分截图 第二问部分截图 参考文献 理论和可直接运行代码获取参见&#xff1a;理论和可直接运行代码获取参见&#xff1a;理论和可直接运行代码获取参见&#xff1a;理论和可直接运行代码获取参见&#xff1a; 有人看的话更新后续问题思路。

【项目经验】产研流程(超级详细的步骤)

一、产研流程简述 项目立项-——定需求——Sprint需求宣讲会——技术方案——技术方案评审会——开发及单元测试——测试用例评审会——提测——测试——Sprint评审会——发版——Sprint复盘会 二、产研流程详情 以下部分根据Sprint里程碑节点进行循环&#xff08;sprint周期…

Java8实战-总结12

Java8实战-总结12 Lambda表达式Lambda 和方法引用实战第1步&#xff1a;传递代码第2步&#xff1a;使用匿名类第3步&#xff1a;使用Lambda表达式第4步&#xff1a;使用方法引用 复合Lambda表达式的有用方法比较器复合逆序比较器链 函数复合 Lambda表达式 Lambda 和方法引用实…

【C++】从无到有了解并掌握C++面向对象编程的三大特性——封装、继承、多态

前置知识&#xff1a;类和对象 参考书籍&#xff1a;《C Primer 第五版》 目录 什么是面向过程&#xff1f;什么是面向对象&#xff1f; 一、封装 1、封装的含义以及如何实现封装 1.1 访问限定符&#xff08;访问说明符&#xff09; 1.2 什么是封装&#xff1f; 2、封装的优点…

2023年华数杯选题人数发布!!

该选题人数&#xff0c;主要基于根据各个平台开赛后12小时各项数据统计&#xff0c;进行评估&#xff08;方法见注释&#xff09;&#xff0c;最终得出2023年华数杯选选题人数&#xff0c;大致为 题号选题人数A120B159C420 注释&#xff1a;选题人数来源&#xff1a;源自各个平…

Java字符串常量池以及new String(“abc“)到底创建了几个对象?各种字符串到底相不相等?

new String(“abc”)到底创建了几个对象&#xff1f; 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串&#xff08;String 类&#xff09;专门开辟的一块区域&#xff0c;主要目的是为了避免字符串的重复创建。 1.如果字符串常量池中不存在“abc”的引用&#xff…

GD32F103VE外部中断

GD32F103VE外部中断线线0~15&#xff0c;对应外部IO口的输入中断。它有7个中断向量&#xff0c;外部中断线0 ~ 4分别对应EXTI0_IRQn ~ EXTI4_IRQn中断向量&#xff1b;外部中断线 5 ~ 9 共用一个 EXTI9_5_IRQn中断向量&#xff1b;外部中断线10~15 共用一个 EXTI15_10_IRQn中断…

深入探索Vue.js核心技术与跨平台开发uni-app实战

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 前言 在当今Web应用不断…

小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景+b2b2c bbc

​ 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前…

7、Kubernetes核心技术 - Secret

目录 一、Secret概述 二、Secret 三种类型 2.1、Opaque 2..2、kubernetes.io/dockerconfigjson 2.3、kubernetes.io/service-account-token 三、Secret创建 3.1、命令行方式创建 Secret 3.2、yaml方式创建 Secret 四、Secret解码 五、Secret使用 5.1、将 Secret 挂载…