2010-07-23 59 views
6

它們是否一樣?X86機器上的程序集,Windows vs Linux

加長版:

說我寫的,安裝時,在Windows機器上,一個小的應用程序,它是所有加1 + 1,並將其存儲在寄存器中。那麼,我在Linux機器上寫完全相同的代碼。它會起作用嗎?

即時通訊思想是,因爲在硬件層面,它在同一臺機器,所以(原諒不精確)「硬件語言」將是相同的。

因此,進出口思維病毒瞄準Windows,但用匯編寫的難道不正好是Windows病毒。

+3

有人一直在讀一些尼爾史蒂芬森! – chimeracoder 2010-07-23 21:07:09

+3

不,尼爾斯蒂芬森會提出一個可以讓你發燒的計算機病毒。 – tylerl 2010-07-23 21:15:40

+1

我從來沒有聽說過尼爾史蒂芬森,但下次他會在圖書館看他。 – jason 2010-07-23 21:18:47

回答

4

程序用匯編語言編寫的窗口是不是二進制兼容Linux ......你需要重新編譯(彙編),他們在Linux上,但請記住,有裝配之間的差異..他們不同方式處理,例如零件聲明代碼,數據,BSS

windoes高管沒有在Linux上本地運行(您可以在酒中運行它們,但它們會被沙盒)

10

病毒肯定會需要與操作系統進行交互,並使用其API。因此它非常依賴於平臺。

此外,可執行也有一個頭,而這將取決於目標操作系統。如果你要在Windows中創建一個或多或少空的EXE文件,那麼在Linux下這將不會運行(甚至不會啓動)。

+3

人們已經編寫了概念驗證蠕蟲和病毒,這些蠕蟲和病毒通過利用預計會廣泛存在的高級環境或通過執行平臺檢測並運行多平臺有效負載的相應部分來運行跨平臺。 2600年前有一篇關於大約一年前的文章,從那以後我就看過一篇白皮書。 – dmckee 2010-07-23 21:10:17

+2

1988年的原始Morris蠕蟲是多平臺的,運行在Vax BSD和太陽上。 – 2010-07-23 21:32:15

1

語言本身是幾乎相同的,但運營商說明是不同的。這個教程在http://asm.sourceforge.net/intro/hello.html有一個很好的解釋。

section .text 
    global _start   ;must be declared for linker (ld) 

_start:     ;tell linker entry point 

    mov edx,len ;message length 
    mov ecx,msg ;message to write 
    mov ebx,1 ;file descriptor (stdout) 
    mov eax,4 ;system call number (sys_write) 
    int 0x80 ;call kernel 

    mov eax,1 ;system call number (sys_exit) 
    int 0x80 ;call kernel 

section .data 

msg db 'Hello, world!',0xa ;our dear string 
len equ $ - msg   ;length of our dear string 

由於操作系統的具體情況(如int 0x80),這與DOS hello world程序不同。

+0

_「操作員指令不同」_是什麼意思? – stakx 2010-07-23 21:37:53

+0

@stakx - 我認爲他的意思是「操作系統說明」。 – 2010-07-23 23:23:45

1

雖然你可能會寫x86彙編,您仍可以使用,這取決於操作系統您使用的是不同的彙編,他們將有不同的特點,在彙編所以寫在Windows不一定是與你在Linux中編寫的相同,但我認爲它們會很相似。

+0

彙編程序的功能應該不重要,因爲彙編程序到機器代碼的轉換應該是相同的。這是其他的東西,如文件格式和系統調用,這將是不同的。 – 2010-07-23 21:29:08

0

以下是從報價:Introduction to Linux Intel Assembly Language

  • 事情在其它操作系統類似。使用Microsoft或渦輪編譯器,例如,彙編語言源文件的後綴.ASM,目標文件的後綴OBJ,等

  • NASM適用於Unix和微軟Windows。對於這個問題,甚至可以在Windows下使用作爲,因爲它是gcc包的一部分,並且可以在cygwin的名下用於Windows。

