2017-02-11 68 views
2

作爲一個安全大學項目,我應該編寫一個PE感染者的代碼。但我是一個彙編程序的初學者,因爲我不知道如何處理變量而導致多次崩潰。裝配中的變量訪問(MASM32)

我知道,在一個正常的程序中,我們有一個。數據部分初始化變量,和。數據?未初始化的變量爲

但是在這種情況下,每個教程似乎都認爲應該在。代碼部分中定義變量。

從而導致類似的東西:

.386 
.model flat, stdcall 
option casemap:none 
include \masm32\include\masm32rt.inc 
.code 
start: 
    mov stuff, 1 
    ret 


stuff dd ? 

end start 

不幸的是,這將導致分段錯誤,我想不通爲什麼。

另一個例子:

.386 
.model flat, stdcall 
option casemap:none 
include \masm32\include\masm32rt.inc 
.code 
start: 
    invoke MessageBoxA, 0, offset hello, offset hello, MB_OK 
    ret 


hello db  "Hello buddy", 0 

end start 

這一個沒有編制,作爲Hello變量在編譯未知(組裝:P)時,這似乎是合法的給我,但然後呢是方式?

+0

這很奇怪,但我的文章的第一行系統地刪除,即使我編輯它...但我確實打招呼:p – FTW

+0

根據網站政策,你不應該添加諸如「你好,」和「感謝您的幫助」到您的文章。這可能是爲什麼網站自動刪除那些(?) – fuz

+0

哦...好吧然後 – FTW

回答

1

作爲惡意軟件防護的一部分,大多數操作系統都不允許寫入代碼段。使其更難以感染代碼。 :-)

invoke是一個宏,在編譯時可能需要查看它的所有參數,所以它可以正確擴展。它不能輕易使用代碼中稍後出現的內容,因此您必須確保它出現得更早。這裏,例如,hello的地址將取決於宏擴展的大小。

對數據的引用(如在您的mov stuff,1中),具有固定的大小,可稍後進行修正。也許在彙編程序或鏈接程序的第二遍中。

+0

我真的不明白你的觀點。難道我們不完全是爲了這個問題而搬遷嗎? – fuz

+0

好的爲了調用,我做了一些測試,它的工作原理,但**的東西**?我不確定明白我應該做什麼。使用LOCAL變量? – FTW

+0

fuz:我忽略它是什麼 – FTW