-1
倒車時,我們看到一些模塊間呼叫,如call dword ds:[004000238h]
或call dword ptr ds:_imp_atoi
。
爲什麼它使用數據段而不是使用代碼段(CS
)?爲什麼我們使用DS來調用過程?
倒車時,我們看到一些模塊間呼叫,如call dword ds:[004000238h]
或call dword ptr ds:_imp_atoi
。
爲什麼它使用數據段而不是使用代碼段(CS
)?爲什麼我們使用DS來調用過程?
call dword ds:[004000238h]
是間接近調用,它在004000238h閱讀DWORD的值,並用它來撥打電話。
請注意,方括號和dword ptr
是確定指令類型的地方。由於指令的操作數是內存操作數,因此隱式地使用DS
來讀取它(反彙編器使用段覆蓋語法顯示它)。
呼叫接近(保護模式下的遠程呼叫很少見,並且帶有特殊的語義),因此CS
的當前值不會改變。
我們可以說CS
是隱式使用的,因爲調用是相對於當前值CS
而言的。
Intel manual 3描述了protected mode中的調用機制。作爲一個說明,即使對於32位系統,分段也被禁用(所有描述符都有基址爲零),所以你可以忘記選擇寄存器,但是對於TLS和SEH(通常使用fs
/gs
寄存器)。
爲什麼我們需要導入地址表,即使在c中的靜態鏈接模塊中。我認爲IAT用於動態鏈接 –
@ user7445340沒有一個具體的例子很難說,但Windows API主要是作爲用戶空間DLL實現的。 C運行時仍然需要加載像'user32'和'kernel32'這樣的庫。 –