問題タブ [kernel-extension]
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.
c++ - このキーボードインターセプトカーネル拡張が機能しないのはなぜですか?
私の仲間の開発者!少なくとも一部の皆さんが、この質問に含まれるテキストの量に恐れを感じないことを願っています(私は、人道的に可能な限り説明的になるように最善を尽くしました)。:)
マルウェアか何かを書くために私がこの質問をしたと思う人たちへ。OSの起動終了後に起動するアプリケーションをユーザーが選択できるアプリケーションを作成したいと思います。全体的なアイデアは、ユーザーが以前にアプリにバインドされたホットキーを押して、OSの起動が完了する前にこれらのアプリを選択できるようにすることです。たとえば、ユーザーはMacの電源を入れ、SMTVと入力して消えます。システムの起動が完了すると、アプリが入力を復元し、Safari、Mail、Tweetie、Vuzeを起動します。私はSOに不慣れですが、他の人の質問に答えることで他の人を助けるために最善を尽くします-見返りに同じことを期待できると思います。私のプロフィールと活動を確認し、その後マルウェアについて叫び始めます。
この質問は、 Mac OSの起動中に行われたキーボード入力を回復することは可能ですか?という質問のフォローアップです。。
Pekkaのアドバイスに導かれて、ChristianStarkjohannによるInterceptingKeyboard Eventsの記事に出くわしました。彼と、 ObjectiveDevelopmentチームがiBookのCDROMイジェクトキーをF12からShift+F12に再割り当てすることに成功した方法を説明しています。主な部分は、彼らが実際にキーボードイベントを傍受したことです。これが私が必要としていることです。結局、Christianは、私のような開発者がiJectのアイデアを同様の機能のプロトタイプとして使用できるように、この記事を正確に作成しました。
まず、ユーザーのキーボード入力をに記録するだけの単純なカーネル拡張機能を作成することにしました/var/log/kernel.log
。XCodeで新しいGenericKernelExtensionプロジェクトを開始し、Hello Kernel:Mac DevCenterのKernelExtensionConceptsにあるXcodeを使用したカーネル拡張の作成チュートリアルの指示に従ってHelloWorldプロジェクトを作成し、そこから取得したコードを詰め込みました。 iJectソース。結果は次のとおりです。
TestKEXT.c
HIDHack.h
HIDHack.cpp
結果として得られるカーネル拡張機能は、kextload / kextunloadプログラムによって正常にロード/アンロードされますが、実際にはキーボードイベントをインターセプトしません。私はそれを機能させるためにたくさんのことを試みましたが、エラーやその他の問題がなければ、有用なものをグーグルで検索してあなたの助けを求めることはできません。
macos - MacOSXのネットワークパケットインスペクター
ネットワークパケットインスペクターを作成しようとしています。
libpcapでこれを実行できることは知っていますが、スニファではありません。ネットワークに送信される前に、ネットワークパケットを偽造する必要があります。(ソックスサーバー経由で送信)
私はこれを行う2つの方法を見つけました:
- NKEを使用します。(ネットワークカーネル拡張)
- DYLD_INSERT_LIBRARIESを使用して、ネットワーク関数をフックするライブラリを挿入します。
どの方法が最適だと思いますか?
c - ファイルシステムの使用を傍受するkextの実装
感染したファイルの場合、ほとんどのウイルス対策ソフトウェアはファイルシステムをどのようにブロックしますか?私はすべての魔法がそれをするためにいくつかのカスタムkextにあると思います。誰かがこれに関するいくつかのトピックを私に指摘できますか?いくつかの実用的な例も素晴らしいでしょう。kext開発に関するアップルのドキュメントを読みましたが、ほとんどはハードウェアドライバーに関するものであり、必要なものが見つかりませんでした。
c++ - MacでのUSB(HID)割り込みエンドポイントの読み取りと書き込み
私はかなり特定のUSBデバイスと通信しようとしており、そのためにWindowsとMacの両方のコードを開発しています。
このデバイスは、割り込み入力と割り込み出力の2つのエンドポイントを持つHIDインターフェイス(クラス3)を備えたUSBデバイスです。デバイスの性質上、データはホストから要求された場合にのみ入力エンドポイントでデバイスから送信されます。ホストは、デバイスが入力割り込みエンドポイントで応答するデータをデバイスに送信します。デバイスへのデータの取得(書き込み)ははるかに簡単です...
Windowsのコードはかなり単純です。デバイスへのハンドルを取得してから、ReadFileまたはWriteFileのいずれかを呼び出します。明らかに、基礎となる非同期動作の多くは抽象化されています。正常に動作しているようです。
ただし、Macでは少し粘着性があります。私はいくつかのことを試しましたが、どれも完全に成功していませんが、ここに最も有望と思われる2つのことがあります...
1.)IOUSBInterfaceInterfaceを介して(USBとして)デバイスへのアクセスを試み、エンドポイントを反復処理して入力エンドポイントと出力エンドポイントを決定し、(うまくいけば)ReadPipeとWritePipeを使用して通信します。残念ながら、一度インターフェイスを開くと、戻り値(kIOReturnExclusiveAccess)で、デバイスがすでに排他的に開いていることが示されているため、インターフェイスを開くことができません。USBInterfaceOpenSeizeを呼び出すことができるように、IOUSBinterfaceInterface183を使用してみましたが、同じ戻りエラー値が返されます。
---アップデート2010年7月30日---
どうやら、Apple IOUSBHIDDriverはデバイスと早期に一致し、これがIOUSBInterfaceInterfaceを開くのを妨げている可能性があります。いくつかの掘り下げから、IOUSBHIDDriverが一致しないようにする一般的な方法は、より高いプローブスコアを持つコードレスkext(カーネル拡張)を作成することであるように思われます。これは早期に一致し、IOUSBHIDDriverがデバイスを開くのを防ぎ、理論的には、インターフェイスを開いてエンドポイントに直接読み書きできるようにする必要があります。これは問題ありませんが、ユーザーのマシンに何かを追加でインストールする必要はありません。誰かが確かな代替案を知っているなら、私はその情報に感謝するでしょう。
2.)デバイスをIOHIDDeviceInterface122(またはそれ以降)として開きます。読み取るために、データの準備ができたとき、つまり入力割り込みエンドポイントのデバイスからデータが送信されたときに呼び出される非同期ポート、イベントソース、およびコールバックメソッドを設定しました。ただし、デバイスが必要とするデータを書き込んで応答を初期化する方法が見つかりません。私は困惑しています。setReportは通常、コントロールエンドポイントに書き込みます。さらに、直接応答やブロッキングを予期しない書き込みが必要です。
私はオンラインで周りを見回して多くのことを試しましたが、どれも私に成功をもたらしていません。何かアドバイス?Apple HIDManagerコードの多くは10.5以降であり、アプリケーションは10.4でも動作する必要があるため、使用できません。
macos - WindowServerを強制終了するための低レベルのホットキーkext?
非常に単純な機能を実行する kext を作成する必要があります。キーの組み合わせが押されるたびに、kext はたまたま「WindowServer」であるプロセスを強制終了する必要があります。
問題の性質上、kext でなければなりません。システムの UI から独立している必要があるため、ハングアップした場合は、この組み合わせを押して再起動できます。
誰かが出発点を提供できますか? キー ハンドラーの作成方法が好きですか。
linux - カーネルモジュールにCPU拡張機能を実装する
カーネルモジュールに特定のCPU拡張機能を実装することに関する情報を探しています。私は関連する何かを見つけました:http://www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c実際、それは私が見つけることができる唯一のソースコードであり、さらに近いです。
基本的に、私は特定のCPU拡張機能で構築されたバイナリのみの共有オブジェクトを持っています。これは、ほとんどの命令セットを備えた少し古いCPUで実行する必要がありますが、派手な新しいものはありません。ええ、私はそれがかなり遅くなることを知っています、しかしそれはSIGILLsでクラッシュするよりはましです。
xcode - Kexts で Dylib をリンクしますか?
(IOKit) libusb と jpeglib を使用して USB ベースのフレームバッファを実装する OS X 用の kext を作成しました。これらはどちらも dylib であり、何らかの理由で XCode で適切にリンクされず、OS が kext をロードしようとしたときに依存関係が解決されません。
この全体の背景は、Samsung がセカンド モニターとして機能する LCD 額縁を製造していることです。唯一の問題は、それが DisplayLink やその他の既知のプロトコルではないことです。Windows 専用のドライバーはカスタム ヘッダーを吐き出し、各フレームは JPEG としてエンコードされ、デバイスに送信されます。私の実装では OS X でこれを行いますが、libusb はフレームバッファ デバイスであり、起動時にロードする必要があるため、libusb を使用しました。ホットプラグ検出や IOKit の USB デバイス要件よりも、ディスプレイの駆動にもっと対処したかったのです。
助けてくれてありがとう!あなたたちは素晴らしいです。
macos - launchd を使用して、OS X でカーネル拡張機能をロードおよび構成する
ソケット フィルタリング用のネットワーク カーネル拡張機能を作成しています。構成可能にするために、ユーザーランド プログラムは構成ファイルを読み取り、PF_SYSTEM
ソケットを介して情報を kext に渡します。
システムの起動時にできるだけ早くソケット フィルターを起動して実行したい場合、起動をどのように振り付けますか?
私の現在の考えは、launchd を使用して小さなユーザーランド初期化プログラムを開始することです。このプログラムはkextload
、kext を開始するために使用します。PF_SYSTEM
その後、構成ファイルを読み取り、ソケットを介して kext と通信します。仕事を終えると、すぐに終了します。
もう 1 つのオプションは、2 つのlaunchd
アイテムを用意することです。1 つは kext (を使用kextload
) 用で、もう 1 つはユーザーランド構成ファイル リーダー用です。これによりフォークは回避されますが、それ以外は同じです。いずれにlaunchd
しても、デーモン以外のユーザーランド プログラムをすばやく実行する必要があります。
ただし、launchd
作業を行って終了する迅速なタスクではなく、実際のデーモンを起動することを目的としているようです。開発者ライブラリ ドキュメントには次のように書かれています。
重要:起動後にデーモンがあまりにも早くシャットダウンすると、launchd はデーモンがクラッシュしたと判断する場合があります。この動作を継続するデーモンは一時停止され、将来のリクエストが到着したときに再び起動されない場合があります。この動作を回避するには、起動後少なくとも 10 秒間はシャットダウンしないでください。
launchd
これは、これを行う正しい方法ではないという印象を与えます。ローンチはどのように準備すればよいですか? 私の考え全体が間違った方向に進んでいますか?
(補足として、ユーザーが実行時にフィルタリング オプションを変更できるようにしたいと考えています。これは、変更が必要なときはいつでも、kext への新しい PF_SYSTEM ソケット接続を開くだけで簡単に実行できると思います。)
macos - Lion で IOAudio kext から proc_selfppid() を呼び出す
Apple の AudioReflectorDriver サンプル コードに基づく kext があります (オーディオ出力をインターセプトしてコピーを作成します)。
10.6 以下では、IOAudioEngine サブクラス内で proc_selfpid() を呼び出すと、オーディオを生成するプロセスの PID が報告されます。10.7 では、プロセスとして常に coreaudio_d が報告されます。
何が変わったのですか?Apple がこの変更を文書化した場所を知っている人はいますか? Lion で元のプロセス ID を取得する方法はありますか?
更新... Apple DTS エンジニアから次のように通知されました。
Audio HAL は Lion で完全に書き直されましたが、この変更はほぼ確実にその努力の副作用でした。これは意図的な変更ではなく、CoreAudio のより大きなアーキテクチャの変更によって引き起こされたものだと思います。厳密に言えば、proc_selfpid がオーディオ コンテキストで有用なものを返すように文書化されたことはないと思います。そのため、この情報が利用できなくなっている可能性は十分にあります。
[....]
問題は、カーネルが間違った pid を返すことではなく、オーディオが別のプロセスから来るように CoreAudio のアーキテクチャが変更されたことです。
10.7 でこの情報を取得する方法があれば、彼からの返事を待っています。
私の疑いは、書き換えによって API が変更されなかったため、文書化されていなかったということです。
c++ - 別のkextによって定義されたメソッドをオーバーライドしますか?
kextによって定義されたメソッドをオーバーライドして、独自の処理を実行し、独自の値を返す必要があるため、kextがメソッドを呼び出すたびに、メソッドは自分のメソッドにルーティングされます。ですから、私がやりたいのは、このメソッドを自分のカーネル拡張で定義してからロードすることです。問題は、メソッドを交換する方法がわからないため、代わりに私のものが呼び出されることです。
これを行う簡単な方法はありますか?すべてのカーネル拡張が同じアドレス空間で実行されるため、 VTableを介してそれを行う方法があることを私は知っています(それが唯一の方法だと思いますが、それを行う方法がわかりません)。