Linux内核分析之前置知识-00

前言

推荐学习顺序:

基础知识 → 进程管理 → 内存管理 → 进程间通信 → 文件系统 → 设备驱动 → 网络协议栈 → 虚拟化 → 安全模块。

环境搭建

交叉编译工具链下载 toolchains-bootlin musl-cc 裸机编译工具链可以自行寻找。

大家可以使用ubuntu desktop或者windows+wsl2,Mac的配置和Linux大同小异。qemu有windwos的安装包,也可以使用windows的qemu,即WSL2+WINDOWS。这一部分内容可以参考我之前写的Pwn_kernel的内核模块开发部分。需要注意的是Windwos的qemu和Linux的qemu在启动命令上是有些不同的,linux的一些指令和功能特性是Windows不支持的。也可以选择在wsl2中编译qemu。建议使用Linux的qemu,功能更为完善强大。

windows

winget

https://github.com/microsoft/winget-cli/releases

winget install Microsoft.Coreutils
winget install Microsoft.WinDbg
winget install Git.Git
winget install MSYS2.MSYS2
winget install Kitware.CMake
winget install Ninja-build.Ninja
winget install Xmake-io.Xmake
winget upgrade --all

msys2->clang64 / msys2->ucrt64**。

pacman -Syu

pacman -Sy base-devel wget curl coreutils binutils mingw-w64-clang-x86_64-gdb

pacman -Sy mingw-w64-clang-x86_64-toolchain \
          mingw-w64-clang-x86_64-clang \
          mingw-w64-clang-x86_64-llvm

pacman -Sy mingw-w64-clang-x86_64-cmake \
          mingw-w64-clang-x86_64-ninja

pacman -Sy mingw-w64-clang-x86_64-clang-tools-extra \
          mingw-w64-clang-x86_64-bear \
          mingw-w64-clang-x86_64-gdb

pacman -Sy iasl

gcc --version
g++ --version
clang --version
cmake --version

包前缀对照表

环境 完整前缀 缩写提示
MINGW64 mingw-w64-x86_64- x86_64
UCRT64 mingw-w64-ucrt-x86_64- ucrt64
CLANG64 mingw-w64-clang-x86_64- clang64

terminal

https://github.com/microsoft/terminal/releases

pwsh

https://github.com/PowerShell/PowerShell/releases

zed

https://zed.dev/download

UV

irm https://astral.sh/uv/install.ps1 | iex

nvm

https://www.nvmnode.com/guide/download.html

bun

https://bun.com

irm bun.sh/install.ps1 | iex

AI-Coder

Invoke-WebRequest https://get.pnpm.io/install.ps1 -UseBasicParsing | Invoke-Expression
irm https://claude.ai/install.ps1 | iex
npm install -g @openai/codex@latest
npm install -g @google/gemini-cli@latest
bun add -g opencode-ai
irm https://code.kimi.com/kimi-code/install.ps1 | iex

VSC++

https://visualstudio.microsoft.com/insiders/

安装C++, donet,VS2026,其他的按需选择。

image-20260612101427537

注意右侧可选里面勾选的内容。

image-20260620003829944

安装wix

dotnet tool install --global wix

Rust/Golang

https://rust-lang.org/learn/get-started/

https://go.dev/

oh my posh

https://github.com/jandedobbeleer/oh-my-posh

winget install JanDeDobbeleer.OhMyPosh --source winget

字体配置:

oh-my-posh font install meslo

终端里按 CTRL + SHIFT + , 打开 settings.json,编辑:

image-20260612102510816

prompt 配置:

PS C:\Users\30487> oh-my-posh get shell
pwsh
PS C:\Users\30487> zed $PROFILE

image-20260612102849694

theme 配置:

zed $PROFILE

oh-my-posh init pwsh --config "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/refs/heads/main/themes/robbyrussell.omp.json" | Invoke-Expression

image-20260612110200366

XMake

curl -fsSL https://xmake.io/shget.text | bash

zsh-omz 安装

sudo apt-get install zsh curl git vim -y
chsh -s $(which zsh)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

cp ~/.zshrc ~/.zshrc.bak && sed -i 's/^plugins=(.*/plugins=(git z zsh-syntax-highlighting zsh-autosuggestions)/' ~/.zshrc

source ~/.zshrc

pyenv 安装(弃用)

sudo apt update && sudo apt install -y \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libncurses-dev \
    xz-utils \
    tk-dev \
    libffi-dev \
    liblzma-dev \
    libgdbm-dev \
    libnss3-dev \
    libedit-dev \
    wget curl clang llvm make git

curl https://pyenv.run | bash

vim ~/.zshrc

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
# python2 安装需要改一下 CFLAGS
CFLAGS="-O2 -std=gnu17" pyenv install 2.7.18

Poetry(弃用)

pip install Poetry
poetry self add poetry-plugin-up
poetry up --latest
poetry update

UV (推荐)

curl -LsSf https://astral.sh/uv/install.sh | sh -

source $HOME/.local/bin/env

中文支持

# 更新软件包列表
sudo apt update
# 安装中文语言包
sudo apt install -y language-pack-zh-hans language-pack-zh-hans-base
# 安装中文字体
sudo apt install -y fonts-noto-cjk fonts-wqy-microhei fonts-wqy-zenhei
# 生成中文 locale
sudo locale-gen zh_CN.UTF-8
# 更新 locale 配置
sudo update-locale LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh
# 查看已安装的 locale
locale -a | grep zh
# 写入 .zshrc
echo 'export LANG=zh_CN.UTF-8' >> ~/.zshrc
echo 'export LANGUAGE=zh_CN:zh' >> ~/.zshrc
source ~/.zshrc

git 配置

# 1. 生成 SSH 密钥
ssh-keygen -t ed25519 -C "git@git.com"
# 2. 查看公钥并添加到 GitHub/Gitee
cat ~/.ssh/id_ed25519.pub
# 3. 测试连接
ssh -T git@github.com

gh 配置

# 官方 apt 源(推荐,版本最新)
(type -p wget >/dev/null || (sudo apt update && sudo apt install wget -y)) \
&& sudo mkdir -p -m 755 /etc/apt/keyrings \
&& wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
&& sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
&& sudo apt update \
&& sudo apt install gh -y

gh auth login

开启 32 位支持

# 1. 添加 i386 架构支持
sudo dpkg --add-architecture i386

# 2. 验证已启用的架构
dpkg --print-architecture              # 主架构(amd64)
dpkg --print-foreign-architectures     # 附加架构(应显示 i386)

# 3. 更新 apt 源
sudo apt update

sudo apt install -y \
    libc6:i386 \
    libc6-dbg:i386 \
    libncurses6:i386 \
    libncursesw6:i386 \
    libtinfo6:i386 \
    libstdc++6:i386 \
    lib32z1 \
    lib32gcc-s1 \
    libgcc-s1:i386 \
    libbz2-1.0:i386 \
    libsqlite3-0:i386 \
    zlib1g:i386
# 编译工具
sudo apt install -y gcc-multilib g++-multilib gdb-multiarch

wine

sudo apt install -y wine zenity winetricks

zed 编辑器

curl -f https://zed.dev/install.sh | sh
echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.zshrc
source ~/.zshrc

NVM / node

nvm-git 下载最新版。

#!/usr/bin/env bash

set -eo pipefail   # 保留出错即停和管道错误检测,但不强制检查未定义变量

# --- 1. 获取 nvm 最新版本号 ---
echo "正在获取 nvm 最新版本..."

LATEST_URL=$(curl -s -o /dev/null -w '%{url_effective}' -L \
    https://github.com/nvm-sh/nvm/releases/latest 2>/dev/null) || true
LATEST_TAG=${LATEST_URL##*/}

FALLBACK_TAG="v0.40.4"

if [[ -z "$LATEST_TAG" || "$LATEST_TAG" != v* ]]; then
    echo "无法自动获取最新版本,使用备用版本 ${FALLBACK_TAG}"
    LATEST_TAG="$FALLBACK_TAG"
else
    echo "最新 nvm 版本:${LATEST_TAG}"
fi

# --- 2. 安装 nvm ---
echo "正在安装 nvm ${LATEST_TAG} ..."
curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/${LATEST_TAG}/install.sh" | bash

# --- 3. 在当前 shell 加载 nvm ---
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

# --- 4. 写入 ~/.zshrc(防重复)---
ZSHRC="$HOME/.zshrc"
NVM_BLOCK="# nvm configuration"
if ! grep -qF "$NVM_BLOCK" "$ZSHRC" 2>/dev/null; then
    cat >> "$ZSHRC" << 'EOF'

# nvm configuration
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
EOF
    echo "已将 nvm 配置追加到 ${ZSHRC}"
else
    echo "nvm 配置已存在于 ${ZSHRC},无需重复添加"
fi

# --- 5. 安装并使用 Node.js LTS ---
echo "正在安装 Node.js LTS 版本..."
nvm install --lts
nvm use --lts
echo "安装完成!当前 node 版本:$(node -v)"
echo "              npm  版本:$(npm -v)"

AI Coder

#!/usr/bin/env bash
set -euo pipefail

# ----------------------------- helpers -----------------------------
need_cmd() {
  if ! command -v "$1" &>/dev/null; then
    echo "❌ 需要 $1 但未安装,请先安装它。"
    exit 1
  fi
}

add_block_to_zshrc() {
  local marker="$1"
  local block="$2"
  local zshrc="$HOME/.zshrc"

  if ! grep -qF "$marker" "$zshrc" 2>/dev/null; then
    echo "" >> "$zshrc"
    echo "$block" >> "$zshrc"
    echo "✅ 已写入 $marker 到 ~/.zshrc"
  else
    echo "⏭️  $marker 配置已存在,跳过。"
  fi
}

need_cmd curl
need_cmd bash

echo "============================================"
echo "开始安装开发工具..."
echo "============================================"

# ---- pnpm ----
echo "📦 安装 pnpm..."
curl -fsSL https://get.pnpm.io/install.sh | sh
add_block_to_zshrc "# pnpm" \
'# pnpm
export PNPM_HOME="$HOME/.local/share/pnpm"
case ":$PATH:" in
  *":$PNPM_HOME/bin:"*) ;;
  *) export PATH="$PNPM_HOME/bin:$PATH" ;;
