質問

最近、*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

私の観察:

  1. すべてのシステムコールは文字で始まります Nt ここで、ネイティブ API は文字で始まらない多くの関数で構成されています Nt.
  2. System Call of windows のサブセットです Native API. 。システムコールはネイティブ API の一部にすぎません。

誰かこれを確認して説明してもらえませんか。

編集:

別の答えがありました。2回目の回答でした。とても気に入ったのですが、なぜ回答者さんが削除したのかわかりません。私は彼に彼の答えを再投稿するよう要求します。

役に立ちましたか?

解決

あなたがアセンブリWindowsでプログラミングをやっている場合は、

手動のシステムコールを行いません。あなたはあなたのためにそれを行うに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を使用します。

私はアセンブリNTDLL!NtCreateFileが何を行うには、次のFASMを書いたように、私は、アセンブリ(教育運動など)がない輸入で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する

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top