#!/usr/bin/env python3 """ gen_pe.py — Deshab PE 兼容层测试 PE 程序生成器(无需 MinGW/MSVC) 用途: 当宿主机无 MinGW/MSVC 时,用纯 Python 构造最小 PE32+ 和 PE32 二进制, 验证 pe_loader 解析与 pe_shim/x86emu32 执行路径。 构造的 PE 特征: - PE32+ (64位): machine=0x8664, entry=main, image_base=0x140000000 - PE32 (32位): machine=0x014c, entry=main, image_base=0x00400000 - 单 section (.text), 4KB 对齐 - IAT 仅 2 项: msvcrt.dll!printf + kernel32.dll!ExitProcess - main 函数: 调用 printf("Hello from PE32+/PE32!\\r\\n") → 调用 ExitProcess(0) 输出: hello64.exe - PE32+ 二进制 (供 HELLO64 EXE 测试用) hello32.exe - PE32 二进制 (供 HELLO32 EXE 测试用) 用法: python gen_pe.py # 生成 hello64.exe / hello32.exe 到当前目录 # 之后复制到 SYSTEM/system/deshab64/tools/ 并重新运行 build.bat """ import struct import sys import os # ============================================================================ # PE32+ (64位) 构造 # ============================================================================ IMAGE_DOS_SIGNATURE = 0x5A4D # 'MZ' IMAGE_NT_SIGNATURE = 0x00004550 # 'PE\0\0' IMAGE_FILE_MACHINE_I386 = 0x014c IMAGE_FILE_MACHINE_AMD64 = 0x8664 IMAGE_FILE_MACHINE_I386_CHARACTERISTICS = 0x0102 # EXECUTABLE_IMAGE | 32BIT_MACHINE IMAGE_FILE_MACHINE_AMD64_CHARACTERISTICS = 0x0022 # EXECUTABLE_IMAGE | LARGE_ADDRESS_AWARE IMAGE_SUBSYSTEM_WINDOWS_CUI = 3 IMAGE_SCN_CNT_CODE = 0x20 IMAGE_SCN_MEM_EXECUTE = 0x20000000 IMAGE_SCN_MEM_READ = 0x40000000 IMAGE_DIRECTORY_ENTRY_IMPORT = 1 def build_pe32_plus(): """构造 PE32+ (64位) 测试程序。""" image_base = 0x140000000 section_align = 0x1000 file_align = 0x200 # DOS header (64 bytes) + e_lfanew dos_header = bytearray(64) struct.pack_into(' mov dword [rax], 1 ; C7 00 01 00 00 00 jmp $ ; EB FE (兜底:万一未 fault 原地死循环) 0x400000000000 是低位规范地址(bit47=0)且远超任何已映射区, 写入必然 #PF(err=0x2, supervisor write non-present, cr2=0x400000000000)。 预期串口: "[IDT] exception" + vector=0xe + cr2=0x0000400000000000。 无导入表(pe_loader 对空 import directory 直接跳过)。 """ image_base = 0x140000000 section_align = 0x1000 file_align = 0x200 dos_header = bytearray(64) struct.pack_into('