esac
# pnpm end'

# ---- bun ----
echo "📦 安装 bun..."
curl -fsSL https://bun.sh/install | bash
add_block_to_zshrc "# bun" \
'# bun
export BUN_INSTALL="$HOME/.bun"
export PATH="$BUN_INSTALL/bin:$PATH"
# bun end'

# ---- opencode ----
echo "📦 安装 opencode..."
curl -fsSL https://opencode.ai/install | bash
add_block_to_zshrc "# opencode" \
'# opencode
export PATH="$HOME/.opencode/bin:$PATH"
# opencode end'

# ---- kimi-code ----
echo "📦 安装 kimi-code..."
curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash
add_block_to_zshrc "# kimi-code" \
'# kimi-code
export PATH="$HOME/.kimi-code/bin:$PATH"
# kimi-code end'

# ---- claude (仅安装,不额外配置 PATH) ----
echo "📦 安装 claude..."
curl -fsSL https://claude.ai/install.sh | bash

# ---- npm 全局包 ----
if ! command -v npm &>/dev/null; then
  echo "⚠️  未找到 npm,跳过全局安装 @openai/codex 和 @google/gemini-cli"
else
  echo "📦 安装 @openai/codex@latest..."
  npm install -g @openai/codex@latest
  echo "📦 安装 @google/gemini-cli@latest..."
  npm install -g @google/gemini-cli@latest
fi

echo ""
echo "============================================"
echo "全部安装完成!"
echo "请执行以下命令让环境变量生效:"
echo "  source ~/.zshrc   (或者重新打开终端)"
echo "============================================"

cc-switch

curl -fsSL https://github.com/SaladDay/cc-switch-cli/releases/latest/download/install.sh | bash

superpowers

superpowers

ruflo

curl -fsSL https://cdn.jsdelivr.net/gh/ruvnet/ruflo@main/scripts/install.sh | bash

pwntools / pwndbg 调试

pwntools 安装

cd ~ && mkdir pwn && cd pwn
uv venv
uv pip install pwntools pwncli ROPgadget pycryptodome cryptography vmlinux-to-elf

pwndbg 安装

curl --proto '=https' --tlsv1.2 -LsSf 'https://install.pwndbg.re' | sh -s -- -t pwndbg-gdb

Rust/Golang

rust:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# add to .zshrc
cat >> ~/.zshrc << 'EOF'
# Rust/Cargo
export PATH="$HOME/.cargo/bin:$PATH"
EOF
source ~/.zshrc
rustup install stable
rustup install nightly
rustup update

golang:

#!/bin/bash
set -e

# ---------- 1. 获取最新稳定版本 ----------
# Go 官方提供纯文本版号接口
LATEST_GO=$(curl -s https://go.dev/VERSION?m=text | head -1 | grep -oP 'go\K[0-9.]+')
echo "最新 Go 版本: $LATEST_GO"

# ---------- 2. 根据系统架构自动拼接下载包 ----------
OS=linux
ARCH=amd64
# 如果希望自动判断架构,可以取消注释下面两行
# OS=$(uname -s | tr '[:upper:]' '[:lower:]')
# ARCH=$(uname -m | sed 's/x86_64/amd64/' | sed 's/aarch64/arm64/')

FILE="go${LATEST_GO}.${OS}-${ARCH}.tar.gz"
URL="https://go.dev/dl/${FILE}"

# ---------- 3. 下载并解压到 ~/golang ----------
cd ~
mkdir -p golang
cd golang

# 如果当前已安装同版本,可跳过下载(可选)
if [ -d "go" ]; then
    INSTALLED=$("go/bin/go" version 2>/dev/null | grep -oP 'go\K[0-9.]+' || echo "0")
    if [ "$INSTALLED" = "$LATEST_GO" ]; then
        echo "当前已安装最新版本 $LATEST_GO,跳过下载"
        exit 0
    else
        echo "旧版本 $INSTALLED 存在,将覆盖更新至 $LATEST_GO"
    fi
fi

wget -q --show-progress "$URL"
tar -xzf "$FILE"
rm "$FILE"

# ---------- 4. 写入环境变量(仅在未配置时追加) ----------
if ! grep -q "GOROOT=\$HOME/golang/go" ~/.zshrc; then
    cat >> ~/.zshrc << 'EOF'

# Go environment
export GOROOT=$HOME/golang/go
export GOPATH=$HOME/golang/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
EOF
    echo "环境变量已写入 ~/.zshrc,请执行: source ~/.zshrc"
else
    echo "环境变量已存在,跳过写入"
fi

echo "Go ${LATEST_GO} 安装完成!"

tmux/zellij

tmux

sudo apt install tmux

zellij

#!/usr/bin/env bash
# install-latest-zellij.sh —— 始终安装最新版 zellij,并自动写入 ~/.zshrc

set -euo pipefail

REPO="zellij-org/zellij"
BIN_DIR="$HOME/mybin"
mkdir -p "$BIN_DIR"

# ----- 检测系统架构 -----
ARCH=$(uname -m)
case "$ARCH" in
    x86_64)  ARCH="x86_64" ;;
    aarch64) ARCH="aarch64" ;;
    arm64)   ARCH="aarch64" ;;   # macOS Apple Silicon
    *) echo "不支持的架构: $ARCH"; exit 1 ;;
esac

OS=$(uname -s)
case "$OS" in
    Linux)  TARGET="unknown-linux-musl" ;;
    Darwin) TARGET="apple-darwin" ;;
    *) echo "不支持的操作系统: $OS"; exit 1 ;;
esac

