vphone600 Kernel Symbol Analysis
Lakr233/vphone-cli
Looks up symbols and addresses in vphone600 release and research kernel datasets, and cross-references XNU source, with findings that separate fact from inference.
虚拟化逆向:VT-x/SVM、hypervisor 检测、VMCS/EPT 分析, 以及 Xen / QNX Hypervisor / Jailhouse / ACRN / Bao / Hyper-V·VMBus / XtratuM / LynxSecure / Quest-V 的分区与 vdev 语义。
$ npx skills add dslsdzc/rev-skills --skill re-hypervisor -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dslsdzc/rev-skills re-hypervisor --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/dslsdzc/rev-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/re-hypervisor .claude/skills/re-hypervisor && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "re-hypervisor" agent skill from https://github.com/dslsdzc/rev-skills/tree/main/.claude/skills/re-hypervisor into .claude/skills/re-hypervisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "re-hypervisor", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/dslsdzc/rev-skills/tree/main/.claude/skills/re-hypervisorType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add dslsdzc/rev-skills --skill re-hypervisor -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dslsdzc/rev-skills re-hypervisor --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dslsdzc/rev-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/re-hypervisor .agents/skills/re-hypervisor && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "re-hypervisor" agent skill from https://github.com/dslsdzc/rev-skills/tree/main/.claude/skills/re-hypervisor into .agents/skills/re-hypervisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "re-hypervisor", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dslsdzc/rev-skills --skill re-hypervisor -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dslsdzc/rev-skills re-hypervisor --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dslsdzc/rev-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/re-hypervisor .cursor/skills/re-hypervisor && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "re-hypervisor" agent skill from https://github.com/dslsdzc/rev-skills/tree/main/.claude/skills/re-hypervisor into .cursor/skills/re-hypervisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "re-hypervisor", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/dslsdzc/rev-skills.git --path .claude/skills/re-hypervisor--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add dslsdzc/rev-skills --skill re-hypervisor -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dslsdzc/rev-skills re-hypervisor --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dslsdzc/rev-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/re-hypervisor .gemini/skills/re-hypervisor && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "re-hypervisor" agent skill from https://github.com/dslsdzc/rev-skills/tree/main/.claude/skills/re-hypervisor into .gemini/skills/re-hypervisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "re-hypervisor", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install dslsdzc/rev-skills re-hypervisorInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add dslsdzc/rev-skills --skill re-hypervisor -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dslsdzc/rev-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/re-hypervisor .github/skills/re-hypervisor && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "re-hypervisor" agent skill from https://github.com/dslsdzc/rev-skills/tree/main/.claude/skills/re-hypervisor into .github/skills/re-hypervisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "re-hypervisor", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dslsdzc/rev-skills --skill re-hypervisor -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dslsdzc/rev-skills re-hypervisor --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dslsdzc/rev-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/re-hypervisor .opencode/skills/re-hypervisor && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "re-hypervisor" agent skill from https://github.com/dslsdzc/rev-skills/tree/main/.claude/skills/re-hypervisor into .opencode/skills/re-hypervisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "re-hypervisor", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
re-hypervisor虚拟化逆向:VT-x/SVM、hypervisor 检测、VMCS/EPT 分析, 以及 Xen / QNX Hypervisor / Jailhouse / ACRN / Bao / Hyper-V·VMBus / XtratuM / LynxSecure / Quest-V 的分区与 vdev 语义。
Re Hypervisor is an agent skill from dslsdzc/rev-skills. 虚拟化逆向:VT-x/SVM、hypervisor 检测、VMCS/EPT 分析, 以及 Xen / QNX Hypervisor / Jailhouse / ACRN / Bao / Hyper-V·VMBus / XtratuM / LynxSecure / Quest-V 的分区与 vdev 语义。 触发词:hypervisor、VT-x、SVM、虚拟化检测、EPT、Xen、grant table、event channel、 Jailhouse、cell、ACRN、ivshmem、Bao、shmemid、vdev、GPA/HPA、 Hyper-V、VMBus、VSC、VSP、GPADL、SR-IOV、XtratuM、XMCF、LynxSecure、Quest-V、sandbox kernel
Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 10 other files, including reference files (for example `references/acrn.md`, `references/bao.md` and `references/hyperv-vmbus.md`).
It sits in Security, covering Reverse engineering and malware. The repository describes itself as: 122 个逆向工程 AI 技能(可发布、跨平台):恶意软件分析 / 软件逆向 / 固件嵌入式 / 协议逆向 / 移动应用 / 脱壳反混淆 / 软件破解 / 漏洞挖掘 / 托管代码 / 取证情报 / CTF。 The licence is Apache-2.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit bd21db8. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
aptdnfbrewFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Re Hypervisor loads about 3.4k tokens when it runs, and up to ~20k if it reads all its reference files. Until then it costs about 93 tokens; SKILL.md has 1,016 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
sudo modprobe -r kvm_intel && sudo modprobe kvm_intel nested=1 # Intel(AMD 用 kvm_amd nested=1)Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from dslsdzc/rev-skills at commit bd21db8, republished under its Apache-2.0 licence (© dslsdzc). 1,016 words, ~3,388 tokens.
.claude/skills/re-hypervisor/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.<CORE RULE>
本域有两条互不相同的分析轴,先分清在哪一条上:
轴 B 的共同坑是把本地句柄当全局标识、把虚拟地址当物理地址:
grant ref 是 grant table 的条目索引 ≠ 物理地址
event-channel port 是通知端口 ≠ IRQ 号
guest BAR / GPA ≠ 物理 BAR / HPA
shmem_id 才是共享对象 identity ≠ 两个 VM 里的映射地址</CORE RULE>
virt-what)静态分析(CPUID 检查 / 反编译)免沙箱;QEMU/KVM 动态实验属动态执行,默认沙箱 + 快照([[re-analyze/platform-tips]] 最高原则)。
grep -E 'vmx|svm' /proc/cpuinfo——VT-x/SVM 支持标志(零安装,先用它)cpuid 工具(dump 各 CPUID 叶子的完整输出):apt install cpuid;Fedora: dnf install cpuidkcpuid(pacman -S kcpuid,linux-tools 组)或 libcpuid 附带的 cpuid_tool(pacman -S libcpuid)cpuid -1 输出含各叶子详情;cpuid -1 -l 0x40000000(hypervisor 厂商字符串叶子)!cpuid([[re-windbg]] 扩展命令)apt install qemu-system-x86(Debian 12+ 已移除 qemu-kvm 过渡包,直接装 qemu-system-x86 即含 qemu-system-x86_64;Ubuntu 的 qemu-kvm 过渡包仍存在,装了等价于 qemu-system-x86;Ubuntu 另加 libvirt-daemon-system)dnf install qemu-system-x86-core libvirt virt-install(或 dnf group install virtualization)pacman -S qemu-system-x86 libvirt virt-manager(启用 systemctl enable --now libvirtd)brew install qemu(无 KVM,用 HVF)qemu-system-x86_64 --version;ls /dev/kvm(KVM 加速可用);kvm-ok(Debian/Ubuntu 专用,来自 cpu-checker 包——先 apt install cpu-checker)按顺序执行,每步产物(CPUID 输出、VMCS 字段表、QEMU 配置)记录证据路径 + sha256(见 [[re-triage]]),供报告引用。
hypervisor 识别(CPUID 叶子 / VMX 标志):
grep -E 'vmx|svm' /proc/cpuinfo | head -1 # 宿主 CPU 虚拟化支持
cpuid -1 -l 0x1 | grep -i -A1 'hypervisor' # CPUID.1:ECX[31] hypervisor present bit
cpuid -1 -l 0x40000000 # 0x40000000 叶子的 hypervisor 厂商字符串
# "KVMKVMKVM" = KVM、"Microsoft Hv" = Hyper-V、"VMwareVMware" = VMware、"XenVMMXenVMM" = Xen0x40000000 返回厂商字符串(12 字符按序分布在 EBX:ECX:EDX 各 4 字节,EAX 返回最大 hypervisor 叶子号)VMCS 结构分析(VT-x):
VMXON(进入 VMX 操作模式)→ VMPTRLD(加载当前 VMCS)→ 配置 VMCS 字段 → VMLAUNCH/VMRESUME(进 guest)→ VM exit 后查 VM_EXIT_REASON 字段分派VMXON/VMPTRLD/VMWRITE/VMREAD/VMLAUNCH 指令(Ghidra 反汇编直接可读);VMCS 区域是内存块,先找 VMCS 缓冲区分配与初始化代码access=enc&1; index=(enc>>1)&0x1ff; type=(enc>>10)&3; width=(enc>>13)&3,在 Ghidra/IDA 里建枚举/结构标注VM_HSAVE_PA MSR),字段是固定偏移——按 AMD APM 布局标注虚拟化技术检测对抗(EPT 隐藏内存):
INVEPT/INVVPID(TLB 失效)使用点、EPT 指针字段(VMCS EPTP)赋值、EPT 页表构建函数(从 EPT 指针沿页表结构走)0xCC,原始数据页不变——读内存看到原指令、取指却断下;VMCS Exception Bitmap 拦截向量 3 后匹配地址用 guest_rip - 1(一字节 INT3 的 RIP 在断点字节之后);处理完单步恢复再重新布断点;非本框架的 #BP 必须 reinject 回 guest(不能吞其他调试器/系统断点)SetThreadContext 探测是否下硬件断点再转发到 EPT 监视)用这套替代嵌套虚拟化(VMM 内调试):
# KVM 开启嵌套(宿主)——module_param 权限为 0444,sysfs 只读,echo 写入会失败
sudo modprobe -r kvm_intel && sudo modprobe kvm_intel nested=1 # Intel(AMD 用 kvm_amd nested=1)
# 持久化:/etc/modprobe.d/kvm.conf 写 `options kvm_intel nested=1`(重启后仍生效)
cat /sys/module/kvm_intel/parameters/nested # 验证(Y/1 为已开启)
# QEMU 启动带 VT-x 透传的嵌套 VM(`-cpu host` 暴露 vmx 标志)
qemu-system-x86_64 -enable-kvm -cpu host,+vmx -m 4096 disk.img &
# 嵌套 VM 内再验证: grep vmx /proc/cpuinfo 可见 → 可在此跑 hypervisor 样本反虚拟化绕过([[re-evasion]] 联动):
findExportByName 拿不到——改 hook libc 导出函数 __get_cpuid/__get_cpuid_max 改返回值,或 Stalker 指令级追踪拦截 cpuid 指令;内核侧 hook/patch 指令)、QEMU -cpu 参数伪造厂商字符串、设备名改名轴 B:目标是"跑在某种虚拟化之下的系统",要判断哪些现象是虚拟化层造出来的正常机制。
shared_info 位掩码);迁移后本地端口会变、稳定的是 remote port;shared ring 上"有数据流动却无 IPC 调用"属正常name/size/shmem/vector/status,写 size 触发创建,故 guest 启动顺序无关)与控制页(status/idx/notify/detach);intr pass vs intr vdev;直通设备同一时刻只允许一个 residentJAILHOUSE_MEM_LOADABLE 映射在 cell 启动时被撤销(重装走 Cell Set Loadable);ivshmem 不维护 pending 语义(MSI-X PBA 恒 0,事件状态从共享内存协议读);hypervisor VA 里扫不到全部 VM 内存dm:/ vs hv:/,且 dm-land 无 doorbell)shmem_id 而非地址;IPC 的 size ≤ 对应 shmem 大小;cache coloring 抑制干扰但有代价(牺牲大页、增加 TLB 压力)且随平台颜色数截断!cpuid 查 CPUID 叶子、驱动加载观察)virt-what 思路)grep vmx /proc/cpuinfo)→ 嵌套开关(/sys/module/kvm_intel/parameters/nested)→ QEMU -cpu host 透传;实验全部在隔离沙箱([[re-analyze/platform-tips]] 最高原则)__rdtsc/__rdtscp 测指令耗时差值识别 hypervisor;原因——VM-exit 有固定开销可测量;对策——VM-exit 汇编入口最早记录 exit_tsc,ReadVirtualTsc 用有界平滑估计补偿(不能把中断/调度长尾全当 exit 成本),并保证每 vCPU 单调(max(value, last_guest_tsc+1));原则:样本检测哪里,就在 VM-exit 里处理哪里dm:/ 与 hv:/)不同则永不互通,且 dm-land 没有 doorbell 通知;对策——先核对实现与前缀是否一致,再看数据面([[acrn]])© dslsdzc, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 9 other files (references) in .claude/skills/re-hypervisor of dslsdzc/rev-skills.
Open the folder on GitHubat commit bd21db8
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in dslsdzc/rev-skills, which our catalogue first saw on October 7, 2026.
Re Hypervisor next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Re Hypervisor this skilldslsdzc/rev-skills | 125 | 1 repos | ~3.4k | Automated safety check: Notes | Apache-2.0 | |
| vphone600 Kernel Symbol AnalysisLakr233/vphone-cli | 15k | — | ~530 | Automated safety check: Pass | MIT | |
| Webhome Extension Builderwebhtv/webhtv | 1.7k | — | ~2.8k | Automated safety check: Pass | GPL-3.0 | |
| Reverse Flowlingbol088-spec/reverse-flow-skill | 936 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Website Rebuildboyang-hu/website-rebuild-skill | 1.4k | — | ~6.1k | Automated safety check: Pass | MIT | |
| Client Request Signature Reversalawarexone/Agentic-Bug-Hunter | 5.3k | — | ~4.7k | Automated safety check: Pass | MIT |
Lakr233/vphone-cli
Looks up symbols and addresses in vphone600 release and research kernel datasets, and cross-references XNU source, with findings that separate fact from inference.
webhtv/webhtv
Build, review, debug, reverse-engineer, and package WebHome injected extension scripts for FongMi/WebHome App WebView pages.
lingbol088-spec/reverse-flow-skill
Guided reverse engineering workflow for binaries, firmware, mobile apps, scripts, document samples, protocol captures, and unknown artifacts.
boyang-hu/website-rebuild-skill
1:1 rebuild of award-winning creative websites (WebGL / scroll-animation / portfolio sites).
awarexone/Agentic-Bug-Hunter
Recovers a client-side request signature or anti-bot token just far enough to replay blocked requests in bug bounty testing, starting from a captured packet.
lingbol088-spec/ReiPenFlow
Guided workflow for authorized penetration testing, vulnerability validation, security reporting, CTF/local sandbox reverse engineering, and user-directed vulnerability research.
dslsdzc/rev-skills
威胁归因方法论:钻石模型、基础设施图谱、置信度分级与归因报告. An agent skill from dslsdzc/rev-skills.
dslsdzc/rev-skills
Captures an analyzable sample from a live system when the target leaves no file on disk, by finding abnormal executable memory and the execution context that reached it.
dslsdzc/rev-skills
函数式语言运行时逆向(Haskell/OCaml):闭包/堆对象模型、调用约定、数据流优先策略. An agent skill from dslsdzc/rev-skills.
dslsdzc/rev-skills
射频逆向:信号采集、频谱分析、解调、帧同步与协议恢复、重放. An agent skill from dslsdzc/rev-skills.
dslsdzc/rev-skills
UEFI/BIOS 固件:SEC/PEI/DXE/BDS 阶段判定、DXE 驱动、UEFI 模块、bootkit. An agent skill from dslsdzc/rev-skills.
dslsdzc/rev-skills
现代 C++ 二进制逆向:RTTI/异常/虚表恢复、ABI 识别、mangling 解码. An agent skill from dslsdzc/rev-skills.
Categories
虚拟化逆向:VT-x/SVM、hypervisor 检测、VMCS/EPT 分析, 以及 Xen / QNX Hypervisor / Jailhouse / ACRN / Bao / Hyper-V·VMBus / XtratuM / LynxSecure / Quest-V 的分区与 vdev 语义。. Re Hypervisor is an agent skill from dslsdzc/rev-skills.
Re Hypervisor fits situations like: tasks that involve Reverse engineering and malware.
Run `npx skills add dslsdzc/rev-skills --skill re-hypervisor -a claude-code`. Or copy the skill folder (.claude/skills/re-hypervisor in dslsdzc/rev-skills) into .claude/skills/re-hypervisor in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dslsdzc/rev-skills --skill re-hypervisor -a codex`. Or copy the skill folder (.claude/skills/re-hypervisor in dslsdzc/rev-skills) into .agents/skills/re-hypervisor in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dslsdzc/rev-skills --skill re-hypervisor -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/re-hypervisor, .gemini/skills/re-hypervisor, .github/skills/re-hypervisor and .opencode/skills/re-hypervisor in your project.
Going by SKILL.md and its folder, Re Hypervisor needs the command-line tools its instructions call (apt, dnf and brew).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (runs commands with sudo), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Re Hypervisor is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 17k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Re Hypervisor: vphone600 Kernel Symbol Analysis (Lakr233/vphone-cli, 15k stars), Webhome Extension Builder (webhtv/webhtv, 1.7k stars), Reverse Flow (lingbol088-spec/reverse-flow-skill, 936 stars) and Website Rebuild (boyang-hu/website-rebuild-skill, 1.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dslsdzc (a GitHub user) maintains it in dslsdzc/rev-skills, which has 125 GitHub stars. The repository holds 41 skills in this directory. The repository was last updated on October 5, 2026.
Source: dslsdzc/rev-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.