做练习从书恶意软件之实践分析(实验室5-1)IDA代码片断,EAX搬进全局变量
全局变量dword_1008E5C4
(第二图片)应该包含操作系统版本,但是从我可以看到它应该始终设置为0,因为 xor eax, eax
指令sub_10003695
我错过了什么吗?
做练习从书恶意软件之实践分析(实验室5-1)IDA代码片断,EAX搬进全局变量
全局变量dword_1008E5C4
(第二图片)应该包含操作系统版本,但是从我可以看到它应该始终设置为0,因为 xor eax, eax
指令sub_10003695
我错过了什么吗?
的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
套EAX
到00000001
- 作为返回值的子程序。
哦,谢谢,现在我(大部分)都明白了。忘记al是eax的一部分:) 所以对GetVersionExA的调用用struct填充[ebp + VersionInformation]。猜猜我对被调用函数如何改变调用者局部变量的值有点困惑 – sakana
是的,setz
指令,这台的al
基于它上面的比较结果的值(eax
一部分)。
是的,你错过了一些东西。 EAX不包含版本。 LEA加载数据所在的地址。当EAX被清除时,它只是将其清除为一个返回值。 –