# ----- 获取最新版 tag -----
TAG=$(curl -s "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
echo "✅ 最新版本: $TAG"

# ----- 下载 & 安装 -----
URL="https://github.com/$REPO/releases/download/$TAG/zellij-${ARCH}-${TARGET}.tar.gz"
echo "⬇️  下载 $URL"
curl -L "$URL" -o /tmp/zellij.tar.gz
tar -xzf /tmp/zellij.tar.gz -C /tmp
chmod +x /tmp/zellij
mv /tmp/zellij "$BIN_DIR/zellij"
rm /tmp/zellij.tar.gz

echo "✅ zellij 已安装到 $BIN_DIR/zellij"

# ----- 自动写入 ~/.zshrc(使用 cat EOF) -----
if ! grep -q 'export PATH="$HOME/mybin:$PATH"' ~/.zshrc 2>/dev/null; then
    cat << 'EOF' >> ~/.zshrc

# Add personal bin directory (zellij, etc.)
export PATH="$HOME/mybin:$PATH"
EOF
    echo "✅ 已将 ~/mybin 添加到 PATH,写入 ~/.zshrc"
else
    echo "ℹ️  ~/mybin 已存在于 PATH,无需重复添加"
fi

echo ""
echo "🚀 执行下面命令让 PATH 生效,然后就可以直接输入 zellij 了:"
echo "   source ~/.zshrc"

Android 环境搭建

IDA Pro 安装

windows :

放行 vmnet 访问宿主机 windows。

按 IP 范围放行
这种方法会允许 192.168.188.0/24 网段的所有流量进入 Windows,这意味着你的所有虚拟机都可以自由访问宿主机。
在左侧面板,点击 “入站规则”。
在右侧操作栏,点击 “新建规则...”。
规则类型:选择 “自定义”,点击“下一步”。
程序:保持默认的“所有程序”,点击“下一步”。
协议和端口:保持默认的“所有协议类型”和“所有端口”,点击“下一步”。
作用域:
在“此规则应用于哪些远程 IP 地址?”下,选择 “下列 IP 地址”。
点击 “添加” 按钮。
在弹出的框中输入:192.168.188.0/24 (这代表了整个 188 网段,包含你的 .130 虚拟机)。或者你也可以单独输入 192.168.188.130。
点击“确定”,然后点击“下一步”。
操作:选择 “允许连接”,点击“下一步”。
配置文件:务必勾选“公用”(因为 Windows 经常把 VMware 虚拟网卡识别为公用网络),“域”和“专用”也建议勾选上。点击“下一步”。
名称:起一个容易认出的名字,例如 Allow VMware VMnet Traffic。点击“完成”。
完成这一步后,不用关闭防火墙,你的 Ubuntu 虚拟机应该就能 Ping 通 192.168.188.1 并访问其上的服务了。

放行 IDA-MCP 端口:

new-NetFirewallRule -DisplayName "IDA-MCP 11338" -Direction Inbound -Protocol TCP -LocalPort 11338 -Action Allow

idapro9.3sp2 crack

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

import json
import hashlib
import os
import platform

license = {
    "header": {"version": 1},
    "payload": {
        "name": "IDAPRO93",
        "email": "idapro93@example.com",
        "licenses": [
            {
                "id": "48-2137-ACAB-99",
                "edition_id": "ida-pro",
                "description": "license",
                "license_type": "named",
                "product": "IDA",
                "product_id": "IDAPRO",
                "product_version": "9.3",
                "seats": 1,
                "start_date": "2024-08-10 00:00:00",
                "end_date": "2083-12-31 23:59:59",
                "issued_on": "2024-08-10 00:00:00",
                "owner": "HexRays",
                "add_ons": [],
                "features": [],
            }
        ],
    },
}

def add_every_addon(license):
    platforms = [
        "W",  # Windows
        "L",  # Linux
        "M",  # macOS
    ]
    addons = [
        "HEXX86",
        "HEXX64",
        "HEXARM",
        "HEXARM64",
        "HEXMIPS",
        "HEXMIPS64",
        "HEXPPC",
        "HEXPPC64",
        "HEXRV",
        "HEXRV64",
        "HEXARC",
        "HEXARC64",
    ]

    i = 0
    for addon in addons:
        i += 1
        license["payload"]["licenses"][0]["add_ons"].append(
            {
                "id": f"48-1337-0000-{i:02}",
                "code": addon,
                "owner": license["payload"]["licenses"][0]["id"],
                "start_date": "2024-08-10 00:00:00",
                "end_date": "2083-12-31 23:59:59",
            }
        )

add_every_addon(license)

def json_stringify_alphabetical(obj):
    return json.dumps(obj, sort_keys=True, separators=(",", ":"))

def buf_to_bigint(buf):
    return int.from_bytes(buf, byteorder="little")

def bigint_to_buf(i):
    return i.to_bytes((i.bit_length() + 7) // 8, byteorder="little")

# Yup, you only have to patch 5c -> cb in libida64.so
pub_modulus_hexrays = buf_to_bigint(
    bytes.fromhex(
        "edfd425cf978546e8911225884436c57140525650bcf6ebfe80edbc5fb1de68f4c66c29cb22eb668788afcb0abbb718044584b810f8970cddf227385f75d5dddd91d4f18937a08aa83b28c49d12dc92e7505bb38809e91bd0fbd2f2e6ab1d2e33c0c55d5bddd478ee8bf845fcef3c82b9d2929ecb71f4d1b3db96e3a8e7aaf93"
    )
)
pub_modulus_patched = buf_to_bigint(
    bytes.fromhex(
        "edfd42cbf978546e8911225884436c57140525650bcf6ebfe80edbc5fb1de68f4c66c29cb22eb668788afcb0abbb718044584b810f8970cddf227385f75d5dddd91d4f18937a08aa83b28c49d12dc92e7505bb38809e91bd0fbd2f2e6ab1d2e33c0c55d5bddd478ee8bf845fcef3c82b9d2929ecb71f4d1b3db96e3a8e7aaf93"
    )
)

private_key = buf_to_bigint(
    bytes.fromhex(
        "77c86abbb7f3bb134436797b68ff47beb1a5457816608dbfb72641814dd464dd640d711d5732d3017a1c4e63d835822f00a4eab619a2c4791cf33f9f57f9c2ae4d9eed9981e79ac9b8f8a411f68f25b9f0c05d04d11e22a3a0d8d4672b56a61f1532282ff4e4e74759e832b70e98b9d102d07e9fb9ba8d15810b144970029874"
    )
)

def decrypt(message):
    decrypted = pow(buf_to_bigint(message), exponent, pub_modulus_patched)
    decrypted = bigint_to_buf(decrypted)
    return decrypted[::-1]

def encrypt(message):
    encrypted = pow(buf_to_bigint(message[::-1]), private_key, pub_modulus_patched)
    encrypted = bigint_to_buf(encrypted)
    return encrypted

exponent = 0x13

def sign_hexlic(payload: dict) -> str:
    data = {"payload": payload}
    data_str = json_stringify_alphabetical(data)

    buffer = bytearray(128)
    # first 33 bytes are random
    for i in range(33):
        buffer[i] = 0x42

    # compute sha256 of the data
    sha256 = hashlib.sha256()
    sha256.update(data_str.encode())
    digest = sha256.digest()

    # copy the sha256 digest to the buffer
    for i in range(32):
        buffer[33 + i] = digest[i]

    # encrypt the buffer
    encrypted = encrypt(buffer)

    return encrypted.hex().upper()

def patch(filename):
    if not os.path.exists(filename):
        print(f"Skip: {filename} - didn't find")
        return

    with open(filename, "rb") as f:
        data = f.read()

        if data.find(bytes.fromhex("EDFD42CBF978")) != -1:
            print(f"Patch: {filename} - looks to be already patched :)")
            return

        if data.find(bytes.fromhex("EDFD425CF978")) == -1:
            print(f"Patch: {filename} - doesn't contain the original modulus.")
            return

        data = data.replace(
            bytes.fromhex("EDFD425CF978"), bytes.fromhex("EDFD42CBF978")
        )

    with open(filename, "wb") as f:
        f.write(data)

    print(f"Patch: {filename} - OK")

license["signature"] = sign_hexlic(license["payload"])
serialized = json_stringify_alphabetical(license)

filename = "idapro.hexlic"
with open(filename, "w") as f:
    f.write(serialized)

print(f"\nSaved new license to {filename}!\n")

os_name = platform.system().lower()
if os_name == 'windows':
    patch("ida.dll")
    patch("ida32.dll")
elif os_name == 'linux':
    patch("libida.so")
    patch("libida32.so")
elif os_name == 'darwin':
    patch("libida.dylib")
    patch("libida32.dylib")

9.4

#!/usr/bin/env python3
"""
IDA Pro 9.4 beta1 许可证生成与补丁工具(Python 版)
原 Node.js 脚本转换,仅用于研究用途。
"""
import json
import hashlib
import os
import sys

# ========== 常量定义 ==========
C_MODULUS_HEX = (
    "3f0307607fed562fd5a163adc40fcc603373caa28414e64cdc4552a555b13ad4b3ad0a812"
    "800a03195300fd71634b90edb0d69ea710efebb2b0b9e72da2effb149de70bcbfa94b86af"
    "01ce455dbbd5fa987207651c7b60c2e4cafd0654188d98c30f64dc084d8547f0ac32db9112"
    "4af82b3b15bf922a31f1d5e332f27615cea7"
)
PRIVATE_KEY_HEX = (
    "8b3f5fdfad7f87239734c530e2ecebeb4fa48d79518756c15fd54636801cf7ea6367100566"
    "bf8b52b16bec05258d8426ea94c15841ab2d37802c07349df4c208584e86d25a6bfb82966"
    "cb2ddcd3d654e9994e814ca470577362a937cc984e404a0b68d173aab3180130118e1b03e"
    "d209a9d8757560a85a3c9b0d3380e7907c4f"
)
PADKEY_HEX = (
    "e2a7c300dfcc777f89b57500d8151c7fb1d97b3f9f170393311234ceeb9e377ae2a7c300d"
    "fcc777f89b57500d8151c7fb1d97b3f9f170393311234ceeb9e377ae2a7c300dfcc777f89"
    "b57500d8151c7fb1d97b3f9f170393311234ceeb9e377ae2a7c300dfcc777f89b57500d81"
    "51c7fb1d97b3f9f170393311234ceeb9e37"
)

V54 = 127          # 缓冲区大小
V56 = 95           # 哈希复制偏移量

# ========== RSA 加密(与 Node.js 行为一致) ==========
def _hex_to_int_le(hex_str: str) -> int:
    """将十六进制字符串以小端序解释为整数"""
    return int.from_bytes(bytes.fromhex(hex_str), 'little')

MODULUS_INT = _hex_to_int_le(C_MODULUS_HEX)
KEY_INT    = _hex_to_int_le(PRIVATE_KEY_HEX)


def encrypt_message(message: bytes) -> bytes:
    """
    使用私钥对消息进行 RSA 加密。
    输入为 big‑endian 整数,输出为 little‑endian 字节流。
    """
    # 将消息解释为大端整数(与 Node 端的 reversed + 重建逻辑等效)
    msg_int = int.from_bytes(message, 'big')
    encrypted_int = pow(msg_int, KEY_INT, MODULUS_INT)

    # 提取小端字节(LSB 优先)
    result = []
    temp = encrypted_int
    while temp > 0:
        result.append(temp & 0xFF)
        temp >>= 8
    return bytes(result)


# ========== 签名生成 ==========
def sign_payload(payload: dict) -> str:
    """
    对许可证 payload 签名,返回大写的十六进制字符串(128 字节补零格式)。
    """
    # 生成规范化的 JSON 字符串(与 Node 的 sort 等效)
    data_str = json.dumps({"payload": payload}, sort_keys=True, separators=(',', ':'))
    hash_bytes = hashlib.sha256(data_str.encode()).digest()  # 32 字节

    # 创建 U 缓冲区(127 字节)并将哈希放入偏移 95 处
    U = bytearray(V54)
    U[V56:V56 + 32] = hash_bytes

    # 与 PADKEY 的前 127 字节异或
    padkey = bytes.fromhex(PADKEY_HEX)
    padkey_slice = padkey[:V54]
    block = bytearray(V54)
    for i in range(V54):
        block[i] = U[i] ^ padkey_slice[i]

    # 若第一个字节为 0,则翻转最低位
    if block[0] == 0:
        block[0] ^= 1

    # 加密块,并将结果放入 128 字节缓冲区(剩余部分补零)
    sig = encrypt_message(bytes(block))
    out = bytearray(128)
    out[:len(sig)] = sig
    return out.hex().upper()


# ========== 构建许可证结构 ==========
def build_license() -> dict:
    lic = {
        "header": {"version": 1},
        "payload": {
            "name": "auth",
            "email": "admin@hex-rays.com",
            "licenses": [{
                "description": "license",
                "edition_id": "ida-pro",
                "id": "14-0000-FFFF-88",
                "license_type": "named",
                "product": "IDA",
                "seats": 1,
                "start_date": "2024-08-10 00:00:00",
                "end_date": "2033-12-31 23:59:59",
                "issued_on": "2025-07-20 00:00:00",
                "owner": "auth",
                "product_id": "IDAPRO",
                "product_version": "9.4",
                "add_ons": [],
                "features": [],
            }],
        },
    }

    addons_list = [
        'LUMINA', 'TEAMS',
        'HEXX86', 'HEXX64', 'HEXARM', 'HEXARM64',
        'HEXMIPS', 'HEXMIPS64', 'HEXPPC', 'HEXPPC64',
        'HEXRV', 'HEXRV64', 'HEXARC', 'HEXARC64',
        'HEXV850', 'HEXDALVIK',
    ]

    license_ref = lic["payload"]["licenses"][0]
    for i, code in enumerate(addons_list):
        license_ref["add_ons"].append({
            "id": f"48-1337-B00B-{str(i + 1).zfill(2)}",
            "code": code,
            "owner": license_ref["id"],
            "start_date": "2025-07-20 00:00:00",
            "end_date": "2033-12-31 23:59:59",
        })
    return lic


# ========== 文件写入与补丁 ==========
def write_license(lic_obj: dict):
    """
    将完整许可证对象排序序列化后写入 idapro.hexlic
    """
    content = json.dumps(lic_obj, sort_keys=True, separators=(',', ':'))
    with open("idapro.hexlic", "w", encoding="utf-8") as f:
        f.write(content)
    print("License written to idapro.hexlic")


def patch_binary(file_path: str, search_hex: str, replace_hex: str):
    """
    在二进制文件中搜索十六进制模式并替换。
    """
    try:
        with open(file_path, "rb") as f:
            data = bytearray(f.read())
    except Exception as e:
        print(f"Error reading {file_path}: {e}")
        return

    search = bytes.fromhex(search_hex)
    replace = bytes.fromhex(replace_hex)

    if len(search) != len(replace):
        print(f"Error: search/replace length mismatch in {file_path}")
        return

    idx = 0
    count = 0
    while True:
        idx = data.find(search, idx)
        if idx == -1:
            break
        data[idx:idx + len(replace)] = replace
        count += 1
        idx += len(replace)  # 跳过已替换部分,避免重叠匹配

    if count > 0:
        with open(file_path, "wb") as f:
            f.write(data)
        print(f"Patched {file_path} ({count} occurrence{'s' if count > 1 else ''})")
    else:
        print(f"Pattern not found in {file_path}")


def patch_files():
    """
    修补 IDA 二进制文件中的特定字节序列。
    """
    search_hex = (
        "29f4481f796f9f66f2ff13cc4ab5b54f60845db603ba2c0bac8a9bc4b6cbdefc5c62bfc2f5ee850a"
        "c45ea97ad347e8b56dba5085af8c8aad9cc2ec626ca78a068006d658f68651da31a0a77c65a70ed7"
        "3a40d53b08edd403c095aa0bcffa52f313ebcacaaa2ce5024a4e2b9aa70fc6092f38ae094d71e43f"
        "7690b5ddd3e9e4f7"
    )
    replace_hex = (
        "a107b71c8a08ba5350934f7cf6e81be3a24dc2e35f7200d80cbd70b37ed6811dd2146d3cb7e20ad1"
        "9b2544c0ef14c5c66ffbbdf226ec3f3d544c04385303ca4a7179299340022f5d50948bcf8a60307e"
        "2c196329e51a5296dc419e40fef3ef7c6f015a09ebd979e79615338985643e666c14897f9f597e11"
        "f44341f496d56861"
    )

    target_files = [
        "ida.dll", "ida32.dll",
        "libida.so", "libida32.so",
        "libida.dylib", "libida32.dylib",
    ]

    for fname in target_files:
        if os.path.exists(fname):
            print(f"Patching {fname}...")
            patch_binary(fname, search_hex, replace_hex)
        else:
            print(f"{fname} not found, skipping.")


# ========== 主流程 ==========
def main():
    # 1. 构建许可证
    lic = build_license()

    # 2. 签名并添加 signature 字段
    lic["signature"] = sign_payload(lic["payload"])

    # 3. 写出许可证文件
    write_license(lic)

    # 4. 补丁二进制文件(如果存在)
    patch_files()


if __name__ == "__main__":
    main()

hcli

https://hcli.docs.hex-rays.com/getting-started/installation/

windows

iwr -useb https://hcli.docs.hex-rays.com/install.ps1 | iex

mac/linux

curl -LsSf https://hcli.docs.hex-rays.com/install | sh
hcli plugin install LazyIDA
hcli plugin install hrtng
hcli plugin install diaphora
hcli plugin install IDA-MCP@https://github.com/captain-ai-hub/ida-mcp

Python 编译

PREFIX=$HOME/ida-pro-9.4/ida-python
./configure \
    --prefix=${PREFIX} \
    --enable-shared \
    --enable-optimizations \
    --with-lto \
    --with-ensurepip=install \
    --with-system-ffi \
    LDFLAGS="-Wl,-rpath,${PREFIX}/lib"

make -j$(nproc)
make altinstall
./idapyswitch --force-path ${PREFIX}/lib/libpython3.12.so.1.0
选项 作用
--prefix=/opt/python3.12-ida 安装到独立目录,不进 /usr
--enable-shared 生成 libpython3.12.so.1.0(IDAPython 必需)
--enable-optimizations PGO 优化(编译慢,但运行更快;可省略以加速构建)
--with-lto 链接时优化
LDFLAGS="-Wl,-rpath,..." 把库路径写进可执行文件,避免设置 LD_LIBRARY_PATH

install.txt

fastmcp
pytest
PySide6
PyQt6-sip
Requests
rpyc
tomli
six
keystone-engine
colorama
yara-python
cdifflib
scikit-learn
numpy
joblib
pandas
starlette
uvicorn
pydantic
ida-settings


# python -m pip install ./idalib/python/idapro-0.0.7-py3-none-any.whl
# python ./idalib/python/py-activate-idalib.py

# plugins keypatch | LazyIDA | hrtng | IDA MCP | diaphora | soff

https://bbs.kanxue.com/thread-285604-1.htm

radare2

在 uv pwn 的 venv 里面

source ~/pwn/.venv/bin/active
curl -Ls https://github.com/radareorg/radare2/releases/download/6.2.0/radare2-6.2.0.tar.xz | tar xJv
uv pip install meson ninja setuptools wheel
uv pip install mcpo r2pipe
cd radare2-6.2.0 ; sys/install.sh

r2pm -U
r2pm -i r2ghidra r2dec r2frida 
r2pm -i r2api-python
r2pm -i r2mcp r2ai decai
{
  "mcpServers": {
    "radare2": {
      "command": "r2pm",
      "args": ["-r", "r2mcp"]
    }
  }
}

docker 安装

curl -fsSL https://get.docker.com | sudo sh
sudo groupadd docker
sudo usermod -aG docker $USER

rdp 启动

systemctl --user enable gnome-remote-desktop.service
systemctl --user start gnome-remote-desktop.service
systemctl --user status gnome-remote-desktop.service
grdctl rdp set-credentials           
setting->system->remote desktop on

Linux内核编译所需的库

# 核心编译工具
sudo apt install gcc make bc bison flex libssl-dev libelf-dev

# 内核配置工具
sudo apt install libncurses5-dev libncursesw5-dev

# 压缩相关库
sudo apt install zlib1g-dev liblz4-dev liblzma-dev libzstd-dev

# 其他常用库
sudo apt install dwarves rsync kmod cpio initramfs-tools-core

Busybox编译所需的库

# 基本C库开发包
sudo apt install libc6-dev

# 静态库支持(如果需要静态编译)
sudo apt install libc6-dev-i386 lib32gcc-s1 lib32stdc++6

Qemu编译所需的库

QEMU编译核心依赖

# 核心编译工具
sudo apt install -y gcc make cmake ninja-build pkg-config

# Python相关(QEMU构建系统需要)
sudo apt install -y python3 python3-pip python3-dev python3-venv

sudo apt install -y libc6-dev-i386 libglib2.0-dev libpixman-1-dev libmount-dev libunistring-dev libp11-kit-dev

# 基础库
sudo apt install zlib1g-dev libglib2.0-dev libpixman-1-dev libslirp-dev

sudo apt install -y \
    liburing-dev \
    libnfs-dev

图形和显示支持

# SDL支持(图形界面)
sudo apt install libsdl2-dev libsdl2-image-dev

# GTK支持
sudo apt install libgtk-3-dev

# VNC支持
sudo apt install libvncserver-dev

# Spice支持(高级图形)
sudo apt install libspice-server-dev libspice-protocol-dev

网络和存储支持

# 网络库
sudo apt install libcap-ng-dev libattr1-dev

# 存储格式支持
sudo apt install libaio-dev libcap-dev libiscsi-dev

# 压缩库
sudo apt install liblzo2-dev libsnappy-dev libbz2-dev liblzma-dev libzstd-dev

# 加密库
sudo apt install libgcrypt20-dev libgnutls28-dev

音频支持

sudo apt install libasound2-dev libpulse-dev

虚拟化和硬件加速

# KVM支持
sudo apt install libvirt-dev

# USB支持
sudo apt install libusb-1.0-0-dev libusbredirparser-dev

# 智能卡支持
sudo apt install libcacard-dev

可选高级功能

# 调试工具
sudo apt install valgrind

# 文档生成
sudo apt install texinfo

# 额外协议支持
sudo apt install libcurl4-gnutls-dev libssh-dev

# RDMA支持
sudo apt install librdmacm-dev libibverbs-dev

# 安全启动支持
sudo apt install libseccomp-dev

Buildroot编译需要的库

sudo apt install -y git make gcc g++ unzip patch bc libncurses5-dev \
    libssl-dev libelf-dev bison flex rsync cpio python3 python3-pip \
    file wget

交叉编译工具链安装

ARM EABI 交叉编译工具链

ARM EABI(Embedded Application Binary Interface)主要用于较老的ARM处理器:

# ARM EABI 工具链
sudo apt update
sudo apt install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
sudo apt install libc6-dev-armel-cross

ARM EABIHF 交叉编译工具链

ARM EABIHF(Hard Float)支持硬件浮点运算,适用于ARMv7架构:

# ARM EABIHF 工具链
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
sudo apt install libc6-dev-armhf-cross

AArch64 交叉编译工具链

AArch64是ARM的64位架构:

# AArch64 工具链
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo apt install libc6-dev-arm64-cross

RISC-V 交叉编译工具链

ubuntu缺乏riscv-32位相关的包,我们需要从官网进行下载编译。

# RISC-V 64位工具链
sudo apt install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
sudo apt install libc6-dev-riscv64-cross

其他工具链安装

# 需要安装这几个库,riscv32库还需手动安装
sudo apt install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi -y
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu -y
sudo apt install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu -y
sudo apt install gcc-x86-64-linux-gnu g++-x86-64-linux-gnu -y
sudo apt install gcc-i686-linux-gnu g++-i686-linux-gnu -y

# 下面的库除了mips和ppc可能会用到,其他架构我们暂且用不到。
sudo apt install gcc-mipsel-linux-gnu g++-mipsel-linux-gnu -y
sudo apt install gcc-mips64el-linux-gnuabi64 g++-mips64el-linux-gnuabi64 -y
sudo apt install gcc-mips-linux-gnu g++-mips-linux-gnu -y
sudo apt install gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 -y
sudo apt install gcc-powerpc-linux-gnu g++-powerpc-linux-gnu -y
sudo apt install gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu -y
sudo apt install gcc-alpha-linux-gnu g++-alpha-linux-gnu -y
sudo apt install gcc-s390x-linux-gnu g++-s390x-linux-gnu -y
sudo apt install gcc-sparc64-linux-gnu g++-sparc64-linux-gnu -y
sudo apt install gcc-arc-linux-gnu g++-arc-linux-gnu -y
sudo apt install gcc-m68k-linux-gnu g++-m68k-linux-gnu -y
# ...... 还有很多其他的库可以通过 apt search 查看,这里就不列举了

由于是做相关项目,我们将相关的交叉编译工具链单独放在了项目文件夹里。大家可以通过绝对路径来引用,当然你也可以将其添加到你的环境变量上。我们使用的是glibc和elf,也就是使用glibc库和裸机编译。

我们现在暂时用不到裸机编译工具链none, unknow-elf版本,所以可以不下载。

toolchains-bootlin 下面是aarch64工具链的区别对比,其他架构也大同小异。

主要区别对比

特性 aarch64-none-linux-gnu aarch64-none-elf-gnu aarch64-linux-gnu
目标环境 Linux用户空间 裸机/固件 Linux用户空间
系统调用 支持Linux系统调用 无系统调用 支持Linux系统调用
标准库 glibc newlib或无 glibc
内存管理 虚拟内存 物理内存 虚拟内存
启动方式 操作系统加载 直接启动 操作系统加载

我们学习Linux内核用到的架构只有常用的 RISCV-64,ARM64,x86_64三种64位架构。

cd ~
mkdir multi-gcc && cd multi-gcc
wget https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--glibc--stable-2025.08-1.tar.xz
wget https://toolchains.bootlin.com/downloads/releases/toolchains/armv7-eabihf/tarballs/armv7-eabihf--glibc--stable-2025.08-1.tar.xz
wget https://toolchains.bootlin.com/downloads/releases/toolchains/mips32/tarballs/mips32--glibc--stable-2025.08-1.tar.xz
wget https://toolchains.bootlin.com/downloads/releases/toolchains/mips32el/tarballs/mips32el--glibc--stable-2025.08-1.tar.xz
wget https://toolchains.bootlin.com/downloads/releases/toolchains/mips64el-n32/tarballs/mips64el-n32--glibc--stable-2025.08-1.tar.xz
wget https://toolchains.bootlin.com/downloads/releases/toolchains/mips64-n32/tarballs/mips64-n32--glibc--stable-2025.08-1.tar.xz
wget https://toolchains.bootlin.com/downloads/releases/toolchains/riscv32-ilp32d/tarballs/riscv32-ilp32d--glibc--stable-2025.08-1.tar.xz
wget https://toolchains.bootlin.com/downloads/releases/toolchains/riscv64-lp64d/tarballs/riscv64-lp64d--glibc--stable-2025.08-1.tar.xz
wget https://toolchains.bootlin.com/downloads/releases/toolchains/x86-64/tarballs/x86-64--glibc--stable-2025.08-1.tar.xz
wget https://toolchains.bootlin.com/downloads/releases/toolchains/x86-i686/tarballs/x86-i686--glibc--stable-2025.08-1.tar.xz
for f in *.tar.xz; do tar -xvJf "$f"; done
rm *.tar.xz

运行库安装命令汇总

# ============================================
# 系统基础工具与开发环境
# ============================================
sudo apt update && sudo apt install -y \
    git git-lfs curl wget net-tools openssh-server \
    unzip patch file rsync bear nmap valgrind \
    texinfo genisoimage \
    devscripts config-package-dev debhelper-compat mtd-utils \
    libpq-dev ca-certificates jq openssl p7zip-full pkg-config ripgrep xz-utils socat

sudo apt install build-essential autoconf automake libtool pkg-config meson ninja-build -y
sudo apt install gdb gdb-multiarch -y
sudo apt install build-essential uuid-dev iasl git nasm python3 ovmf -y
sudo apt install uml-utilities -y
sudo apt install ruby-dev -y
gem install seccomp-tools
# ============================================
# 核心编译工具链
# ============================================
sudo apt install -y \
    build-essential gcc g++ clang make cmake ninja-build pkg-config \
    bc bison flex dwarves kmod cpio initramfs-tools-core \
    patchelf musl-tools

# ============================================
# Python 环境与 Tk 扩展
# ============================================
sudo apt install -y \
    python3 python3-pip python3-dev python3-venv \
    python3-tk tk-dev

# ============================================
# 基础开发库(压缩、加密、网络、系统等)
# ============================================
sudo apt install -y \
    libc6-dev libc6-dev-i386 \
    libssl-dev libelf-dev libdw-dev libz-dev \
    zlib1g-dev libbz2-dev liblz4-dev liblzma-dev libzstd-dev \
    libgcrypt20-dev libgnutls28-dev \
    libcurl4-gnutls-dev libssh-dev \
    libcap-ng-dev libattr1-dev \
    libaio-dev libcap-dev libiscsi-dev \
    liblzo2-dev libsnappy-dev \
    libmount-dev libunistring-dev libp11-kit-dev \
    libsqlite3-dev libreadline-dev libffi-dev \
    libglib2.0-dev libgirepository-2.0-dev \
    libpixman-1-dev libslirp-dev \
    libfuse-dev liburing-dev libnfs-dev libcrypt-dev \
    libbpf-dev libseccomp-dev \
    librdmacm-dev libibverbs-dev \
    libxcb-cursor0 libkeyutils-dev libcapstone-dev libcapstone5 \
    libmagic-dev libuv1-dev zipcmp ziptool libzip-dev zipmerge

# ============================================
# 终端与用户界面库 (ncurses 等)
# ============================================
sudo apt install -y libncurses-dev libtinfo-dev
# 若某些旧软件需要 version 5 的 so 文件,可创建符号链接(通常不需要)
# sudo ln -sf /usr/lib/x86_64-linux-gnu/libncurses.so.6 /usr/lib/x86_64-linux-gnu/libncurses.so.5
# sudo ln -sf /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5

# ============================================
# 图形与界面支持 (QEMU GUI/Spice/VNC/SDL/GTK/OpenGL)
# ============================================
sudo apt install -y \
    libsdl2-dev libsdl2-image-dev \
    libgtk-3-dev libvte-2.91-dev \
    libvncserver-dev \
    libspice-server-dev libspice-protocol-dev \
    libvirglrenderer-dev libepoxy-dev libgbm-dev

# ============================================
# 多媒体与音频
# ============================================
# jackd2 配置时若提示是否启用实时调度,选“No”以避免配置复杂性
sudo apt install -y \
    libasound2-dev libpulse-dev \
    jackd2 libjack-jackd2-dev libpipewire-0.3-dev pipewire-jack

# ============================================
# WebKit 相关(某些 UI 组件可能需要)
# ============================================
sudo apt install -y \
    libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libwebkit2gtk-4.1-dev

# ============================================
# 虚拟化与设备支持 (KVM/USB/智能卡/网络/VDE)
# ============================================
sudo apt install -y \
    libvirt-dev \
    libusb-1.0-0-dev libusbredirparser-dev \
    libcacard-dev \
    libvdeplug-dev

# ============================================
# 内核/模块编译支持
# ============================================
sudo apt install -y \
    linux-headers-generic linux-libc-dev

# ============================================
# Android 平台工具 (可选)
# ============================================
sudo apt install -y google-android-platform-tools-installer

# ============================================
# 磁盘/文件系统工具 (可选)
# ============================================
sudo apt install -y libguestfs-tools

# ============================================
# 交叉编译工具 (按需选择)
# ============================================
sudo apt install -y \
    gcc-arm-linux-gnueabi g++-arm-linux-gnueabi \
    gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf \
    gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
    gcc-riscv64-linux-gnu g++-riscv64-linux-gnu \
    gcc-x86-64-linux-gnu g++-x86-64-linux-gnu \
    gcc-i686-linux-gnu g++-i686-linux-gnu \
    gcc-mipsel-linux-gnu g++-mipsel-linux-gnu \
    gcc-mips64el-linux-gnuabi64 g++-mips64el-linux-gnuabi64 \
    gcc-mips-linux-gnu g++-mips-linux-gnu \
    gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 \
    gcc-powerpc-linux-gnu g++-powerpc-linux-gnu \
    gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu \
    gcc-alpha-linux-gnu g++-alpha-linux-gnu \
    gcc-s390x-linux-gnu g++-s390x-linux-gnu \
    gcc-sparc64-linux-gnu g++-sparc64-linux-gnu \
    gcc-arc-linux-gnu g++-arc-linux-gnu \
    gcc-m68k-linux-gnu g++-m68k-linux-gnu

# ============================================
# 最终更新与清理
# ============================================
sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove --purge -y

VMware install (debian/ubuntu)

Ubuntu Secure Boot 下修复 VMware vmmon / vmnet 加载失败

问题现象

执行 VMware 内核模块安装:

sudo vmware-modconfig --console --install-all

出现:

Starting VMware services:
   Virtual machine monitor                    failed
   Virtual machine communication interface   done
   VM communication interface socket family  done
   Virtual ethernet                           failed
   VMware Authentication Daemon              done
Unable to start services

手动加载模块时出现:

sudo modprobe vmmon
sudo modprobe vmnet
modprobe: ERROR: could not insert 'vmmon': Key was rejected by service
modprobe: ERROR: could not insert 'vmnet': Key was rejected by service

原因

本机环境为:

  • Ubuntu 26.04 LTS
  • Linux 内核 7.0.0-29-generic
  • VMware Workstation 26.0.0
  • UEFI Secure Boot 已开启
  • Kernel Lockdown 处于 integrity 模式

VMware 的两个内核模块已经成功编译和安装:

/lib/modules/7.0.0-29-generic/misc/vmmon.ko
/lib/modules/7.0.0-29-generic/misc/vmnet.ko

但 Secure Boot 不允许内核加载未被受信任密钥签名的第三方模块。因此会导致:

  • vmmon 无法加载,虚拟机监控器启动失败;
  • vmnet 无法加载,VMware 虚拟网络启动失败。

下面通过创建 Machine Owner Key(MOK)、签名模块并注册证书解决问题,同时保留 Secure Boot。

一、生成 Secure Boot 签名密钥

执行:

sudo update-secureboot-policy --new-key

生成的文件通常位于:

/var/lib/shim-signed/mok/MOK.priv
/var/lib/shim-signed/mok/MOK.der

其中:

  • MOK.priv 是私钥,必须妥善保管;
  • MOK.der 是需要注册到 MOK 的公开证书。

如果生成过程中看到:

Can't load /var/lib/shim-signed/mok/.rnd into RNG

但随后仍继续输出密钥生成进度并正常结束,通常只是 OpenSSL 无法读取旧的 .rnd 文件,并不表示密钥生成失败。

可以检查证书是否存在:

ls -l /var/lib/shim-signed/mok/MOK.der

私钥通常只有 root 可以读取,检查时需要:

sudo ls -l /var/lib/shim-signed/mok/MOK.priv

二、签名 VMware 内核模块

签名 vmmon:

sudo kmodsign sha256 \
  /var/lib/shim-signed/mok/MOK.priv \
  /var/lib/shim-signed/mok/MOK.der \
  "$(modinfo -n vmmon)"

签名 vmnet:

sudo kmodsign sha256 \
  /var/lib/shim-signed/mok/MOK.priv \
  /var/lib/shim-signed/mok/MOK.der \
  "$(modinfo -n vmnet)"

命令没有输出且正常返回,一般表示签名成功。

验证签名

modinfo -F signer vmmon
modinfo -F signer vmnet

如果已签名,应显示证书名称,例如:

ub-ASUS-TUF-Gaming-A15-FA506QM- Secure Boot Module Signature key

还可以检查签名格式及算法:

modinfo -F sig_id vmmon
modinfo -F sig_hashalgo vmmon
modinfo -F sig_id vmnet
modinfo -F sig_hashalgo vmnet

预期类似:

PKCS#7
sha256

注意:如果再次运行 vmware-modconfig --console --install-all,VMware 可能重新编译并覆盖模块。被覆盖后的新模块需要重新签名。

三、提交 MOK 注册请求

直接导入公开证书:

sudo mokutil --import /var/lib/shim-signed/mok/MOK.der

命令会要求输入两次临时密码:

input password:
input password again:

注意事项:

  • 输入密码时终端不会显示任何字符,这是正常现象;
  • 该密码只用于下次启动时确认 MOK 注册;
  • 建议使用容易输入的英文字母和数字,因为 MOK Manager 可能采用美式键盘布局。

关于 update-secureboot-policy --enroll-key

如果执行:

sudo update-secureboot-policy --enroll-key

却显示:

No DKMS modules installed.

这不表示模块签名失败。VMware 的模块不一定由 DKMS 管理,因此这里应使用前面的 mokutil --import 直接提交证书。

检查注册状态

注册前执行:

mokutil --test-key /var/lib/shim-signed/mok/MOK.der

可能显示:

/var/lib/shim-signed/mok/MOK.der is not enrolled

这是正常的,因为还没有在重启后的 MOK Manager 中确认注册。

通常可用以下命令查看待处理证书:

mokutil --list-new

某些版本的 mokutil 可能不显示任何内容。只要导入命令没有报错,并且 EFI 中出现 MokNew 和 MokAuth 变量,注册请求就已经提交:

find /sys/firmware/efi/efivars -maxdepth 1 -type f -printf '%f\n' \
  | grep -E '^Mok(New|Auth)'

可能看到:

MokAuth-605dab50-e046-4300-abb6-3dd810dd8b23
MokNew-605dab50-e046-4300-abb6-3dd810dd8b23

此时在重启完成注册之前运行 modprobe,仍然会出现:

Key was rejected by service

这是预期现象:模块已有签名,但内核暂时还不信任对应证书。

四、重启并在 MOK Manager 中注册证书

执行:

sudo reboot

重新启动时应出现蓝色的 MOK Manager 界面。依次选择:

  1. Enroll MOK
  2. Continue
  3. Yes
  4. 输入执行 mokutil --import 时设置的临时密码
  5. Reboot

不要直接选择 Continue boot 跳过注册,否则模块仍会被 Secure Boot 拒绝。

输入密码时需要注意:

  • 屏幕可能不会显示输入字符;
  • 键盘布局可能是美式布局;
  • 输入的是 mokutil --import 时设置的临时密码,不是 Linux 用户密码。

五、进入 Ubuntu 后验证

1. 确认证书已注册

mokutil --test-key /var/lib/shim-signed/mok/MOK.der

成功后应显示类似:

/var/lib/shim-signed/mok/MOK.der is already enrolled

也可以检查已注册证书:

mokutil --list-enrolled

2. 加载 VMware 模块

sudo modprobe vmmon
sudo modprobe vmnet

如果没有任何输出,通常表示加载成功。

3. 确认模块已加载

lsmod | grep -E '^(vmmon|vmnet)\b'

应能看到 vmmon 和 vmnet。

确认 VMware 监控设备存在:

ls -l /dev/vmmon

4. 重启 VMware 服务

优先尝试:

sudo systemctl restart vmware.service

查看状态:

systemctl --no-pager --full status vmware.service

如果系统没有对应的 systemd 服务单元,可以使用:

sudo /etc/init.d/vmware restart

然后启动 VMware Workstation 进行测试。

六、如果重启时没有出现 MOK Manager

先重新进入 Ubuntu,然后撤销旧的待处理请求并重新导入:

sudo mokutil --revoke-import
sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
sudo reboot

重启时再次寻找 Enroll MOK 页面并完成注册。

如果仍未出现,可以检查:

mokutil --sb-state
mokutil --list-new
find /sys/firmware/efi/efivars -maxdepth 1 -type f -printf '%f\n' \
  | grep -E '^Mok(New|Auth)'

七、如果注册后仍提示 Key was rejected by service

依次检查:

mokutil --test-key /var/lib/shim-signed/mok/MOK.der
modinfo -F signer vmmon
modinfo -F signer vmnet
uname -r
modinfo -n vmmon
modinfo -n vmnet

然后查看内核日志:

sudo journalctl -b -k --no-pager \
  | grep -Ei 'vmmon|vmnet|secure boot|lockdown|verification|key'

常见原因包括:

  1. 在 MOK Manager 中跳过或取消了注册;
  2. 注册时密码输入错误;
  3. VMware 或内核升级后重新生成了模块,但新模块尚未签名;
  4. 当前加载的模块不是刚才签名的文件;
  5. 启动了不同的内核版本,需要为该内核重新构建并签名模块。

九、以后升级内核或 VMware 后

内核或 VMware Workstation 升级后,vmmon 和 vmnet 可能被重新编译。MOK 证书通常只需注册一次,但新生成的模块仍需使用同一密钥重新签名。

重新编译并签名:

sudo vmware-modconfig --console --install-all

sudo kmodsign sha256 \
  /var/lib/shim-signed/mok/MOK.priv \
  /var/lib/shim-signed/mok/MOK.der \
  "$(modinfo -n vmmon)"

sudo kmodsign sha256 \
  /var/lib/shim-signed/mok/MOK.priv \
  /var/lib/shim-signed/mok/MOK.der \
  "$(modinfo -n vmnet)"

sudo modprobe vmmon
sudo modprobe vmnet

如果模块已经被加载,升级后可能需要重启系统,再加载新模块。

十、替代方案

也可以进入 UEFI/BIOS 设置关闭 Secure Boot。关闭后,无需注册 MOK 即可加载未签名的 VMware 模块。

不过更推荐保留 Secure Boot,并按照本文方式签名和注册模块。

完整命令摘要

首次处理:

sudo update-secureboot-policy --new-key

sudo kmodsign sha256 \
  /var/lib/shim-signed/mok/MOK.priv \
  /var/lib/shim-signed/mok/MOK.der \
  "$(modinfo -n vmmon)"

sudo kmodsign sha256 \
  /var/lib/shim-signed/mok/MOK.priv \
  /var/lib/shim-signed/mok/MOK.der \
  "$(modinfo -n vmnet)"

sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
sudo reboot

在 MOK Manager 中完成 Enroll MOK 后,进入系统执行:

mokutil --test-key /var/lib/shim-signed/mok/MOK.der
sudo modprobe vmmon
sudo modprobe vmnet
lsmod | grep -E '^(vmmon|vmnet)\b'
sudo systemctl restart vmware.service

VM to Host

一:在 Ubuntu 中安装 open-vm-tools

sh sudo apt update sudo apt install -y open-vm-tools open-vm-tools-desktop sudo reboot

二:在 VMware 中配置共享文件夹

在 VMware Workstation / Fusion 中:

  1. 关闭虚拟机(或挂起)
  2. 虚拟机 → 设置 → 选项 → 共享文件夹
  3. 选择 "总是启用" (Always enabled)
  4. 点击 "添加",选择宿主机要共享的文件夹,起个名字(如 share)
  5. 勾选 "启用此共享"
  6. 启动虚拟机

三:在 Ubuntu 中挂载

sudo mkdir -p /mnt/hgfs      
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other -o uid=1000 -o gid=1000
sudo vim /etc/fstab
# 添加
.host:/  /mnt/hgfs  fuse.vmhgfs-fuse  allow_other,defaults,uid=1000,gid=1000  0  0

➜  ~ ls /mnt/hgfs 
D  E G
➜  ~ 

编译步骤提示

Linux内核编译:

Linux内核下载:

wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.15.188.tar.gz
tar -xvf linux-5.15.188.tar.gz
wget https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.12.38.tar.gz
tar -xvf linux-6.12.38.tar.gz
# 配置内核
make menuconfig  # 或 make defconfig

# 编译
make bzImage -j$(nproc)

# 安装模块 (可选)
sudo make modules_install

# 安装内核 (可选)
sudo make install

清华源

  1. make menuconfig

这里我们主要关注调试方面的选项,依次进入到 Kernel hacking -> Compile-time checks and compiler options,然后勾选如下选项Compile the kernel with debug info,以便于调试。不过似乎现在是默认开启的。如果要使用 kgdb 调试内核,则需要选中 KGDB: kernel debugger,并选中 KGDB 下的所有选项。

报错处理:

【1】

问题概述:

make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.

解决方法:

编辑 .config 文件,搜索debian/canonical-certs.pem并把这个字符串删掉。

删除前:

  • CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"

删除后

  • CONFIG_SYSTEM_TRUSTED_KEYS=""

类似问题也是同样的解决方案。

【2】

问题概述:

make[2]: *** No rule to make target 'net/netfilter/xt_TCPMSS.o', needed by 'net/netfilter/built-in.a'. Stop.

解决方法:

Makefile 中的 xt_TCPMSS.c 是大写的,而源文件名 (xt_tcpmss.c) 是小写的。这是一个大小写不匹配的问题。

【3】

/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here collect2: error: ld returned 1 exit status make[2]: *** [scripts/Makefile.host:100: scripts/dtc/dtc] Error 1 make[1]: *** [scripts/Makefile.build:403: scripts/dtc] Error 2 make: *** [Makefile:555: scripts] Error 2

修改scripts/dtc目录下的dtc-lexer.lex.c_shipped文件中找到 YYLTYPE yyloc这一行,在640行,在之前面加上extern 保存退出, make 编译 正常编译

验证源文件名

你可以先检查一下实际的源文件名:

bash ls net/netfilter/xt_*tcpmss*

这应该会显示实际的文件名是 xt_tcpmss.c(小写)。

1. 找到并编辑 Makefile

bash vim net/netfilter/Makefile

2. 找到第157行左右的内容

寻找类似这样的行:

makefile obj-$(CONFIG_NETFILTER_XT_TARGET_TCPMSS) += xt_TCPMSS.o

3. 将大写的 TCPMSS 改为小写的 tcpmss

修改为:

makefile obj-$(CONFIG_NETFILTER_XT_TARGET_TCPMSS) += xt_tcpmss.o

4. 保存并重新编译

bash make bzImage -j$(nproc)

  1. make bzImage -j4

注意事项:

注意 gcc 版本问题,4.*一般用 gcc-5,5.*一般用 gcc-7。

gcc多版本共存请参考这里

  1. 编译成功后

我们一般主要关注于如下的文件

RISC-V64

  • 镜像名: Image
  • 路径: arch/riscv/boot/Image
  • 说明: 与ARM64一样,RISC-V也使用未压缩的Image格式

x86_64

  • 镜像名: bzImage
  • 路径: arch/x86/boot/bzImage
  • 说明: "big zImage"的缩写,实际上是压缩的内核镜像

ARM64

  • 镜像名: Image
  • 路径: arch/arm64/boot/Image
  • 说明: 未压缩的内核镜像

MIPS

  • 镜像名: vmlinux.bin 或 vmlinux
  • 路径: arch/mips/boot/vmlinux.bin
  • 说明: MIPS架构通常使用vmlinux.bin,某些情况下也会有压缩版本

PowerPC

  • 镜像名: zImage 或 uImage
  • 路径: arch/powerpc/boot/zImage
  • 说明: PowerPC使用zImage(压缩镜像)或uImage(U-Boot格式)

ARM32

  • 镜像名: zImage 或 uImage
  • 路径: arch/arm/boot/zImage
  • 说明: 32位ARM使用压缩的zImage格式

SPARC

  • 镜像名: zImage 或 vmlinux
  • 路径: arch/sparc/boot/zImage

Alpha

  • 镜像名: vmlinux
  • 路径: vmlinux

查看所有可用的镜像目标

你可以通过以下命令查看特定架构支持的所有镜像格式:

# 查看当前架构支持的镜像目标
make help | grep -A 10 "Architecture specific targets"

# 或者查看make的所有目标
make help

镜像格式说明

  • Image: 未压缩的内核镜像,主要用于ARM64和RISC-V
  • zImage: 压缩的内核镜像,自解压,常用于ARM32、PowerPC等
  • bzImage: "big zImage",x86架构的压缩内核镜像
  • uImage: U-Boot格式的内核镜像,包含加载地址等信息
  • vmlinux: 未压缩的ELF格式内核镜像,主要用于调试

实际编译示例

对于不同架构,你可以明确指定要编译的镜像类型:

# RISC-V
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -j$(nproc) menuconfig
scripts/config -e BLK_DEV_INITRD
scripts/config -e DEVTMPFS
scripts/config -e DEVTMPFS_MOUNT
scripts/config -e TMPFS
scripts/config -e SYSFS
scripts/config -e PROC_FS
scripts/config -e VIRTIO
scripts/config -e VIRTIO_MMIO
scripts/config -e NET
scripts/config -e VIRTIO_NET
scripts/config -e VIRTIO_CONSOLE
scripts/config -e VIRTIO_BLK
scripts/config -e SERIAL_8250
scripts/config -e SERIAL_8250_CONSOLE
scripts/config -d VIRTIO_MMIO_CMDLINE_DEVICES
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -j$(nproc) Image

# x86_64
make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- -j$(nproc) menuconfig
make ARCH=x86_64 CROSS_COMPILE=x86_64-linux-gnu- -j$(nproc) bzImage

# ARM64
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) menuconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) olddefconfig
scripts/config -e BLK_DEV_INITRD
scripts/config -e RD_GZIP
scripts/config -e DEVTMPFS
scripts/config -e DEVTMPFS_MOUNT
scripts/config -e TMPFS
scripts/config -e SYSFS
scripts/config -e PROC_FS
scripts/config -e SERIAL_AMBA_PL011
scripts/config -e SERIAL_AMBA_PL011_CONSOLE
scripts/config -e VIRTIO
scripts/config -e VIRTIO_MMIO
scripts/config -e VIRTIO_MMIO_CMDLINE_DEVICES
scripts/config -e NET
scripts/config -e VIRTIO_NET
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image dtbs

