問題タブ [kernel-mode]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
debugging - カーネル モード デバッグよりもユーザー モード デバッグに利点はありますか?
私が理解していることから、大まかに言えば、ユーザーモードのデバッグにより、プロセスのプライベート仮想アドレスへのアクセスが提供されます。デバッグ セッションはそのプロセスに限定されており、他のプロセスの仮想アドレス空間/データを上書きまたは改ざんすることはできません。
カーネルモードデバッグは、元のプロセスアドレス空間に加えて、複数のリソースへのフルアクセスを必要とする他のドライバーとカーネルプロセスへのアクセスを提供することを理解しています。
このことから、カーネル モードのデバッグは、ユーザー モードのデバッグよりも堅牢に見えると考えるようになります。これは私に疑問を投げかけます.デバッグモードの両方のオプションが利用可能である場合、より堅牢なカーネルモードよりもユーザーモードを選択することが理にかなっていますか?
私はまだ概念にかなり慣れていないので、2 つのモードについて間違って考えているのかもしれません。私が見逃している可能性のあるものをよりよく理解するために、そこにも洞察をいただければ幸いです。多くの人がカーネルのデバッグを避けようとしていることに気付いたようです。より堅牢に見えるので、その理由は完全にはわかりません。
c - C とメモリ内のリソース保護
C プログラムをコンパイルすると、機械が理解できるコードが生成されるだけです。このコードは、この質問からわかるように、ハードウェア上で直接実行できます。
だから私の質問は:
C プログラムをハードウェア上で直接実行できる場合、カーネルはこのプログラムのリソース割り当てをどのように処理できますか?
コンパイラから生成された実行可能ファイルが純粋にマシンが理解できる形式である場合、特権モードと非特権モードはどのように機能するのでしょうか?
プログラムがカーネルを介さずにハードウェア上で直接実行できる場合、カーネルはハードウェア リソースの許可をどのように管理しますか?
linux-kernel - Linux カーネル モードで、ユーザー空間コマンドを実行する方法
カーネル モードで execve をフックします (system_call_table エントリ __NR_execve を関数に変更します)。ELFのアセンブリコードを確認したい。害がある場合は実行せずにそのまま戻ります。
Linuxモジュールを書いています。Linux カーネル モードで、objdump を使用して ELF ファイルを分解したいと考えています。ユーザーモードで objdump を実行し、カーネルモードに戻りたいです。これは可能ですか?ありがとうございました。
windbg - Windows でカーネル デバッグ中のプロセスを開始する方法は?
カスタム エディションの自己入力パスワードである TryeCrypt によって暗号化されたハード ドライブがあり、MBR デバッグを介してこの 40 バイトのパスワードを見つけましたが、標準バージョン 7.1a を使用してマウントできません。
私が欲しいのは、このハードドライブからいくつかのファイルを取得することです。良いニュースは、このハードドライブは起動可能で、Windows XP SP2 ですが、フルスクリーンアプリは自動起動し、入力 (キーボード、マウスなど) はブロックされていたためです。 、それに触れる唯一の方法は、vmware gdb stub を使用してデバッグすることです。
ida のリモート dbg デバッガーは非常にうまく機能しています。ゲストのメモリにアクセスし、コードを編集し、ブレークポイントを設定すると、シンボルが読み込まれました。
問題は、カーネルにパッチを適用してプロセスを開始するにはどうすればよいですか?
私が考えているのは、winddk プロジェクトをビルドし、ユーザー APC でこれを行うドライバーを実装し、逆アセンブルしてアセンブラー コードを取得し、ida を介してゲストにパッチを適用することです。
何か案が?ありがとう。
c++ - これをロックせずに同期する方法はありますか?
上位層から呼び出すことができる 3 つの関数があるとします。
Start
- まだ開始されていない場合、または Stop が以前に呼び出された場合にのみ呼び出されますStop
- Start の呼び出しが成功した後にのみ呼び出されますProcess
-いつでも(異なるスレッドで同時に) 呼び出すことができます。開始された場合、下位層を呼び出します
では、すべての呼び出しが下位層への呼び出しを終了するまでStop
待機し、それ以上の呼び出しを防止する必要があります。Process
ロック メカニズムを使用すると、次の疑似コードを作成できます。
ロック機構なしで同じ動作を実現する方法はありますか? おそらく、InterlockedCompareExchange と InterlockedIncremenet/InterlockedDecrement のいくつかの凝った使い方でしょうか?
私が尋ねる理由は、これがネットワーク ドライバーのデータ パスにあり、ロックを持たないことを本当に望んでいるからです。
sockets - カーネル モジュールは、netlink を使用してユーザー空間にメッセージを送信するために主導権を握ることができますか?
hereからコピーした次のコードを実行しようとしています。古いカーネルバージョンで実行するために、いくつかの変更を加えました。
カーネル モジュールを挿入するとnlmsg_multicast()
失敗し、のようにログに記録さnlmsg_multicast() error: -3
れ/var/log/messages
ます。ユーザー空間プログラムの実行中にsocket()
失敗します。
まさに私がやりたいことは、
- カーネルモジュールは、ユーザー空間のプロセスに関係なくソケットを作成します
- カーネルモジュールはいくつかのイベントをユーザー空間に送信します
- ユーザー空間内のプロセスがイベントに応答する場合、その応答に対するカーネル モジュール プロセス
そのため、イベントに応答できるプロセスがユーザー空間にない場合があります。その場合でも、モジュールはイベントを送信し、応答をしばらく待つ必要があります。
カーネル モジュールからユーザー空間のプロセスに最初のメッセージを送信することは可能ですか? これどうやってするの?
カーネル モジュール コード:
メイクファイル
foo.c
ユーザー空間プログラム:
(でコンパイルgcc somename.c
)
お時間をいただきありがとうございます!