p.s.話說有很多天很多天沒有寫東東了啊,因為實在太忙了,還是恢復至少乙個月兩篇的狀態吧。
我們的程式有時候需要精確的判定當前執行在哪個系統下面,也就是說程式的某個功能可能需要知道當前執行在哪個真正的作業系統下,而作業系統提供了乙個相容模式功能,就是使用者可以設定某個程式執行在某個模擬的更低的版本的作業系統下面,這是有好處的,因為某些程式在某些更高版本的作業系統下面可能發生相容性問題而無法執行。在設定相容模式執行後,程式裡面呼叫ring3層的getversionex得到的將是模擬的的作業系統版本,而不是真正的作業系統版本。
由此而引發兩個問題:
1、怎麼判定當前程式(自己)執行在相容模式下了呢?
2、如果有乙個需求,在安裝時,怎麼設定乙個程式執行在某個低版本的作業系統相容模式下呢?
] 寫下了如下一些東東:
系統把需要進行相容模式執行的程式路徑記錄在這個下面,具體相容哪個環境則由屬性的值來確定,譬如win2000, nt4sp5, win95, win98, winxpsp2, winxpsp3, winsrv03sp1, winsrv08sp1, vistartm, vistasp1, vistasp2等等(不要在低版本的作業系統下相容更高版本的作業系統,不會出問題,而是毫無意義,系統直接忽略)。有了這個就可以做到把某個程式寫入相容模式執行中。也可以保護這個登錄檔位置防止別人來使用相容模式執行你的程式。
再看看第乙個問題,研究下了微軟實現相容模式的原理,網上的資料很少,但是大概就是使用hook的原理,windows發現該程式需要進行相容模式執行(通過查登錄檔啦,還有一些系統預設以相容模式執行的程式,應該是記錄在其他地方,沒有深究),就會載入一些不同的系統dll(在win32下乙個應用程式想跑起來,是需要很多系統的dll的)來進行程式的執行,大概情況如下,左邊是非相容模式執行時載入的一些dll,右邊是執行在相容模式環境下後載入的一些dll:
這是否就給了我們一些思路?可以檢測當前程式載入的模組,如果有這些acgenral.dll之類的模組存在,就認為是執行在相容模式下呢?這個我沒有去試過,但是我覺得可行。o(∩_∩)o
另外一種方法是從原理是來繞過,getversionex這個api來之kernel32.dll,而kernel32.dll又呼叫了ntdll.dll裡面的rtlgetversion這個函式,如果我們直接呼叫呢?試了下也是有一定可行性的。不過悲劇的是,這個方法在vista及以上系統就無效了,可能是因為微軟在實現相容模式時,hook得更加深了。
360也有個相容模式檢測功能,去看了下他的實現,還不錯。
然後去研究了下,發現很有道理,360的方式是先呼叫 getversionex 得到乙個版本號,譬如是5.0(2000系統),然後算出乙個值50(5*10 + 0);
然後呼叫檔案版本api,取出檔案ntoskrnl.exe的版本號,譬如是5.1.2600.5938,然後算出乙個值52(5*10 + 1),對比前後兩個值,如果不相等則認為自身執行在相容模式下。具體分析可以見除錯結果(call 0042980是去取ntoskrnl.exe是版本)。
下面是ida反編譯的結果:
還不錯哦。
[end]
刪除應用程式自身的可執行檔案
下面的 由gary nebbett寫就.gary nebbett乃是windows nt 2000 native api reference的作者.乃nt系統一等一的高手.下面就分析一些他的這段 這段 在process沒有結束前就將啟動process的exe檔案刪除了.int main int ar...
程式檢測自身是否執行在虛擬機器下
來自 http www.codeproject.com kb system vmdetect.aspx 分析病毒的時候人們通常在vmware等虛擬機器下執行,以檢視病毒的執行路徑或者提取特徵碼。但是近年來出現許多抗虛擬機器檢測的病毒。也就是說,在虛擬機器下執行的時候,病毒會隱匿其惡意行為,使人們無法...
在Vista中使用相容模式執行應用程式
之前我們曾介紹過 不過,對於pdf portable document format 檔案,則沒有這麼幸運了,即使在windows vista中安裝了可以建立pdf的office 2007後,仍然不能實現pdf檔案的預覽。要檢視相應pdf檔案的內容,使用者不得不安裝 執行adobe acrobat ...