Windows とネイティブ API のシステムコール?
-
21-09-2019 - |
質問
最近、*NIX オペレーティング システムでアセンブリ言語をよく使用しています。Windowsドメインについて疑問に思っていました。
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
両方は同じものを指す別の用語ですか?確認するために、2 つの非公式情報源からこれらを比較しました。
システムコール: http://www.metasploit.com/users/opcode/syscalls.html
ネイティブAPI: http://undocumented.ntinternals.net/aindex.html
私の観察:
- すべてのシステムコールは文字で始まります
Nt
ここで、ネイティブ API は文字で始まらない多くの関数で構成されていますNt
. System Call of windows
のサブセットですNative API
. 。システムコールはネイティブ API の一部にすぎません。
誰かこれを確認して説明してもらえませんか。
編集:
別の答えがありました。2回目の回答でした。とても気に入ったのですが、なぜ回答者さんが削除したのかわかりません。私は彼に彼の答えを再投稿するよう要求します。
解決
手動のシステムコールを行いません。あなたはあなたのためにそれを行うにNTDLLとネイティブAPIを使用します。
ネイティブAPIは、単に物事のkernelmode側のラッパーです。それがないすべてが正しいAPIのためのシステムコールを実行している。
あなたの全体の質問が冗長であるので、あなたが手動でシステムコールに必要なことはありません。
Linuxのシステムコールのコードは、あなたが(NTDLL別名)余分な抽象化層を介して作業する必要がある理由だない変更、WindowsののDOを行います。
EDITます:
また、あなたは、アセンブリレベルで作業している場合でも、あなたはまだのWin32 APIへのフルアクセス権を持っている、そもそもNTのAPIを使用することにする理由はありません!輸入、輸出などのアセンブリプログラムですべての作業だけで結構ます。
EDIT2ます:
あなたが本当にマニュアルシステムコールを行いたい場合は、あなたは、関連する各Windowsのバージョン用のNTDLLを逆転(PEB経由)バージョン検出を追加し、各呼び出しのためのシステムコールルックアップを実行する必要があるとしている。
しかし、それは愚かなことでしょう。 NTDLLは理由があります。
人々はすでにリバース・エンジニアリングの一部を行っている:参照ます。https://j00ru.vexillium各Windowsカーネルのシステムコール番号のテーブルのための.org /システムコール/ NT / 64 / に。 (注後の行ものWindows 10のバージョン間の変更を行うことを)繰り返しますが、これは個人的な使用のみの実験の悪い考えの外では、より多くのASMおよび/またはWindowsの内部について学ぶために、独自のマシン上にあります。あなたは他の誰に配布することをコードにないインラインシステムコールを行います。
他のヒント
は、Windowsのシステムコール規則について知っておく必要がある他の事は、私はそれを理解するようシステムコールテーブルがビルドプロセスの一部として生成されていることです。彼らは単に変更することができます。この意味 - 誰トラックそれら。誰かがリストの先頭に新しいものを追加した場合、それは問題ではありません。 NTDLLを呼び出し、誰もがまだ動作しますので、NTDLLはまだ、働きます。
でも、メカニズムは、システムコール(int型、またはSYSENTER)を実行するために使用される石で固定されておらず、過去に変更されている、と私はワンス・アポン・ア・タイムウィンドウの同じバージョンが異なるエントリのメカニズムを使用する別のDLLを使用することを考えますマシンのCPUに依存します。
Windowsのシステムコールは、通常のサブルーチンコールで行われkernel32.dll
またはgdi32.dll
、などのシステムDLLに呼び出すことによって実行されます。 OSの特権層に捕捉するためのメカニズムは文書化されていないが、kernel32.dll
のようなのDLLはあなたのためにこれを行うので、それは大丈夫ですされます。
システムコールによって、私はCreateProcess()
またはGetWindowText()
などの文書化のWindows APIエントリー・ポイントを参照しています。デバイスドライバは、通常のWindows DDKは異なるAPIを使用します。
私は、アセンブリ(教育運動など)がない輸入でWindows API呼び出しを行うに興味がありました。これは、Windows(Win10 1803バージョン10.0.17134)の私の64ビット版のラフデモだし、それは呼び出し後にクラッシュしたが、それが成功したように、システムコールの戻り値がゼロです。すべては呼び出し規約のWindowsのx64ごとに設定され、その後、システムコール番号はRAXにロードされ、それが呼び出しを実行するためのシステムコールアセンブリ命令です。それは、「管理者として」を実行する必要があるので、\ HelloWorldFile_FASM
:私の例では、ファイルcを作成します。format PE64 GUI 4.0
entry start
section '.text' code readable executable
start:
;puting the first four parameters into the right registers
mov rcx, _Handle
mov rdx, [_access_mask]
mov r8, objectAttributes
mov r9, ioStatusBlock
;I think we need 1 stack word of padding:
push 0x0DF0AD8B
;pushing the other params in reverse order:
push [_eaLength]
push [_eaBuffer]
push [_createOptions]
push [_createDisposition]
push [_shareAcceses]
push [_fileAttributes]
push [_pLargeInterger]
;adding the shadow space (4x8)
; push 0x0
; push 0x0
; push 0x0
; push 0x0
;pushing the 4 register params into the shadow space for ease of debugging
push r9
push r8
push rdx
push rcx
;now pushing the return address to the stack:
push endOfProgram
mov r10, rcx ;copied from ntdll!NtCreateFile, not sure of the reason for this
mov eax, 0x55
syscall
endOfProgram:
retn
section '.data' data readable writeable
;parameters------------------------------------------------------------------------------------------------
_Handle dq 0x0
_access_mask dq 0x00000000c0100080
_pObjectAttributes dq objectAttributes ; at 00402058
_pIoStatusBlock dq ioStatusBlock
_pLargeInterger dq 0x0
_fileAttributes dq 0x0000000000000080
_shareAcceses dq 0x0000000000000002
_createDisposition dq 0x0000000000000005
_createOptions dq 0x0000000000000060
_eaBuffer dq 0x0000000000000000 ; "optional" param
_eaLength dq 0x0000000000000000
;----------------------------------------------------------------------------------------------------------
align 16
objectAttributes:
_oalength dq 0x30
_rootDirectory dq 0x0
_objectName dq unicodeString
_attributes dq 0x40
_pSecurityDescriptor dq 0x0
_pSecurityQualityOfService dq securityQualityOfService
unicodeString:
_unicodeStringLength dw 0x34
_unicodeStringMaxumiumLength dw 0x34, 0x0, 0x0
_pUnicodeStringBuffer dq _unicodeStringBuffer
_unicodeStringBuffer du '\??\c:\HelloWorldFile_FASM' ; may need to "run as adinistrator" for the file create to work.
ioStatusBlock:
_status_pointer dq 0x0
_information dq 0x0
securityQualityOfService:
_sqlength dd 0xC
_impersonationLevel dd 0x2
_contextTrackingMode db 0x1
_effectiveOnly db 0x1, 0x0, 0x0
私はNTDLL!NtCreateFileのドキュメントを使用し、私も見にカーネルデバッガを使用してのparamsの多くをコピーします。
__kernel_entry NTSTATUS NtCreateFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER AllocationSize OPTIONAL,
IN ULONG FileAttributes,
IN ULONG ShareAccess,
IN ULONG CreateDisposition,
IN ULONG CreateOptions,
IN PVOID EaBuffer OPTIONAL,
IN ULONG EaLength
);
WindowsでOFFICIAL呼び出し規約: http://msdn.microsoft.com /en-us/library/7kcdt6fy.aspxする
(将来的には、このリンク生き残るを願っています。そうでない場合は、ちょうどMSDNの「x64のソフトウェアの規則」で検索)。
のLinuxおよびWindows x86_64でのコンベンション異なっを呼び出す機能。両方のABIにおいて、パラメータは、好ましくは、レジスタを介して渡されているが、使用するレジスタが異なります。 LinuxのABIは、 http://www.x86-64.orgで発見することができ、より上/documentation/abi.pdfする