[問題] 請問函數指標常被用來寫病毒嗎??

看板C_and_CPP (C/C++)作者 (處處留心皆正妹)時間12年前 (2013/11/19 13:25), 編輯推噓7(7018)
留言25則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux + GCC 問題(Question): 1.我在Wikipedia看到Pointer的條目時,介紹function pointer時 說這個功能常被用來寫惡意程式,google找了一下 說函數指標可以用來寫常駐程式的關係,所以常被拿來寫病毒?? 2.參考以下程式碼,有關於函數的記憶體位置,我執行後的結果是 function Add address => 0x400581 function Minus address => 0x400593 function main func address => 0x4004a8 令我感到疑惑的是, main 這個function的 stack frame不是在比較高的位址上嗎? 但是這邊的位址卻是最低的. 還是說函數的位址是在編譯時期就決定好了呢?? 為什麼位址上 Minus > Add > main function 呢? Thanks! 程式碼(Code):(請善用置底文網頁, 記得排版) int doAdd(int, int); int doMinus(int, int); int main(void) { printf("function Add address => %p\n",doAdd); printf("function Minus address => %p\n",doMinus); printf("function main func address => %p\n",main); return 0; } int doAdd(int a, int b) { return a + b; } int doMinus(int a, int b) { return a - b; } 補充說明(Supplement): -- 你的行動或許沒有意義,但你還是非做不可。 這不是為了改變世界,而是為了讓你成為不會被世界改變的那個人. – 甘地(Mahatma Gandhi) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.167.59.69 ※ 編輯: HowLeeHi 來自: 118.167.59.69 (11/19 13:25)

11/19 13:54, , 1F
編譯就決定好的是absolute address
11/19 13:54, 1F

11/19 13:55, , 2F
當函示要載入記憶體會在relocation 加上OS有page機制
11/19 13:55, 2F

11/19 13:55, , 3F
寫病毒不會那麼容易
11/19 13:55, 3F

11/19 15:42, , 4F
但 main 的stack fram 為啥比較低?
11/19 15:42, 4F

11/19 15:43, , 5F
stack 不是往下長 所以func位址應該遞減 為啥遞增?
11/19 15:43, 5F

11/19 16:56, , 6F
這篇印出來的位址跟 stack frame 一點關係也沒有
11/19 16:56, 6F

11/19 16:57, , 7F
另外什麼上、下、高、低,意義也不大,沒規定位址0一定要
11/19 16:57, 7F

11/19 16:57, , 8F
放哪個方向,要說他是最上也行,最下也行
11/19 16:57, 8F

11/19 18:00, , 9F
函數code不是放在stack裡好嗎...
11/19 18:00, 9F

11/19 19:52, , 10F
放在stack的是return的address 和區域變數
11/19 19:52, 10F

11/19 20:39, , 11F
善用你的反組譯器...
11/19 20:39, 11F

11/19 23:26, , 12F
意思應該是說code 就放在code segment 位址隨便
11/19 23:26, 12F

11/19 23:28, , 13F
所以原po問的 位址會高低是因為在code section
11/19 23:28, 13F

11/19 23:30, , 14F
code擺放是沒有一定規則
11/19 23:30, 14F

11/19 23:30, , 15F
只是剛好原po例子 main 裡面放在低位址的地方
11/19 23:30, 15F

11/19 23:31, , 16F
但如果是去觀察呼叫函式 return address在stack frame
11/19 23:31, 16F

11/19 23:32, , 17F
的擺放 則會發現return address位址一律還是由高往低
11/19 23:32, 17F

11/19 23:33, , 18F
總結就是code 歸code section的擺放 (沒有規則)
11/19 23:33, 18F

11/19 23:33, , 19F
但stack frame 是由高往低長 這兩者搞混而已
11/19 23:33, 19F

11/19 23:34, , 20F
我這樣解釋對嗎? 煩請高手指正! Orz
11/19 23:34, 20F

11/19 23:46, , 21F
code擺放是有規則的,要看header
11/19 23:46, 21F

11/19 23:48, , 22F
用WINDOWS的話研究一下PE/PEB/TEB/shared userdata
11/19 23:48, 22F

11/19 23:49, , 23F
import table/reloc section也可以看一下
11/19 23:49, 23F

11/19 23:50, , 24F
至於ring 0那些我等級沒到那裡
11/19 23:50, 24F

11/20 05:16, , 25F
啊...我反組譯一下,發現搞錯section了@@感謝各位
11/20 05:16, 25F
文章代碼(AID): #1IYlPAaC (C_and_CPP)
文章代碼(AID): #1IYlPAaC (C_and_CPP)