# ARM
make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- -j$(nproc) vexpress_defconfig
scripts/config -e BLK_DEV_INITRD -e DEVTMPFS -e DEVTMPFS_MOUNT -e TMPFS -e SERIAL_AMBA_PL011 -e ARM_APPENDED_DTB -e USE_OF -e ARM_ATAG_DTB_COMPAT -e ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER -e SMP -e ARM_GIC -e CACHE_L2X0 -e AMBA -e ARM_TIMER_SP804
make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- -j$(nproc) menuconfig
make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- -j$(nproc) zImage dtbs

# MIPS
make ARCH=mips CROSS_COMPILE=mips-linux-gnu- menuconfig
make ARCH=mips CROSS_COMPILE=mips-linux-gnu- vmlinux.bin

Busybox编译:

Busybox下载:

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -jxvf busybox-1.36.1.tar.bz2
# 配置busybox 
➜  busybox-1.36.1 mkdir -p ./build/x86_64

# 选择 Settings -> Build Options -> Build static binary
# 然后配置安装目录
➜  busybox-1.36.1 make menuconfig  

# 编译
➜  busybox-1.36.1 make -j$(nproc)

# 安装
➜  busybox-1.36.1 make install

image-20250716170229338

如果你的内核版本大于6.8.0编译可能会报错:https://lists.busybox.net/pipermail/busybox-cvs/2024-January/041752.html

