2011-10-19 75 views
1

什麼是在運行時確定以彙編語言運行OS的技術?什麼是在運行時確定以彙編語言運行OS的技術?

如果有直接的方式來確定這一點,那簡直是真棒。

我也在想如何有在Javascript技巧,以確定你在...上運行的瀏覽器是否有用於確定像Intel彙編低層次的語言操作系統,甚至CPU拱類似的技術?

謝謝, Chenz

+2

讓我直截了當地說:你正在編寫程序集並且不知道你在運行什麼操作系統? – Stu

+0

爲什麼你需要這樣做? – bdonlan

+0

@bdonlan:病毒編寫是最明顯的 – James

回答

3

CPU架構將是下一個要不可能確定。機器碼在CPU架構上差別很大,因此編寫檢測代碼非常困難,它不會簡單地在除一個架構之外的所有架構上崩潰。事實上,您可以考慮將彙編(和機器代碼)作爲不同CPU架構上完全不同的語言 - 任何可以探測的東西,必須基本上是machine code polyglot。這就是說,如果你知道你在的某些味道的x86,你可能可以使用CPUID指令獲取有關處理器功能的信息。您也可以讀取控制寄存器來確定您是否處於64位模式。

至於檢測OS,這也是相當困難的。不同的操作系統有不同的系統調用入口點,嘗試使用錯誤的操作系統入口點只會導致崩潰(實際上,Windows甚至會將系統調用入口點的地址從一個引導到另一個引導)。您可能能夠探測窗口的TIB - 但任何企圖訪問FS:[0x0]可以在其他操作系統也崩潰。

一般來說,當你編寫彙編你應該知道你是什麼樣的系統上。如果您需要可移植性,請使用C語言或其他高級語言編寫。

+0

忘記了:讓我們從可執行頭開始! – Stu

+0

@Stu,我假設原始機器代碼(由某種存根加載器調用)。可執行頭文件確實是另一個問題 - 如果格式A希望文件以幻數X開頭,格式B希望以幻數Y開始文件,則完全卡住 – bdonlan

+0

就arch而言,CPUID很酷。而且我認爲確定永久性可能是可行的。是的,原始機器碼。至於可執行的頭文件,也許在一段代碼中讀取神奇的數字將是一種可能性... –

1

不,沒有機器代碼可以讓你這樣做。你可以使用爲不同的體系結構提供幾種不同的shellcode,每次傳播時隨機挑選一個。如果它成功運行,它會感染機器,但如果它是垃圾,那麼您的進程可能因發佈非法指令而被殺死,並且用戶可以用健康的機器繼續生活。

+0

你真棒。沒有這種美妙的見解,我不知道我會做什麼。 –

+0

我期待着接受的答案! – James

+0

提供一個確定正在運行的操作系統類型的C函數,我會這樣做。 –

0

通常不能可靠地確定在C(++)或彙編語言程序的OS。

您可以使用它的一些功能,這些功能在這些不同的操作系統版本,像在Windows GetSystemInfo()/GetNativeSystemInfo()可用相同的操作系統不同的「兼容」版本之間的區別,但這些都是不可用的DOS,Linux的和其他操作系統。

這是很難找出一個彙編語言子程序,因爲在不同的操作系統有正在調用OS功能的不同方式,如果你的操作系統做正確,你的程序崩潰。爲了防止它崩潰,你需要安裝某種異常或信號處理程序,但這也是操作系統特定的。

從通用CPU寄存器的內容中推斷操作系統也是不可靠的,因爲它們的值不能保證以某種方式反映操作系統,即使在某些情況下它們碰巧可能會在將來發生變化,包括將來當您更新操作系統時(例如安裝安全補丁)。

您可以用C的system()函數執行shell命令如ver for Windows和uname -a用於Linux,但沒有可移植的方法來提取在控制檯窗口此命令的輸出,並複製它放回程序進行分析。