2017-08-02 50 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一部分)。