0

所有操作系統的程序集都可以相同,假設可移植性層爲您所支持的每個操作系統提供了實現。

雖然,如果你正在計劃像我這樣的超兼容二進制文件。ELF和PE格式完全不同,它會阻止同一個可執行文件在不同的操作系統上運行。雖然這可以通過編寫一個可移植的程序加載器來解決。

1

彙編語言在很大程度上是相同和相似的。但是,Windows和Linux都不會嘗試執行任意文件。大多數現代操作系統拒絕執行程序,除非它具有適當的可執行頭文件(例如PE或ELF)。

在Windows中,文件需要具有正確的擴展名(例如.exe,.dll,.com),並且在Windows甚至嘗試執行文件之前,文件需要符合可移植可執行文件(PE)格式的佈局。

在Linux中,文件需要符合ELF格式(可執行文件和可鏈接格式)並且具有執行權限位(可以使用chmod設置/取消設置)。

實際上,這意味着不識別ELF格式的Windows將拒絕執行Linux程序;除非你有Wine,否則Linux將拒絕執行PE/Windows程序。以彙編編寫的病毒需要重新編譯(通過彙編程序運行)爲正確的可執行格式(PE或ELF)以適應操作系統。然後你就會遇到Windows和Linux之間(甚至在不同版本的Windows和不同版本的Linux之間)不同的函數調用約定的問題;即使是最基本的東西,也有不同的系統調用API和不同的系統調用方法。實際上,編寫一個在Windows和Linux之間可移植的彙編代碼幾乎是不可能的,因爲即使是打印輸入/輸出等基本操作也是不同的。

0

x86指令將執行相同的操作。

但是,事物在內存中的位置會有所不同,以及您的代碼可以訪問的內容。 操作系統服務將因您如何調用它們而有所不同。

所以,如果你能都得到相同的二進制代碼,那麼你可能例如寫代碼從1-100加起來所有的數字和,將工作,但對於打印出來的機制將有很大的不同。

0

它是相同的處理器,並作爲結果相同的說明做你的1 + 1是。

並且很可能您可以使用類似的工具來爲該指令提供至少相同的彙編源代碼。但是可執行文件格式不僅包含要執行的字節,還包含其他內容在操作系統之間不同。使用不同的工具來創建不同的可執行文件/容器。那就是如果你正在嘗試執行一個完整的程序。如果你有一個病毒或其他邪惡的程序利用操作系統中的某個malloc來獲得操作系統執行代碼的好處,那麼這些代碼的字節不會包含這個可執行的包裝器,那些字節是隻是你想運行的指令。因此,從這個意義上說,它們將再次成爲相同的字節,但是進入操作系統(或驅動程序)的攻擊可能依賴於操作系統,並且您的利用將依賴於操作系統。

8

是的,沒有。

添加1 + 1並將其存儲在寄存器中的小片段將與機器碼完全相同 - 也就是說,無論操作系統如何,處理器上運行的代碼都是相同的。

但是,你需要與周圍與操作系統交互來使你的程序有意義的其它位的代碼 - 你永遠不會知道你的代碼實際上正確地存儲在2如果eax它沒有輸出到什麼地方,對於例。有趣的是,像Wine這樣的項目允許在Linux下提供程序在Windows下找到的相同的API調用,並提供適當的邏輯以允許Linux正確解碼Windows可執行文件,從而實現跨平臺的互操作性。因此,藉助Wine支持,一些Windows病毒實際上可以在Windows下運行。它可能需要一些工作,但你可以做到這一點。

不,Wine不需要重新編譯Windows程序 - 事實上,它確實直接在處理器上運行存儲在EXE中的機器代碼。

+0

幾年前,我在Wine的Linux機器上玩過魔獸世界。 它幾乎完美無缺地工作,但角色的腿由於某種原因不能正確動畫。 – Kalamane 2016-02-25 22:08:37