Assembly IDA代码段,eax移到全局变量中

Assembly IDA代码段,eax移到全局变量中,assembly,ida,Assembly,Ida,做《实用恶意软件分析》一书中的练习(实验5-1) 全局变量dword_1008E5C4(第二张图片)应该包含OS版本,但从我看到的情况来看,由于 sub_10003695 我错过什么了吗 是的,setz指令,根据上面的比较结果设置al(eax的一部分)的值。该函数具有以下特征: BOOL WINAPI GetVersionEx( _Inout_ LPOSVERSIONINFO lpVersionInfo ); 因此,它在堆栈上的局部变量(此处引用了rel toEBP)中返回一个结构(或O

做《实用恶意软件分析》一书中的练习(实验5-1)

全局变量dword_1008E5C4(第二张图片)应该包含OS版本,但从我看到的情况来看,由于
sub_10003695

我错过什么了吗


是的,
setz
指令,根据上面的比较结果设置
al
(eax的一部分)的值。

该函数具有以下特征:

BOOL WINAPI GetVersionEx(
  _Inout_ LPOSVERSIONINFO lpVersionInfo
);
因此,它在堆栈上的局部变量(此处引用了rel to
EBP
)中返回一个结构(或
OSVERSIONINFOEX
,但此处不相关),该字段
dwPlatformId
通过

cmp [ebp+VersionInformation.dwPlatformId], 2
指示。值
2
表示

操作系统为Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP或Windows 2000

因此,在这些系统上,
CMP
设置表示相等的
ZERO?
标志。因为
ZERO?
标志现在已设置,
EAX
仍然为零

setz al

EAX
设置为
00000001
——作为子例程的返回值。

是的,您缺少一些内容。EAX不包含该版本。LEA加载数据所在的地址。当EAX被清除时,它只是将其作为返回值进行清除。哦,谢谢,现在我(大部分)明白了。忘记al是eax:)的一部分,因此对GetVersionExA的调用使用结构填充[ebp+VersionInformation]。我想我对被调用者函数如何更改调用者的局部变量的值有点困惑