2010-03-22 91 views
21

最近我在* NIX操作系統中使用了很多彙編語言。我想知道的Windows域。Windows和Native API中的系統調用?


在Linux調用約定:

mov $SYS_Call_NUM, %eax 
mov $param1 , %ebx 
mov $param2 , %ecx 
int $0x80 

完蛋了。這就是我們應該如何在Linux中進行系統調用。

所有系統的引用調用在Linux中:

關於這$ SYS_Call_NUM &哪些參數,我們可以利用這個參考:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

官方參考:http://kernel.org/doc/man-pages/online/dir_section_2.html


調用約定在Windows中:

???所有系統的

引用調用Windows中:

???

非官方:http://www.metasploit.com/users/opcode/syscalls.html,但是除非我知道調用約定,否則我如何在彙編中使用它們。

正式:???

  • 如果你說,他們沒有記錄它。那麼如何在不知道系統調用的情況下爲Windows編寫libc?如何做一個Windows Assembly編程?至少在驅動程序編程中需要知道這些。對?

現在,怎麼了所謂的原生API?是Native API & System calls for windows這兩個術語是指不同的術語?爲了證實我比較了這兩個非官方渠道

系統調用:http://www.metasploit.com/users/opcode/syscalls.html

的Native API:http://undocumented.ntinternals.net/aindex.html

我的意見:

  1. 所有的系統調用都用字母Nt其中的開始Native API由很多不以字母Nt開頭的函數組成。
  2. System Call of windowsNative API的子集。系統調用只是Native API的一部分。

任何人都可以證實這一點並解釋。

編輯:

有另一種答案。這是第二個答案。我真的很喜歡它,但我不知道爲什麼回答者已經刪除它。我請他重新發布他的答案。

+0

另請參閱:http://stackoverflow.com/questions/919051/finding-undocumented-apis-in-windows – claws 2010-03-22 18:12:46

+1

您的metasploit鏈接已損壞... – Calmarius 2013-08-23 13:03:09

回答

20

如果你在Windows下進行彙編編程,你不需要手動系統調用。您使用NTDLL和Native API爲您執行此操作。

Native API只是一個包裝內核模式的東西。它所做的只是爲正確的API執行系統調用。

你應該永遠不需要手動系統調用,所以你的整個問題是多餘的。

Linux系統調用代碼不會改變,Windows是這樣做的,這就是爲什麼您需要通過額外的抽象層(又名NTDLL)。

編輯:

而且,即使你在組件級別的工作,你仍然可以完全訪問Win32 API的,沒有理由使用NT API以開始!在彙編程序中,導入,導出等工作都很好。

EDIT2:

如果你真的想這樣做手工系統調用,你將需要扭轉NTDLL每個相關的Windows版本,加入版本檢測(通過PEB),併爲每個執行系統調用查詢呼叫。

但是,這將是愚蠢的。 NTDLL是有原因的。

+0

+1謝謝。你能不能示範一些演示如何使用匯編語言使用WIN32 API和NT API的代碼示例。 – claws 2010-03-22 04:49:54

+0

你在用什麼彙編語言?如果你使用MASM,最簡單的方法就是使用'INVOKE'。 我發現的第一個谷歌搜索結果是: http://www.movsd.com/masm.htm – RaptorFactor 2010-03-22 05:09:13

+2

簡短而簡潔的文章,對這個答案是一個很好的補充:http://www.codeproject。 com/KB/system/Win32.aspx – claws 2010-03-22 18:14:33

1

通過調用系統DLL(例如kernel32.dllgdi32.dll)來執行Windows系統調用,這是使用普通的子例程調用完成的。捕獲到操作系統特權層的機制沒有記錄,但這是可以的,因爲像kernel32.dll這樣的DLL可以爲你做到這一點。

而通過系統調用,我指的是文檔化的Windows API入口點,如CreateProcess()GetWindowText()。設備驅動程序通常會使用Windows DDK中的不同API。

+0

1.如何在彙編語言程序中使用這些鏈接? 2. Windows API和系統調用不是一回事。 WINDOWS API *使用*系統調用。在Linux域上類似的類比將是POSIX API(WINDOWS API)使用由Linux內核(windows kernel)提供的系統調用。所以,我關心的是* true *系統調用。 – claws 2010-03-22 03:44:24

+2

我知道API調用和陷阱進入操作系統特權層(你稱之爲「真正的」系統調用)是有區別的。這些「真正的」系統調用是Windows系統DLL的實現細節。你可以通過反彙編DLL和查看程序集來弄清楚它們是如何工作的。或者你可以編寫你的彙編代碼來適當地調用DLL ......這是可能的。 – Will 2010-03-22 03:56:43

0

正式在Windows調用約定:http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx

(希望這個鏈接生存的未來;如果沒有,只是搜索MSDN上的「64軟件約定」)。

函數調用約定在Linux x86_64的Linux &中有所不同。在兩個ABI中,參數最好通過寄存器傳遞,但使用的寄存器不同。更多關於Linux ABI可以在http://www.x86-64.org/documentation/abi.pdf

+0

這並沒有回答這個問題,這是關於調用內核模式的慣例。這是用於用戶模式函數調用約定的,這是非常不同的。並完整記錄。 – Stewart 2013-05-11 17:42:18

7

你需要知道的關於windows系統調用約定的另一件事是,據我瞭解,syscall表是作爲構建過程的一部分生成的。這意味着他們可以簡單地改變 - 沒有人跟蹤他們。如果有人在列表頂部添加一個新的,那沒關係。 NTDLL仍然有效,所以其他所有調用NTDLL的人仍然可以工作。

甚至用於執行系統調用(其中int或sysenter)的機制不是固定的,並且已經改變了過去,我認爲曾經一次,相同版本的Windows使用不同的DLL使用不同的條目機制取決於機器中的CPU。

+1

+1,因爲我覺得這很有趣。你有什麼資源(互聯網或書籍),可以瞭解更多關於這種Win32 API /系統調用內部的知識嗎? – stakx 2010-04-30 19:34:49

+3

這是有點過時,但內部Windows 2000涵蓋了這個我認爲。 http://www.nynaeve.net/?p=48有一個很好的討論,並且還演示了在x86和x64的Windows上最後有三個系統調用約定。 IA64可能會做一些完全不同的事情,當然還有Alpha,PowerPC,MIPS等等。 當然,通常的警告適用 - 所有無證和可能會改變。 – Stewart 2010-04-30 21:44:12