只需要把tc.c移除或者禁用即可。

```bash make menuconfig

然后在菜单中:

Networking Utilities -> tc (traffic control utility) [取消选择]

```

或者使用 patch。

交叉编译只需要修改Cross complier prefix的值即可,比如aarch64-linux-gnu-。

Qemu 编译:

QEMU编译步骤

wget https://download.qemu.org/qemu-11.0.3.tar.xz
tar -xvf qemu-11.0.3.tar.xz
# 下载QEMU源码后
cd qemu-11.0.3

# 配置编译选项
./configure --enable-kvm --enable-gtk --enable-spice --enable-usb-redir --enable-slirp --disable-werror

# 编译(使用多核心加速)
make -j$(nproc)

# 安装
sudo make install

注意事项

  • 不同版本的QEMU可能对依赖库的要求略有不同
  • 可以通过 ./configure --help 查看具体的编译选项
  • 如果只需要特定架构支持,可以使用 --target-list 参数减少编译时间
  • 某些功能需要相应的内核模块支持(如KVM需要加载kvm模块)

这些库足以支持QEMU的完整功能编译,包括各种虚拟化特性、图形界面、网络和存储支持等。

Buildroot 编译:

wget https://buildroot.org/downloads/buildroot-2025.02.4.tar.gz
tar -xvf buildroot-2025.02.4.tar.gz

