做練習從書惡意軟件之實踐分析(實驗室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被清除時,它只是將其清除爲一個返回值。 –