NellInc/Janus

GitHub: NellInc/Janus

Janus 是一个通用双向 NT/9x 驱动程序翻译框架,解决在 Windows 9x 上加载 Windows NT 内核驱动程序的不兼容问题。

Stars: 2 | Forks: 0

# Janus:通用双向 NT/9x 驱动程序翻译框架 **在 Windows 9x 上加载 Windows NT 内核模式驱动程序。支持任意 NT 版本与任意架构。** Janus 是一个驱动程序翻译框架,旨在桥接 Windows NT 内核模式驱动程序(.sys PE 文件)与 Windows 9x VxD 子系统之间的根本性不兼容。它在 Win98 VxD 封装器内加载、重定位、解析导入并执行未经修改的 NT 驱动程序,跨越了 12 年的 Windows 历史和三种 CPU 架构。 其名源于罗马神话中的门神、过渡与通道之神——常被描绘为两张面朝相反方向的脸。Janus 主宰着不兼容内核架构之间的通道,连接了 NT 的起始(3.1,1993年)与 9x 的终结(ME,2000年)。 ## 已验证成果 **跨越 3 种架构和 12 年时间跨度,成功加载了 19 个驱动程序:** | # | 时代 | 驱动程序 | 类别 | 结果 | |---|------|----------|------|------| | 1 | XP SP3 | sym_hi.sys (LSI 53C810) | SCSI | 9/9 扇区读写成功 | | 2 | XP SP3 | rtl8029.sys (NE2000 PCI) | NDIS 4.0 | 完整 ARP 收发 | | 3 | XP SP3 | rtl8139.sys (Realtek) | NDIS 5.0 | 完整 ARP 收发 | | 4 | XP SP3 | ne2000.sys | NDIS 3.0 | 完整 ARP 收发 | | 5 | XP SP3 | vga.sys (21K) | VideoPort | DriverEntry + 初始化 | | 6 | XP SP3 | hidparse.sys (25K) | ntoskrnl | DriverEntry + 30 个导出 | | 7 | XP SP3 | hidgame.sys (9K) | HID | DriverEntry + HidRegister | | 8 | XP SP3 | es1371mp.sys (41K) | PortCls | 60/60 个导入已解析 | | 9 | XP x64 | hidparse.sys (41K) | AMD64 PE32+ | 加载 + 导入 | | 10 | XP x64 | pciide.sys (6K) | AMD64 PE32+ | 加载 + PCIIDEX | | 11 | XP x64 | hidgame.sys (12K) | AMD64 PE32+ | 加载 + HIDCLASS | | 12 | XP x64 | vgapnp.sys (33K) | AMD64 PE32+ | 加载 + VideoPort | | 13 | XP x64 | ne2000.sys (22K) | AMD64 PE32+ | 加载 + NDIS | | 14 | NT 3.51 | aha154x.sys (9K) | ScsiPort | 加载 + 17/17 个导入 | | 15 | NT 3.1 | aha154x.sys (15K) | ScsiPort | 加载 + 全部导入 | | 16 | NT 3.51 | buslogic.sys (8.5K) | ScsiPort | 加载 + ScsiPort | | 17 | NT 3.51 | ncr53c9x.sys (12K) | ScsiPort | 加载 + ScsiPort | | 18 | XP IA-64 | pciide.sys (6.7K) | Itanium PE32+ | 加载 + PCIIDEX | ## 架构 ``` Win98 Guest ───────────────────────────────────────── NTMINI.VXD (single LE object, SYSTEM.INI loaded) ├── PE Loader (PELOAD.C, 1809 lines) │ ├── PE32 (i386, 0x014C) — full load + execute │ ├── PE32+ (AMD64, 0x8664) — full load + import resolution │ ├── PE32+ (IA-64, 0x0200) — full load + import resolution │ └── Multi-DLL import resolution via shim registry │ ├── NTOS_SHIM.C (2077 lines, 130+ stubs) │ ├── ntoskrnl.exe: memory, sync, timer/DPC, IRP, power, │ │ string, registry, object, thread, CRT functions │ └── HAL.dll: port I/O, MMIO, spinlocks, IRQL, timing │ ├── Class Shims: │ ├── ScsiPort → IOS VxD bridging (HDD/CD-ROM read/write) │ ├── NDIS → Direct packet TX/RX (ARP send+receive) │ ├── VideoPort → PCI GPU, VGA regs, Int10 V86, PCI BAR scan │ ├── HID → HidRegisterMinidriver │ ├── PCI IDE → PciIdeXInitialize/GetBusData/SetBusData │ ├── PortCls → COM vtable stubs (WDM audio) │ └── 6 more written (USB, DirectDraw, WiFi, AGP, Joystick) │ └── VxD Infrastructure (VXDWRAP_V4.ASM, 2700 lines) ├── VMM service wrappers, DDB, control dispatch ├── Safe_HwFindAdapter (IDT fault catching) ├── VxD_PageAllocateDMA (contiguous physical memory) ├── Win9x page table self-map (PDE 0x3FE) for DMA VA→PA ├── V86 nested execution (INT 10h BIOS calls) └── PCI config space (0xCF8/0xCFC) ``` ## 关键发现:Win9x 上的 DMA Win9x 将递归页表映射到 PDE 索引 0x3FE,而非像 NT 那样是 0x3FF: ``` // Page directory at VA 0xFFBFE000 (not 0xFFFFF000) // Page tables at VA 0xFF800000 (not 0xFFC00000) volatile ULONG *pde = (volatile ULONG *)(0xFFBFE000 + (va >> 22) * 4); if (*pde & 1) { volatile ULONG *pte = (volatile ULONG *)(0xFF800000 + (va >> 12) * 4); if (*pte & 1) return (*pte & 0xFFFFF000) | (va & 0xFFF); } ``` 在 Win98 上,所有用于 VA 到 PA 转换的 VMM 服务均失败。自映射是唯一可行的方法。 ## 构建指南 ### 前置条件 - Docker(用于包含 Open Watcom 2.0 + NASM 的 `ntmini-builder` 镜像) - Python 3 - QEMU(用于 LSI 修复的定制版本,或用于非 SCSI 测试的原版) - Windows 98 SE 磁盘映像(FAT32) ### 构建 ``` cd source/ # SCSI(sym_hi.sys,LSI 53C810): docker run --rm -v "$PWD:/src" -v "$PWD/../builds:/out" \ ntmini-builder:latest sh -c "cd /src && \ nasm -f obj -o /out/V5FULL_asm.obj VXDWRAP_V4.ASM && \ wcc386 -bt=windows -3s -s -zl -d0 -nc=LCODE -nt=_LTEXT -nd=_LDATA \ -zc -zdp -dNTMINI_USE_SCSI=1 NTMINI_V5.C -fo=/out/V5_c.obj && \ wcc386 ... PELOAD.C -fo=/out/V5_pe.obj && \ cd /out && wlink @link_script.lnk" python3 ../tools/le_merge_objects.py builds/OUTPUT.VXD builds/MERGED.VXD ``` 构建模式:SCSI (1,2), NDIS (3), VideoPort (4), 通用测试 (5)。 ## NT 版本支持 | 版本 | 年份 | 架构 | 状态 | |------|------|------|------| | NT 3.1 | 1993 | i386 | PE 加载已验证 (aha154x.sys) | | NT 3.5 | 1994 | i386 | 提取了 146 个驱动,未测试 | | NT 3.51 | 1995 | i386 | PE 加载已验证 (3 个 SCSI 驱动) | | NT 4.0 | 1996 | i386 | 兼容 (相同的 ScsiPort API) | | Windows 2000 | 2000 | i386 | 兼容 (NT5,与 XP 相同的 API) | | Windows XP SP3 | 2005 | i386 | 8 个驱动已验证 (SCSI/NDIS/Video/HID/Audio) | | Windows XP x64 | 2005 | AMD64 | 5 个驱动 PE32+ 加载成功 | | Windows XP IA-64 | 2003 | Itanium | 1 个驱动 PE32+ 加载成功 | ## Win9x 目标支持 | 目标 | 状态 | |------|------| | Windows 98 SE | 主要目标,所有测试均在此进行 | | Windows ME | 预期可用(相同的 VxD 架构),未测试 | | Windows 95 | 相同的 VxD 格式,需验证 VMM 差异 (PDE 索引,PageAllocate) | ## 驱动类别覆盖 | 类别 | 垫片 | 函数数量 | 状态 | |------|------|----------|------| | ScsiPort (SCSI 存储) | NTMINI_V5.C | 22+ | 已验证 (读写) | | NDIS (网络) | NDIS_SHIM.C | 75+ | 已验证 (收发) | | VideoPort (显示) | VIDEO_SHIM.C | 47+ | 已验证 (初始化) | | ntoskrnl/HAL | NTOS_SHIM.C | 130+ | 已验证 | | HID | HID_SHIM.C | 3 | 已验证 | | PCI IDE | PCIIDE_SHIM.C | 3 | 已验证 | | PortCls (音频) | AUDIO_SHIM.C | 20+ | 部分完成 | | USBD (USB) | USB_SHIM.C | 15 | 已编写 | | DirectDraw/D3D | DDRAW_SHIM.C | 15+ | 已编写 | | 802.11 WiFi | WIFI_SHIM.C | 8 | 已编写 | | AGP | AGP_SHIM.C | 10 | 已编写 | | 游戏杆 | JOYSTICK_SHIM.C | 5 | 已编写 | ## 路线图 ### 近期目标 - Windows 95 和 Windows ME 测试 - 更多 IA-64 Itanium 驱动程序 (ne2000, vga) - VideoPort Int10 时序修复(将 V86 延迟到 Init_Complete) - 用于真实网络的 NDIS 到 Win98 TCP/IP 桥接 - 来自 NT 3.51/4.0 的 MIPS (0x0166) 和 Alpha AXP (0x0184) 架构支持 ### 中期目标 - 双向支持:在 NT 上运行 Win9x VxD 驱动程序(VxD-on-NT 加载器) - 从文件系统运行时加载驱动程序(绕过 VxD 大小限制) - 完整的 WDM IRP 栈以支持复杂驱动程序 - 真实硬件测试(超越 QEMU) ## 项目历史 最初为解决 [Vogons 复古计算社区](https://vogons.org) 在 Windows 98 上使用 NEC ATAPI 控制器的 CD-ROM 驱动问题而开发。后发展为一个覆盖完整 NT 驱动生态系统的通用驱动程序翻译框架。 在 2026 年 3 月至 5 月的三个月开发过程中,约消耗了 2 亿 token 的 Claude (Opus 4.6) 逆向工程算力。 ## 许可证 MIT 许可证。详情请参阅 [LICENSE](LICENSE)。
标签:Bro, CPU架构兼容, PE文件处理, VxD驱动, Windows 9x, Windows NT, Windows系统兼容, 兼容性层, 内核模式, 内核驱动翻译, 双向兼容框架, 双向翻译, 客户端加密, 技术研究, 操作系统内核, 架构桥接, 系统工具, 系统编程, 自动回退, 虚拟化技术, 请求拦截, 身份验证强制, 逆向工具, 驱动兼容性, 驱动加载器, 驱动程序开发