28

最近、*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 windowsboth は同じものを指す別の用語ですか? 確認するために、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回目の回答でした。とても気に入りましたが、回答者が削除した理由がわかりません。私は彼に彼の答えを再投稿するように頼みます。

4

5 に答える 5

31

Windows でアセンブリ プログラミングを行っている場合、手動の syscall は行いません。これを行うには、NTDLL とネイティブ API を使用します。

ネイティブ API は、単なるカーネルモード側のラッパーです。正しい API の syscall を実行するだけです。

質問全体が冗長になるように、手動で syscall する必要はありません。

Linux syscall コードは変更されませんが、Windows は変更されます。そのため、追加の抽象化レイヤー (別名 NTDLL) を介して作業する必要があります。

編集:

また、アセンブリ レベルで作業している場合でも、Win32 API に完全にアクセスできます。最初から NT API を使用する必要はありません。アセンブリ プログラムでは、インポート、エクスポートなどはすべて正常に機能します。

EDIT2:

本当に手動で syscall を実行したい場合は、関連する Windows バージョンごとに NTDLL をリバースし、(PEB を介して) バージョン検出を追加し、呼び出しごとに syscall ルックアップを実行する必要があります。

しかし、それはばかげているでしょう。NTDLL には理由があります。

リバース エンジニアリングの部分は既に行われています。各 Windows カーネルのシステム コール番号の表については、https ://j00ru.vexillium.org/syscalls/nt/64/ を参照してください。(以降の行は、Windows 10 のバージョン間でも変更されることに注意してください。) 繰り返しますが、これは、自分のマシンで asm や Windows 内部について詳しく学ぶための個人使用のみの実験以外では、悪い考えです。他の人に配布するコードにシステム コールをインライン化しないでください。

于 2010-03-22T04:07:11.483 に答える
8

Windows syscall 規則について知っておく必要があるもう 1 つのことは、私が理解しているように、syscall テーブルはビルド プロセスの一部として生成されるということです。これは、それらが単純に変更できることを意味します-誰もそれらを追跡しません. 誰かがリストの一番上に新しいものを追加したとしても、それは問題ではありません。NTDLL は引き続き機能するため、NTDLL を呼び出す他のすべてのユーザーは引き続き機能します。

システムコール (int または sysenter) を実行するために使用されるメカニズムでさえ、固定されておらず、過去に変更されています。マシンの CPU。

于 2010-04-30T19:28:41.640 に答える
1

kernel32.dllWindows システム コールは、やなどのシステム DLL を呼び出すことによって実行されgdi32.dllます。これは、通常のサブルーチン コールで行われます。OS 特権レイヤーにトラップするメカニズムは文書化されていませんが、DLLkernel32.dllがこれを行うのが好きなので問題ありません。

また、システム コールによって、ドキュメント化された Windows API エントリ ポイントCreateProcess()( や など) を参照していますGetWindowText()。デバイス ドライバーは通常、Windows DDK とは異なる API を使用します。

于 2010-03-22T03:37:22.500 に答える
-3

公式 Windows での呼び出し規則: http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx

(このリンクが今後も存続することを願っています。存続しない場合は、MSDN で「x64 Software Conventions」を検索してください)。

関数呼び出し規約は Linux と Windows x86_64 で異なります。両方の ABI で、パラメーターはレジスター経由で渡されることが望ましいですが、使用されるレジスターは異なります。Linux ABI の詳細については、http: //www.x86-64.org/documentation/abi.pdf を参照してください。

于 2010-03-23T19:23:48.633 に答える