This commit is contained in:
xyou
2026-07-28 14:35:14 +08:00
parent 17a577f2ed
commit 537890df9e
44 changed files with 4903 additions and 404 deletions
+100
View File
@@ -0,0 +1,100 @@
#ifndef X86EMU32_H
#define X86EMU32_H
/* x86emu32.h — x86-32 指令解释器(PE32 执行引擎)。
*
* 寄存器级解释执行 32位 PE 代码。覆盖 mingw-w64 控制台程序常用指令集。
* 遇不支持的指令时日志告警并返回错误。
*/
#include <utsm/types.h>
/* x86 通用寄存器索引 */
enum {
X86_EAX = 0, X86_ECX, X86_EDX, X86_EBX,
X86_ESP, X86_EBP, X86_ESI, X86_EDI
};
/* EFLAGS 位 */
#define X86_CF (1u << 0)
#define X86_PF (1u << 2)
#define X86_AF (1u << 4)
#define X86_ZF (1u << 6)
#define X86_SF (1u << 7)
#define X86_OF (1u << 11)
#define X86_DF (1u << 10)
/* IAT 条目信息(解释器用于 CALL 拦截) */
typedef struct pe_iat_entry {
u32 iat_rva; /* IAT 中该条目的 RVA */
int shim_index; /* 对应 shim 表索引,-1 = 未实现 stub */
u32 target_addr; /* 模拟地址(iat_rva + image_base) */
} pe_iat_entry;
typedef struct x86emu_state {
u32 regs[8]; /* EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI */
u32 eip; /* 指令指针(相对 mem 基址的偏移) */
u32 eflags;
u8 *mem; /* guest 内存基址(= PE image_base) */
u64 mem_size; /* guest 内存大小 */
u32 image_base; /* PE 加载基址(= mem,32位截断) */
u32 image_size;
/* IAT 表(用于 CALL 拦截) */
pe_iat_entry *iat_entries;
int iat_count;
/* 栈区 */
u32 stack_base; /* 栈底(高地址) */
u32 stack_size;
/* heap 区 */
u32 heap_base;
u32 heap_size;
u32 heap_next; /* 下次分配偏移 */
/* 退出状态 */
int exited; /* ExitProcess 被调用 */
u64 exit_code;
int error; /* 解释错误 */
const char *error_msg;
/* 指令计数限制(防死循环) */
u64 insn_count;
u64 insn_limit;
} x86emu_state;
/* 初始化解释器状态。
* mem = PE image 加载基址(已映射节区+重定位+IAT 填充)。
* iat_entries / iat_count = pe_loader 解析的 IAT 表。
* stack_top = 栈顶 ESP 初始值(相对 mem 的偏移)。
* 返回 0 成功。 */
int x86emu32_init(x86emu_state *emu, u8 *mem, u64 mem_size,
u32 image_base, u32 image_size,
pe_iat_entry *iat_entries, int iat_count,
u32 stack_top);
/* 执行直到 ExitProcess 或错误。
* 返回 0 正常退出(exit_code 有效),负数错误。 */
int x86emu32_run(x86emu_state *emu, u64 *exit_code);
/* 从模拟栈读取 N 个参数(cdecl/stdcall)。
* esp_offset = 参数相对 ESP 的偏移(0=第一个参数)。
* 返回参数值。 */
u64 x86emu32_read_arg(x86emu_state *emu, int esp_offset);
/* 模拟栈 push/pop(供 shim32 回调使用) */
void x86emu32_push32(x86emu_state *emu, u32 val);
u32 x86emu32_pop32(x86emu_state *emu);
/* 读写模拟内存 */
u8 x86emu32_read8(x86emu_state *emu, u32 addr);
u16 x86emu32_read16(x86emu_state *emu, u32 addr);
u32 x86emu32_read32(x86emu_state *emu, u32 addr);
void x86emu32_write8(x86emu_state *emu, u32 addr, u8 val);
void x86emu32_write16(x86emu_state *emu, u32 addr, u16 val);
void x86emu32_write32(x86emu_state *emu, u32 addr, u32 val);
#endif /* X86EMU32_H */