2010-03-22 11 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, но как использовать их в сборке, если я не знаю соглашение о вызове.

ОФИЦИАЛЬНО: ???

  • Если вы скажете, они не задокументировали это. Тогда как можно писать libc для Windows, не зная системных вызовов? Как собираются программировать Windows Assembly? По крайней мере, в программировании драйвера нужно знать это. правильно?

Теперь, Что с так называемой Native API? Is 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 windows Подмножество Native API. Системные вызовы являются частью Native API.

Может ли кто-нибудь подтвердить это и объяснить.

EDIT:

Был еще один ответ. Это был второй ответ. Мне очень понравилось, но я не знаю, почему ответчик удалил его. Я прошу его передать ответ.

+0

Также читайте это: http://stackoverflow.com/questions/919051/finding-undocumented-apis-in-windows – claws

+1

Ваши ссылки на метаслои нарушены ... – Calmarius

ответ

20

Если вы программируете сборку под Windows, вы не выполняете системные вызовы вручную. Для этого вы используете NTDLL и Native API.

Native API - это просто обертка вокруг стороны kernelmode. Все, что он делает, это выполнить syscall для правильного API.

Вам НИКОГДА не потребуется вручную использовать системный вызов, чтобы весь ваш вопрос был лишним.

Код syscall для Linux не изменяется, Windows делает это, поэтому вам нужно работать с дополнительным уровнем абстракции (иначе NTDLL).

EDIT:

Кроме того, даже если вы работаете на уровне сборки, вы по-прежнему иметь полный доступ к API Win32, нет никаких причин, чтобы с помощью NT API для начала! Импорт, экспорт и т. Д. Все работает отлично в программах сборки.

EDIT2:

Если вы действительно хотите сделать вручную системные вызовы, вы будете нуждаться в обратном Ntdll для каждой соответствующей версии Windows, добавьте определение версии (через ПЭБ), а также выполнять поиск системных вызовов для каждого вызов.

Однако, это было бы глупо. NTDLL существует не просто так.

+0

+1 и спасибо. Можете ли вы любезно показать примерный код, демонстрирующий, как использовать API-интерфейс WIN32 API и NT с языка ассемблера. – claws

+0

Какой ассемблер вы используете? Например, если вы используете MASM, самым простым способом было бы просто использовать «INVOKE». Первый результат Google, который я нашел, охарактеризовал это: http://www.movsd.com/masm.htm – RaptorFactor

+2

Краткая и краткая статья, которая является отличным дополнением к этому ответу: http: //www.codeproject. com/KB/system/Win32.aspx – claws

1

Системные вызовы системы Windows выполняются путем вызова в системные DLL, такие как kernel32.dll или gdi32.dll, что осуществляется с помощью обычных вызовов подпрограмм. Механизмы захвата в привилегированный уровень ОС недокументированы, но это нормально, потому что DLL, например kernel32.dll, делают это за вас.

И системные вызовы, я имею в виду документированные точки входа Windows API, такие как CreateProcess() или GetWindowText(). Драйверы устройств обычно используют другой API из Windows DDK.

+0

1. Как я буду использовать их в программировании на языке ассемблера? ? 2. Windows API и системные вызовы - это не одно и то же. WINDOWS API * использует * системные вызовы. Аналогичная аналогия в домене linux будет POSIX API (WINDOWS API), используя системные вызовы, предоставляемые ядром linux (ядро Windows). Итак, я беспокоюсь о системных вызовах * true *. – claws

+2

Я понимаю, что существует разница между вызовами API и ловушками на привилегированный уровень ОС (что вы называете «истинными» системными вызовами). Эти «настоящие» системные вызовы представляют собой детализация системных DLL-систем Windows. Возможно, вам удастся выяснить, как они работают, разобрав библиотеки DLL и посмотрев на сборку. Или вы можете просто написать свой код сборки, чтобы позвонить в DLL, если это необходимо ... это возможно. – Will

0

ОФИЦИАЛЬНЫЙ соглашение о вызовах в Windows: http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx

(надеюсь, что эта связь сохраняется в будущем, если это не так, просто для поиска «x64 Software конвенций» на MSDN).

Функция вызова соглашения отличается в Linux & Windows x86_64. В обоих ABI параметры предпочтительно передаются через регистры, но используемые регистры различаются. Более подробно о Linux ABI можно узнать по адресу http://www.x86-64.org/documentation/abi.pdf

+0

Это не отвечает на вопрос, касающийся соглашения о вызове в режим ядра. Это для режима вызова функции пользовательского режима, что совсем другое. И полностью задокументирован. – Stewart

7

Другое, что вам нужно знать о соглашении с sysall окна, заключается в том, что, как я понимаю, таблицы syscall генерируются как часть процесса сборки. Это означает, что они могут просто измениться - никто их не отслеживает. Если кто-то добавляет новый в верхней части списка, это не имеет значения. NTDLL по-прежнему работает, поэтому все остальные, кто звонит в NTDLL, все еще работают.

Даже механизм, используемый для выполнения системных вызовов (который int или sysenter) не исправлен в камне и не изменился в прошлом, и я думаю, что когда-то одна и та же версия Windows использовала разные библиотеки DLL, которые использовали разные записи механизмов в зависимости от процессора в машине.

+1

+1 потому что я нашел это очень интересным. Есть ли у вас какие-либо ресурсы (интернет или книги), где можно узнать больше об этом виде API-интерфейса Win32 API/syscall? – stakx

+3

Немного устаревший, но, думаю, внутри Windows 2000 это охватывает. http://www.nynaeve.net/?p=48 имеет приятное обсуждение, а также демонстрирует, что на окнах на x86 и x64 используются три соглашения об общих вызовах. IA64, вероятно, делает что-то совершенно другое, и тогда, конечно, появились Alpha, PowerPC, MIPS и, возможно, другие. Конечно, применяется обычное оговорку - все недокументированные и, вероятно, могут измениться. – Stewart

Смежные вопросы