ARM64 Linux编译

  1. 查看可用的ARM64相关配置
➜  buildroot-2025.02.4 make list-defconfigs | grep aarch64
make: Warning: File '/mnt/d/DM/linux_kernel_research/buildroot-2025.02.4/output/.br2-external.mk' has modification time 0.47 s in the future
  aarch64_efi_defconfig               - Build for aarch64_efi
  qemu_aarch64_ebbr_defconfig         - Build for qemu_aarch64_ebbr
  qemu_aarch64_sbsa_defconfig         - Build for qemu_aarch64_sbsa
  qemu_aarch64_virt_defconfig         - Build for qemu_aarch64_virt
make: warning:  Clock skew detected.  Your build may be incomplete.
  1. 使用QEMU ARM64配置作为基础
➜  buildroot-2025.02.4 make qemu_aarch64_virt_defconfig
  1. 运行配置界面进行定制
➜  buildroot-2025.02.4 make menuconfig
# 根据需要定制即可
kernel->
# 编译Linux kernel 5.15.185 6.12.33 两个版本。
filesystem->
# 打开cpio支持
  1. make 即可,输出目录在output/images/

错误处理:

【1】

报错:

➜ buildroot-2025.02.4 make -j$(nproc) ERROR: No hash found for linux-5.15.18.tar.xz make: *** [package/pkg-generic.mk:179: /mnt/d/DM/linux_kernel_research/buildroot-2025.02.4/output/build/linux-headers-5.15.18/.stamp_downloaded] Error 1

