竞争类型

逆向工程 部件 结构体
2021-06-26 13:30:55

我在一段代码中发现了以下几行(使用 IDA PRO):

 ...
 ...
 push 44h
 pop edi
 push edi        ; size_t
 xor esi, esi
 lea eax, [ebp+StartupInfo]
 push esi        ; int 
 push eax        ; void *
 call _memset
 ...
 ...

当我看到lea eax, [ebp+StartupInfo]这一行时我想,好吧,eax 是指向结构 STARTUPINFO 的指针。使用 int esi = 0 或 NULL(请参阅xor esi, esi 行)和 size_t edi = 44h 并通过调用 memset,它们必须填充 STARTUPINFO 的前 44 个字节(即元素 cb、lpReserved.... ,wShowWindow)。

但是行 push eax ; 空白 *

激怒我。eax 如何同时具有 Startupinfo 和 void 类型?

之后,我发现memset()-function的第一个参数必须是void类型。所以,我心中的问号现在更大了……

1个回答

IDA 知道_memset函数的原型_memset(void *, int, size_t),因此它向您展示了eaxin的值push eax是用于void *参数的。

但是,稍后在此函数中,StartupInfo可能CreateProcess会将指向该结构的指针传递给,这就是 IDA 将其命名为这样的原因。

eax 如何同时具有 Startupinfo 和 void 类型?

eax只是一个保存值的寄存器,在上面的反汇编中是StartupInfo结构的地址类型是高级概念,因此当由 处理时_memset, 的值eax被解释为 a void *,当由 处理时CreateProcess,它被解释为指向STARTUPINFO结构的指针