什麼是在運行時確定以彙編語言運行OS的技術?什麼是在運行時確定以彙編語言運行OS的技術?
如果有直接的方式來確定這一點,那簡直是真棒。
我也在想如何有在Javascript技巧,以確定你在...上運行的瀏覽器是否有用於確定像Intel彙編低層次的語言操作系統,甚至CPU拱類似的技術?
謝謝, Chenz
什麼是在運行時確定以彙編語言運行OS的技術?什麼是在運行時確定以彙編語言運行OS的技術?
如果有直接的方式來確定這一點,那簡直是真棒。
我也在想如何有在Javascript技巧,以確定你在...上運行的瀏覽器是否有用於確定像Intel彙編低層次的語言操作系統,甚至CPU拱類似的技術?
謝謝, Chenz
CPU架構將是下一個要不可能確定。機器碼在CPU架構上差別很大,因此編寫檢測代碼非常困難,它不會簡單地在除一個架構之外的所有架構上崩潰。事實上,您可以考慮將彙編(和機器代碼)作爲不同CPU架構上完全不同的語言 - 任何可以探測的東西,必須基本上是machine code polyglot。這就是說,如果你知道你在的某些味道的x86,你可能可以使用CPUID指令獲取有關處理器功能的信息。您也可以讀取控制寄存器來確定您是否處於64位模式。
至於檢測OS,這也是相當困難的。不同的操作系統有不同的系統調用入口點,嘗試使用錯誤的操作系統入口點只會導致崩潰(實際上,Windows甚至會將系統調用入口點的地址從一個引導到另一個引導)。您可能能夠探測窗口的TIB - 但任何企圖訪問FS:[0x0]
可以在其他操作系統也崩潰。
一般來說,當你編寫彙編你應該知道你是什麼樣的系統上。如果您需要可移植性,請使用C語言或其他高級語言編寫。
不,沒有機器代碼可以讓你這樣做。你可以使用爲不同的體系結構提供幾種不同的shellcode,每次傳播時隨機挑選一個。如果它成功運行,它會感染機器,但如果它是垃圾,那麼您的進程可能因發佈非法指令而被殺死,並且用戶可以用健康的機器繼續生活。
通常不能可靠地確定在C(++)或彙編語言程序的OS。
您可以使用它的一些功能,這些功能在這些不同的操作系統版本,像在Windows GetSystemInfo()
/GetNativeSystemInfo()
可用相同的操作系統不同的「兼容」版本之間的區別,但這些都是不可用的DOS,Linux的和其他操作系統。
這是很難找出一個彙編語言子程序,因爲在不同的操作系統有正在調用OS功能的不同方式,如果你的操作系統做正確,你的程序崩潰。爲了防止它崩潰,你需要安裝某種異常或信號處理程序,但這也是操作系統特定的。
從通用CPU寄存器的內容中推斷操作系統也是不可靠的,因爲它們的值不能保證以某種方式反映操作系統,即使在某些情況下它們碰巧可能會在將來發生變化,包括將來當您更新操作系統時(例如安裝安全補丁)。
您可以用C的system()
函數執行shell命令如ver
for Windows和uname -a
用於Linux,但沒有可移植的方法來提取在控制檯窗口此命令的輸出,並複製它放回程序進行分析。
讓我直截了當地說:你正在編寫程序集並且不知道你在運行什麼操作系統? – Stu
爲什麼你需要這樣做? – bdonlan
@bdonlan:病毒編寫是最明顯的 – James