成因:

没有对应sha256值用来校验。

解决方案:

第一种方法:添加对应值上去。

第二种方法:使用官方有的版本。

```bash ➜ buildroot-2025.02.4 cat ./linux/linux.hash

From https://www.kernel.org/pub/linux/kernel/v6.x/sha256sums.asc

sha256 c0a575630f2603a20bb0641f8df8f955e46c9d7ac1fae8b54b21316e6b52a254 linux-6.12.33.tar.xz sha256 0d79ff359635e9f009f1e330deed5f3aefd8c452b80660bffdc504b877797719 linux-6.6.93.tar.xz sha256 bc3c45faf6f5f0450666c75fa9dad9bc7c0cf7c7cba0dbd94e5cfdc58229c116 linux-6.1.141.tar.xz

From https://www.kernel.org/pub/linux/kernel/v5.x/sha256sums.asc

sha256 3d03eb798910f32929f7fda5a56e4bb1a121f10bde320d6f3063639c009313dc linux-5.15.185.tar.xz sha256 07c852940dc2dc03fe84f7fcf697648d7cba11c62d20504380492ba07aa46bb6 linux-5.10.238.tar.xz sha256 c879d0ba817aaa0fde318d58d7e1f141d9c29bd8569a96b73159ebc448077b99 linux-5.4.294.tar.xz

Locally computed

sha256 fb0edc3c18e47d2b6974cb0880a0afb5c3fa08f50ee87dfdf24349405ea5f8ae linux-cip-5.10.162-cip24.tar.gz sha256 b5539243f187e3d478d76d44ae13aab83952c94b885ad889df6fa9997e16a441 linux-cip-5.10.162-cip24-rt10.tar.gz

Licenses hashes

sha256 fb5a425bd3b3cd6071a3a9aff9909a859e7c1158d54d32e07658398cd67eb6a0 COPYING sha256 f6b78c087c3ebdf0f3c13415070dd480a3f35d8fc76f3d02180a407c1c812f79 LICENSES/preferred/GPL-2.0 sha256 8e378ab93586eb55135d3bc119cce787f7324f48394777d00c34fa3d0be3303f LICENSES/exceptions/Linux-syscall-note ```

