2017-08-02 42 views
1

做练习从书恶意软件之实践分析(实验室5-1)IDA代码片断,EAX搬进全局变量

全局变量dword_1008E5C4(第二图片)应该包含操作系统版本,但是从我可以看到它应该始终设置为0,因为 xor eax, eax指令sub_10003695

我错过了什么吗?

enter image description here enter image description here

+0

是的,你错过了一些东西。 EAX不包含版本。 LEA加载数据所在的地址。当EAX被清除时,它只是将其清除为一个返回值。 –

回答

2

GetVersionEx功能有这样的签名:

BOOL WINAPI GetVersionEx(
    _Inout_ LPOSVERSIONINFO lpVersionInfo 
); 

所以它返回一个OSVERSIONINFO结构(或OSVERSIONINFOEX,但在这里,这是不相关)在一个局部变量在栈上(此处引用rel来EBP),该场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 

EAX00000001 - 作为返回值的子程序

+0

哦,谢谢,现在我(大部分)都明白了。忘记al是eax的一部分:) 所以对GetVersionExA的调用用struct填充[ebp + VersionInformation]。猜猜我对被调用函数如何改变调用者局部变量的值有点困惑 – sakana

1

是的,setz指令,这台的al基于它上面的比较结果的值(eax一部分)。