Linux内核分析之前置知识-00
This language version is unavailable; showing the other language.
前言
推荐学习顺序:
基础知识 → 进程管理 → 内存管理 → 进程间通信 → 文件系统 → 设备驱动 → 网络协议栈 → 虚拟化 → 安全模块。
环境搭建
交叉编译工具链下载 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,其他的按需选择。

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

安装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,编辑:

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

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

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 "============================================"
curl -fsSL https://github.com/SaladDay/cc-switch-cli/releases/latest/download/install.sh | bash
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 界面。依次选择:
- Enroll MOK
- Continue
- Yes
- 输入执行
mokutil --import时设置的临时密码 - 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'
常见原因包括:
- 在 MOK Manager 中跳过或取消了注册;
- 注册时密码输入错误;
- VMware 或内核升级后重新生成了模块,但新模块尚未签名;
- 当前加载的模块不是刚才签名的文件;
- 启动了不同的内核版本,需要为该内核重新构建并签名模块。
九、以后升级内核或 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 中:
- 关闭虚拟机(或挂起)
- 虚拟机 → 设置 → 选项 → 共享文件夹
- 选择 "总是启用" (Always enabled)
- 点击 "添加",选择宿主机要共享的文件夹,起个名字(如
share) - 勾选 "启用此共享"
- 启动虚拟机
三:在 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
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/Makefile2. 找到第157行左右的内容
寻找类似这样的行:
makefile obj-$(CONFIG_NETFILTER_XT_TARGET_TCPMSS) += xt_TCPMSS.o3. 将大写的 TCPMSS 改为小写的 tcpmss
修改为:
makefile obj-$(CONFIG_NETFILTER_XT_TARGET_TCPMSS) += xt_tcpmss.o4. 保存并重新编译
bash make bzImage -j$(nproc)
make bzImage -j4
注意事项:
注意 gcc 版本问题,
4.*一般用gcc-5,5.*一般用gcc-7。gcc多版本共存请参考这里
- 编译成功后
我们一般主要关注于如下的文件
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

如果你的内核版本大于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编译
- 查看可用的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.
- 使用QEMU ARM64配置作为基础
➜ buildroot-2025.02.4 make qemu_aarch64_virt_defconfig
- 运行配置界面进行定制
➜ buildroot-2025.02.4 make menuconfig
# 根据需要定制即可
kernel->
# 编译Linux kernel 5.15.185 6.12.33 两个版本。
filesystem->
# 打开cpio支持
- 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
- 首先在busybox文件夹创建一些系统文件:
mkdir -p lib tmp proc sys dev etc/init.d
-
(可选)然后编写一个内核模块(感兴趣看内核开发部分,或者可以从
Pwn_kernel的内核模块开发部分简单了解),将其放在/lib/目录中。 -
编写一个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
- 打包文件系统:
find . | cpio -o -H newc > ../rootfs.cpio
- 将编译好的
/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=<网络标识>关键参数说明
-netdev user启用用户模式网络栈(无需 root 权限),支持端口转发。
id=<网络标识>自定义网络设备标识(如net0),用于关联后续-device。
hostfwd=<规则>端口转发规则,格式:
协议:宿主机IP:宿主机端口-虚拟机IP:虚拟机端口
- 协议:
tcp或udp- IP 省略时默认绑定
0.0.0.0(any)
-device <网卡驱动>指定虚拟网卡类型(如virtio-net-pci)。调试工具
multiarch-gdbserver-static:调试内部程序用的静态编译的
gdbserver。

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