Qemu 调试 Linux Kernel

我们使用 Linux 上的 Qemu。如果你使用 Windwos 的 Qemu 注意修改启动参数。

x86_64

  1. 首先在busybox文件夹创建一些系统文件:
mkdir -p lib tmp proc sys dev etc/init.d
  1. (可选)然后编写一个内核模块(感兴趣看内核开发部分,或者可以从Pwn_kernel的内核模块开发部分简单了解),将其放在/lib/目录中。

  2. 编写一个init脚本,放在根目录即可。

#!/bin/sh
echo "INIT SCRIPT"
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmp
# insmod /lib/ko_test.ko # 可选
echo -e "Boot took $(cut -d' ' -f1 /proc/uptime) seconds"
setsid /bin/cttyhack setuidgid 0 /bin/sh # 0 代表 root权限, 普权限设置为1000
poweroff -f
  1. 打包文件系统:
find . | cpio -o -H newc > ../rootfs.cpio
  1. 将编译好的/kernel/arch/x86/boot/bzImage复制到 rootfs.img 同级目录。之后便可以启动Qemu。

Linux启动脚本:

#!/usr/bin/env bash
set -euo pipefail

cd "$(dirname "$0")"

extra_args=()
if [[ "${1:-}" == "--gdb" ]]; then
    extra_args=(-S -gdb tcp:127.0.0.1:1234)
fi

qemu-system-x86_64 \
    -m 256M \
    -no-reboot \
    -display none \
    -serial mon:stdio \
    -kernel ./bzImage \
    -initrd ./rootfs_x86_64.cpio \
    -append "rdinit=/init.sh rw console=ttyS0 oops=panic panic=1" \
    -smp 2 \
    -cpu qemu64 \
    "${extra_args[@]}"

windwos pwsh 启动脚本。

qemu-system-x86_64.exe `
    -m 64M `
    -nographic `
    -kernel .\bzImage `
    -initrd .\rootfs.cpio `
    -append "init=/init root=/dev/ram rw console=ttyS0 oops=panic panic=1 kaslr" `
    -smp cores=2,threads=2 `
    -cpu kvm64 `
    -s # 开启gdb调试,默认1234端口,用于调试内核

可以使用-append "init=/init"参数指定启动脚本,不指定则默认使用根目录下的init。我们这里养成良好习惯显示指定init脚本。

如果要调试用户态程序可以使用qemu的端口转发功能。假如我们在qemu内使用gdbserver监听了1337端口。

qemu-system-x86_64 \
  -netdev user,id=net0,hostfwd=tcp::10001-:1337 \
  -device virtio-net-pci,netdev=net0

这样我们可以从宿主机10001端口访问qemu内部的1337调试端口。

基本命令格式

bash qemu-system-x86_64 \ -netdev user,id=<网络标识>,hostfwd=<协议>:<宿主机IP>:<宿主机端口>-<虚拟机IP>:<虚拟机端口> \ -device <网卡驱动>,netdev=<网络标识>

关键参数说明

  1. -netdev user 启用用户模式网络栈(无需 root 权限),支持端口转发。

  2. id=<网络标识> 自定义网络设备标识(如 net0),用于关联后续 -device。

  3. hostfwd=<规则>

端口转发规则,格式:

协议:宿主机IP:宿主机端口-虚拟机IP:虚拟机端口

  • 协议:tcp 或 udp
  • IP 省略时默认绑定 0.0.0.0(any)
  1. -device <网卡驱动> 指定虚拟网卡类型(如 virtio-net-pci)。

调试工具

multiarch-gdbserver-static:调试内部程序用的静态编译的gdbserver。

image-20250717185418550

ARM64

Linux 启动脚本:

qemu-system-aarch64 \
    -M virt \
    -cpu cortex-a53 \
    -m 512 \
    -nographic \
    -kernel ./Image \
    -initrd ./rootfs.cpio \
    -append "console=ttyAMA0 rdinit=/init quiet" \
    -s

RISC-V64

Linux 启动脚本

qemu-system-riscv64 \
    -machine virt \
    -cpu rv64 \
    -m 512 \
    -nographic \
    -kernel ./Image \
    -initrd ./rootfs.cpio \
    -append "console=ttyS0 rdinit=/init quiet" \
    -s